题解:P11393 [JOI Open 2019] 送金
VainSylphid · · 题解
upd on 2024.12.20:修正了次数上界的错误,修改了代码中的错误,感谢 rizynvu 的指正。
双倍经验:CF2038B。
观察到当
我们从
然后我们考虑需要调整多少轮。考虑我们执行一圈以后,几乎所有多余的数都被推到了一个位置上,对于其他位置,若
注意,由于
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,a[1000005],b[1000005];
int main()
{
scanf("%d",&n);
for(int i = 0;i < n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
a[i] = x - y;
if(!y)
b[i] = 1;
}
for(int i = 0;i < n * 2 + 50;i++)
{
int p = i % n,q = (i + 1) % n;
if(a[p] < 0)
continue;
int tmp = (a[p] + 1) / 2;
if(b[p])
tmp = a[p] / 2;
a[q] += tmp,a[p] -= tmp * 2;
}
for(int i = 0;i < n;i++)
if(a[i] != 0)
{
printf("No\n");
return 0;
}
printf("Yes\n");
return 0;
}