codeforces 370 Div2

19679 단어
A. Memory and Crow
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?
Input
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.
Output
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
Note
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 -3 bi+1 +bi +2 -3 bi +3 + -ai +1 =bi +1 -3 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
"
,a[n-1]); return 0; }

B. Memory and Trident
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
"
); else printf("%d
"
,(x+y)/2); return 0; }

C. Memory and De-Evolution
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
"
); else if(2*y == x) printf("4
"
); 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
"
,num); } return 0; }

E. Memory and Casinos
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까지 갈 확률을 묻는 것이다. 중간에 이 구간을 알 수 없다.우리는 i에서 n까지의 확률을 표시하기 위해fi=fi-3을 정의한다.×(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 ?t2+......+t1 ?t1 ∴
g1∗(1+t1+t1∔t2+...+t1∔t2∔t3∔...∔t1;1)=1이므로 유지보수(1+t1+t1?t2+...+t1?t2+...+t1∭t2;t3?...)하면 됩니다.
#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
"
,ans); } } return 0; }

좋은 웹페이지 즐겨찾기