time limit per test | 2 seconds | memory limit per test | 256 megabytes |
---|
There are n integers b1, b2, …, bn written in a row. For all i from 1 to n, values ai are defined by the crows performing the following procedure:
The crow sets ai initially 0.
The crow then adds bi to ai, subtracts bi + 1, adds the bi + 2 number, and so on until the n'th number. Thus, ai = bi - bi + 1 + bi + 2 - bi + 3....
Memory gives you the values a1, a2, …, an, and he now wants you to find the initial numbers b1, b2, …, bn written in the row? Can you do it?
The first line of the input contains a single integer n (2 ≤ n ≤ 100 000) — the number of integers written in the row.
The next line contains n, the i’th of which is ai ( - 109 ≤ ai ≤ 109) — the value of the i’th number.
Print n integers corresponding to the sequence b1, b2, …, bn. It’s guaranteed that the answer is unique and fits in 32-bit integer type.
Examples
Input
5
6 -4 8 -2 3
Output
2 4 6 1 3
Input
5
3 -2 -1 5 6
Output
1 -3 4 11 6
In the first sample test, the crows report the numbers 6, - 4, 8, - 2, and 3 when he starts at indices 1, 2, 3, 4 and 5 respectively. It is easy to check that the sequence 2 4 6 1 3 satisfies the reports. For example, 6 = 2 - 4 + 6 - 1 + 3, and - 4 = 4 - 6 + 1 - 3.
In the second sample test, the sequence 1, - 3, 4, 11, 6 satisfies the reports. For example, 5 = 11 - 6 and 6 = 6.
题解:
ai=bi−bi+1+bi+2−bi+3+⋯ai+1=bi+1−bi+2+bi+3+⋯ai+ai+1=bi
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a[100100];
int main() {
int n;
scanf("%d",&n);
for(int i = 0;i<n;i++) {
scanf("%lld",&a[i]);
}
for(int i = 0;i<n-1;i++) {
if(i) printf(" ");
printf("%lld",a[i]+a[i+1]);
}
printf(" %lld\n",a[n-1]);
return 0;
}
time limit per test | 2 seconds | memory limit per test | 256 megabytes |
---|
Memory is performing a walk on the two-dimensional plane, starting at the origin. He is given a string s with his directions for motion:
An 'L' indicates he should move one unit left.
An 'R' indicates he should move one unit right.
A 'U' indicates he should move one unit up.
A 'D' indicates he should move one unit down.
But now Memory wants to end at the origin. To do this, he has a special trident. This trident can replace any character in s with any of ‘L’, ‘R’, ‘U’, or ‘D’. However, because he doesn’t want to wear out the trident, he wants to make the minimum number of edits possible. Please tell Memory what is the minimum number of changes he needs to make to produce a string that, when walked, will end at the origin, or if there is no such string.
Input
The first and only line contains the string s (1 ≤ |s| ≤ 100 000) — the instructions Memory is given.
Output
If there is a string satisfying the conditions, output a single integer — the minimum number of edits required. In case it’s not possible to change the sequence in such a way that it will bring Memory to to the origin, output -1.
Examples
Input
RRU
Output
-1
Input
UDUR
Output
1
Input
RUUR
Output
2
Note
In the first sample test, Memory is told to walk right, then right, then up. It is easy to see that it is impossible to edit these instructions to form a valid walk.
In the second sample test, Memory is told to walk up, then down, then up, then right. One possible solution is to change s to “LDUR”. This string uses 1 edit, which is the minimum possible. It also ends at the origin.
题解:
对于不同的操作,我们会发现U和D是对应的,L和R是对应的。那么我们统计在x方向移动的距离和y方西移动的距离。那么将其中的一般变为相反的方向就行。
#include <bits/stdc++.h>
using namespace std;
char str[100100];
int main() {
int x = 0,y= 0 ;
scanf("%s",str);
int len = strlen(str);
for(int i = 0;i<len;i++) {
if(str[i] == 'U') y++;
else if(str[i] == 'D') y--;
else if(str[i] == 'L') x--;
else if(str[i] == 'R') x++;
}
x = abs(x);
y = abs(y);
if((x+y)%2) printf("-1\n");
else printf("%d\n",(x+y)/2);
return 0;
}
time limit per test | 2 seconds | memory limit per test | 256 megabytes |
---|
Memory is now interested in the de-evolution of objects, specifically triangles. He starts with an equilateral triangle of side length x, and he wishes to perform operations to obtain an equilateral triangle of side length y.
In a single second, he can modify the length of a single side of the current triangle such that it remains a non-degenerate triangle (triangle of positive area). At any moment of time, the length of each side should be integer.
What is the minimum number of seconds required for Memory to obtain the equilateral triangle of side length y?
Input
The first and only line contains two integers x and y (3 ≤ y < x ≤ 100 000) — the starting and ending equilateral triangle side lengths respectively.
Output
Print a single integer — the minimum number of seconds required for Memory to obtain the equilateral triangle of side length y if he starts with the equilateral triangle of side length x.
Examples
Input
6 3
Output
4
Input
8 5
Output
3
Input
22 4
Output
6
Note
In the first sample test, Memory starts with an equilateral triangle of side length 6 and wants one of side length 3. Denote a triangle with sides a, b, and c as (a, b, c). Then, Memory can do .
In the second sample test, Memory can do .
In the third sample test, Memory can do:
题解:
将大的正三角形变为小的正三角形,保证每次的改变一个边的大小使所有的边都为整数。从大到小不太好想,但是我们从小到大。每次将三个边种的最小的边变为其余两边的和减1,当三个边都大于初始的三角形的时候,就是最后的操作。.
#include <bits/stdc++.h>
using namespace std;
int main() {
int x,y;
scanf("%d %d",&x,&y);
if(2*y > x) printf("3\n");
else if(2*y == x) printf("4\n");
else {
int a1 = y,a2 = y,a3 =y;
int num = 0;
while(a1<x || a2<x || a3< x) {
if(a1>a2) swap(a1,a2);
if(a1>a3) swap(a1,a3);
a1 = a2+a3-1;
num++;
}
printf("%d\n",num);
}
return 0;
}
time limit per test | 4 seconds | memory limit per test | 512 megabytes |
---|
There are n casinos lined in a row. If Memory plays at casino i, he has probability pi to win and move to the casino on the right (i + 1) or exit the row (if i = n), and a probability 1 - pi to lose and move to the casino on the left (i - 1) or also exit the row (if i = 1).
We say that Memory dominates on the interval i… j if he completes a walk such that,
He starts on casino i.
He never looses in casino i.
He finishes his walk by winning in casino j.
Note that Memory can still walk left of the 1-st casino and right of the casino n and that always finishes the process.
Now Memory has some requests, in one of the following forms:
1 i a b: Set .
2 l r: Print the probability that Memory will dominate on the interval l... r, i.e. compute the probability that Memory will first leave the segment l... r after winning at casino r, if she starts in casino l.
It is guaranteed that at any moment of time p is a non-decreasing sequence, i.e. pi ≤ pi + 1 for all i from 1 to n - 1.
Please help Memory by answering all his requests!
Input
The first line of the input contains two integers n and q(1 ≤ n, q ≤ 100 000), — number of casinos and number of requests respectively.
The next n lines each contain integers ai and bi (1 ≤ ai < bi ≤ 109) — is the probability pi of winning in casino i.
The next q lines each contain queries of one of the types specified above (1 ≤ a < b ≤ 109, 1 ≤ i ≤ n, 1 ≤ l ≤ r ≤ n).
It’s guaranteed that there will be at least one query of type 2, i.e. the output will be non-empty. Additionally, it is guaranteed that p forms a non-decreasing sequence at all times.
Output
Print a real number for every request of type 2 — the probability that boy will “dominate” on that interval. Your answer will be considered correct if its absolute error does not exceed 10 - 4.
Namely: let’s assume that one of your answers is a, and the corresponding answer of the jury is b. The checker program will consider your answer correct if |a - b| ≤ 10 - 4.
Example
Input
3 13
1 3
1 2
2 3
2 1 1
2 1 2
2 1 3
2 2 2
2 2 3
2 3 3
1 2 2 3
2 1 1
2 1 2
2 1 3
2 2 2
2 2 3
2 3 3
Output
0.3333333333
0.2000000000
0.1666666667
0.5000000000
0.4000000000
0.6666666667
0.3333333333
0.2500000000
0.2222222222
0.6666666667
0.5714285714
0.6666666667
题解:
给你在每个赌场都过的概率,如果通过进入下一个赌场,如果没有通过回到上一个赌场。两个操作,1是改变某个赌场通过的概率,2是询问在区间[L,R]中从L出发,到赌场R的概率,中间不得出这个区间。
我们定义 fi 表示从i开始到n的概率,那么 fi=fi−1×(1−pi)+fi+1×pi→fi−fi−1=pi×(fi+1−fi−1)
我们令 gi=fi−fi−1 ,那么 gi=pi∗(gi+gi+1)→gi=1−pipi
令 ti=1−pipi
∴g1+g1∗t1+g1∗t1∗t2+……+t1∗t1∗t2∗t3∗……∗tn−1=1
g1∗(1+t1+t1∗t2+……+t1∗t1∗t2∗t3∗……∗tn−1)=1
所以只需要维护 (1+t1+t1∗t2+……+t1∗t1∗t2∗t3∗……∗tn−1) 就行。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 101000;
struct node {
double p,sp;
}tr[maxn*6];
int n,m;
void pushup(int st) {
tr[st].p = (tr[st<<1].p * tr[st<<1|1].p);
tr[st].sp = tr[st<<1].sp + tr[st<<1|1].sp *tr[st<<1].p;
}
void build(int l,int r,int st) {
if( l == r) {
double a,b,p;
scanf("%lf %lf",&a,&b);
p = a/b;
tr[st].p = tr[st].sp = (1-p)/p;
return ;
}
int mid = (l + r) >>1;
build(l,mid,st<<1);
build(mid+1,r,st<<1|1);
pushup(st);
}
void change(int l,int r,int st,int x) {
if(l == r) {
double a,b,p ;
scanf("%lf %lf",&a,&b);
p = a/b;
tr[st].p = tr[st].sp = (1-p)/p;
return ;
}
int mid = (l+r)>>1;
if(x <= mid ) change(l,mid,st<<1,x);
else change(mid+1,r,st<<1|1,x);
pushup(st);
}
double p , sp;
void Query(int l,int r,int st,int L,int R) {
if(L == l &&R == r) {
sp += tr[st].sp * p;
p *= tr[st].p;
return ;
}
int mid = (l + r) >>1;
if(R<=mid) Query(l,mid,st<<1,L,R);
else if(L>mid) Query(mid+1,r,st<<1|1,L,R);
else {
Query(l,mid,st<<1,L,mid);
Query(mid+1,r,st<<1|1,mid+1,R);
}
}
int main() {
scanf("%d %d",&n,&m);
build(1,n,1);
int op,l,r;
while(m--) {
scanf("%d", &op);
if(op == 1) {
scanf("%d",&l);
change(1,n,1,l);
}
else {
p = 1;sp = 0;
scanf("%d %d",&l,&r);
Query(1,n,1,l,r);
double ans = 0;
if(sp < 1e15) ans = (1.0/(sp+1));
printf("%.10f\n",ans);
}
}
return 0;
}