Submission #419775

#TimeUsernameProblemLanguageResultExecution timeMemory
419775kshitij_sodaniCrossing (JOI21_crossing)C++14
100 / 100
519 ms31896 KiB
//#pragma GCC optimize("Ofast,unroll-loops") #include <bits/stdc++.h> using namespace std; typedef long long llo; #define mp make_pair #define pb push_back #define a first #define b second #define endl '\n' llo aa[200001]; llo bb[200001]; llo cc[200001]; llo dd[200001]; llo ac=2329923; const llo mod=1e9+7; llo bc=54959459; const llo mod2=1e9+7; llo pre[200001]; llo pre2[200001]; pair<llo,llo> tree[200001*4]; pair<llo,llo> tree2[200001*4]; llo lazy[4*200001]; void push(llo no,llo l,llo r){ if(lazy[no]>0){ // cout<<l<<".."<<r<<".."<<lazy[no]<<".."<<tree2[no].a<<",,"<<tree2[no].b<<endl; tree[no].a=(tree2[no].a*lazy[no])%mod; tree[no].b=(tree2[no].b*lazy[no])%mod2; //cout<<tree[no].a<<"::"<<tree[no].b<<endl; if(l<r){ lazy[no*2+1]=lazy[no]; lazy[no*2+2]=lazy[no]; } lazy[no]=0; } } void build(llo no,llo l,llo r){ if(l==r){ tree[no]={((dd[l]+1)*pre[l])%mod,((dd[l]+1)*pre2[l])%mod2}; tree2[no]={pre[l],pre2[l]}; } else{ llo mid=(l+r)/2; build(no*2+1,l,mid); build(no*2+2,mid+1,r); tree[no].a=(tree[no*2+1].a+tree[no*2+2].a)%mod; tree[no].b=(tree[no*2+1].b+tree[no*2+2].b)%mod2; tree2[no].a=(tree2[no*2+1].a+tree2[no*2+2].a)%mod; tree2[no].b=(tree2[no*2+1].b+tree2[no*2+2].b)%mod2; } } void update(llo no,llo l,llo r,llo aa,llo bb,llo i){ push(no,l,r); if(r<aa or l>bb){ return; } if(aa<=l and r<=bb){ //cout<<aa<<":"<<bb<<endl; lazy[no]=i+1; push(no,l,r); } else{ llo mid=(l+r)/2; update(no*2+1,l,mid,aa,bb,i); update(no*2+2,mid+1,r,aa,bb,i); tree[no].a=(tree[no*2+1].a+tree[no*2+2].a)%mod; tree[no].b=(tree[no*2+1].b+tree[no*2+2].b)%mod2; } } /*void solve(int no,int l,int r){ //solve(n,l,r); cout<<l<<":"<<r<<":"<<tree[no].a<<endl; if(l==r){ } else{ llo mid=(l+r)/2; solve(no*2+1,l,mid); solve(no*2+2,mid+1,r); tree[no].a=(tree[no*2+1].a+tree[no*2+2].a)%mod; tree[no].b=(tree[no*2+1].b+tree[no*2+2].b)%mod2; } }*/ int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); llo n; cin>>n; pre[0]=1; pre2[0]=1; for(llo i=1;i<=n;i++){ pre[i]=(pre[i-1]*ac)%mod; pre2[i]=(pre2[i-1]*bc)%mod2; } /*llo kk=0; for(llo i=0;i<n;i++){ kk=(kk+pre2[i])%mod2; } cout<<kk<<endl;*/ string aa2,bb2,cc2; cin>>aa2>>bb2>>cc2; for(llo i=0;i<n;i++){ char s=aa2[i]; if(s=='J'){ aa[i]=0; } else if(s=='O'){ aa[i]=1; } else{ aa[i]=2; } } for(llo i=0;i<n;i++){ char s=cc2[i]; if(s=='J'){ cc[i]=0; } else if(s=='O'){ cc[i]=1; } else{ cc[i]=2; } } for(llo i=0;i<n;i++){ char s=bb2[i]; if(s=='J'){ bb[i]=0; } else if(s=='O'){ bb[i]=1; } else{ bb[i]=2; } } //for(llo i=0;i<3;i++){ //for(llo j=0;j<3;j++){ // for(llo k=0;k<3;k++){ /*if(i==0 and j==0 and k==0){ continue; }*/ set<vector<llo>> ss; ss.insert({1,0,0}); ss.insert({0,1,0}); ss.insert({0,0,1}); while(ss.size()){ vector<vector<llo>> tt; for(auto jj:ss){ tt.pb(jj); } for(auto ii:tt){ for(auto jj:tt){ vector<llo> kk; for(llo k=0;k<3;k++){ kk.pb((-ii[k]-jj[k]+9)%3); } if(ss.find(kk)==ss.end()){ ss.insert(kk); break; } } if(tt.size()<ss.size()){ break; } } if(tt.size()==ss.size()){ break; } } /*for(auto j:ss){ for(auto i:j){ cout<<i<<","; } cout<<endl; }*/ //} //} //} set<pair<llo,llo>> xx; for(auto j:ss){ llo su=0; llo su2=0; for(llo i=0;i<n;i++){ llo cur=(aa[i]*j[0]+bb[i]*j[1]+cc[i]*j[2])%3; su=(su+(pre[i])*(cur+1))%mod; su2=(su2+(pre2[i])*(cur+1))%mod2; //cout<<cur<<","; } //cout<<endl; xx.insert({su,su2}); } llo q; cin>>q; string dd2; cin>>dd2; for(llo i=0;i<n;i++){ char s=dd2[i]; if(s=='J'){ dd[i]=0; } else if(s=='O'){ dd[i]=1; } else{ dd[i]=2; } //cout<<dd[i]<<":"; } //cout<<endl; build(0,0,n-1); for(llo i=0;i<=q;i++){ if(xx.find(tree[0])==xx.end()){ cout<<"No"<<endl; } else{ cout<<"Yes"<<endl; } if(i<q){ llo l,r; char s; cin>>l>>r>>s; l--; r--; llo cur=0; if(s=='J'){ cur=0; } else if(s=='O'){ cur=1; } else{ cur=2; } update(0,0,n-1,l,r,cur); } //solve(0,0,n-1); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...