제출 #1159144

#제출 시각아이디문제언어결과실행 시간메모리
1159144alexander707070송금 (JOI19_remittance)C++20
15 / 100
401 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; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]>>b[i]; s[i]=a[i]-b[i]; s[n+i]=s[i]; } 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); } } double st=clock(); while(true){ double et=clock(); if((et-st)/CLOCKS_PER_SEC==0.2)break; } if(bits.count()==0){ st=clock(); while(true){ double et=clock(); if((et-st)/CLOCKS_PER_SEC==0.2)break; } 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]; } 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...