제출 #1159148

#제출 시각아이디문제언어결과실행 시간메모리
1159148alexander707070송금 (JOI19_remittance)C++20
0 / 100
0 ms328 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; } 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; } 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); } } for(int i=1;i<=1;i++){ long long res=0; for(int f=i;f<=n+i-1;f++){ res+=power[f-i]*s[f]; } c[i-1]=res/(power[n]-1); } 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]; } assert(c[0]==c[n]); }else{ for(int i=2*n-1;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...