#include<bits/stdc++.h>
#define MAXN 1000007
using namespace std;
int n;
long long a[MAXN],b[MAXN],s[2*MAXN],c[MAXN];
long long power[MAXN];
bitset<2*MAXN> bits,t;
void add(int x){
while(bits[x]==1){
bits[x]=0; x++;
}
bits[x]=1;
}
void rem(int x){
while(bits[x]==0){
bits[x]=1; x++;
if(x>2000000){
cout<<"No\n";
exit(0);
}
}
bits[x]=0;
}
bool tryrem(){
for(int i=max(2*n,n+50);i>=0;i--){
if(bits[i]==t[i])continue;
if(t[i]>bits[i])return false;
break;
}
for(int i=max(2*n,n+50);i>=0;i--){
if(t[i]==1)rem(i);
}
return true;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
power[0]=1;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
s[i]=a[i]-b[i];
s[n+i]=s[i];
power[i]=power[i-1]*2;
}
long long res=0;
for(int i=1;i<=1;i++){
for(int f=i;f<=n+i-1;f++){
res+=power[f-i]*s[f];
}
c[i-1]=res/(power[n]-1);
}
for(int i=1;i<=n;i++){
if(s[i]<=0)continue;
for(int f=30;f>=0;f--){
if((1<<f)&s[i])add(f+i-1);
}
}
for(int i=1;i<=n;i++){
if(s[i]>=0)continue;
s[i]=-s[i];
for(int f=30;f>=0;f--){
if((1<<f)&s[i])rem(f+i-1);
}
}
if(bits.count()==0){
c[n]=0;
}else{
for(int i=0;i<n;i++)t[i]=1;
t=(t<<50);
for(int i=50;i>=0;i--){
c[n]*=2;
if(tryrem())c[n]++;
t=(t>>1);
}
if(bits.count()>0){
cout<<"No\n";
return 0;
}
assert(c[0]==c[n]);
}
for(int i=n-1;i>=1;i--){
c[i]=b[i+1]-a[i+1]+2*c[i+1];
}
for(int i=1;i<=n;i++){
if(c[i]<0 or a[i]+c[i-1]-2*c[i]!=b[i]){
cout<<"No\n";
return 0;
}
}
for(int t=1;t<=20;t++){
for(int i=1;i<=n;i++){
int give=min(a[i]/2,c[i]);
a[i]-=2*give; c[i]-=give;
if(i<n)a[i+1]+=give;
else a[1]+=give;
}
}
for(int i=1;i<=n;i++){
if(c[i]!=0){
cout<<"No\n";
return 0;
}
}
cout<<"Yes\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |