Submission #1159158

#TimeUsernameProblemLanguageResultExecution timeMemory
1159158alexander707070Remittance (JOI19_remittance)C++20
100 / 100
579 ms48260 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; } 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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...