Submission #1159150

#TimeUsernameProblemLanguageResultExecution timeMemory
1159150alexander707070Remittance (JOI19_remittance)C++20
15 / 100
3 ms584 KiB
#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;
}

long long calc(){
	long long res=0;
	for(int i=100;i>=0;i--){
		res*=2; res+=bits[i];
	}

	return res;
}

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);
		}
	}

	assert(res==calc());

	if(bits.count()==0){
		c[n]=0;
	}else{
		int sum=0;
		for(int i=0;i<n;i++)sum+=bits[i];

		if(sum>0){
			add(n);
			for(int i=0;i<n;i++)bits[i]=bits[i]^1;
			add(0);

			for(int i=n-1;i>=0;i--){
				if(bits[i]!=bits[n+i]){
					cout<<"No\n";
					return 0;
				}

				c[n]*=2; c[n]+=bits[i];
			}
			
		}else{
			
			for(int i=max(2*n,n+50);i>=n;i--){
				c[n]*=2; c[n]+=bits[i];
			}

			if(n>50 or c[n]%((1LL<<n)-1)!=0){
				cout<<"No\n";
				return 0;
			}

			c[n]/=((1LL<<n)-1);
			c[n]*=(1LL<<n);
			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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...