Submission #620030

#TimeUsernameProblemLanguageResultExecution timeMemory
620030APROHACKCrossing (JOI21_crossing)C++14
49 / 100
7095 ms25140 KiB
#include <bits/stdc++.h> #define ll long long #define ff first #define ss second #define pb push_back using namespace std; string a, b, c, x; vector<string>strings; set<string>st; ll n, q; struct crossing { int dd, ht, mid; char toProp; bool faltaprop; bool allJ, allO, allI, iscorrect; crossing *L, *R; crossing(){} crossing(int l, int r){ dd = l, ht = r; mid = (dd+ht)/2; if(l!=r){ L = new crossing(l, mid); R = new crossing(mid+1, r); allJ = L->allJ && R->allJ; allO = L->allO && R->allO; allI = L->allI && R->allI; iscorrect = L->iscorrect && R->iscorrect; }else{ allJ = a[dd] == 'J'; allO = a[dd] == 'O'; allI = a[dd] == 'I'; if(a[dd]==x[dd])iscorrect = true; } } void propagate(){ if(!faltaprop)return; L->insert(dd, mid, toProp); R->insert(mid+1, ht, toProp); iscorrect = L->iscorrect && R->iscorrect; faltaprop=false; } void insert(int l, int r, char cual){ // cout << dd << " " << ht << " " << l << " " << r << endl; if(dd == l && r==ht ){ if(cual == 'J' && allJ)iscorrect = true; else if(cual == 'O'&&allO)iscorrect=true; else if(cual == 'I' && allI)iscorrect = true; else iscorrect=false; //no hace falta propagar lo que hay aca toProp = cual; faltaprop = true; return ; } propagate(); if(r<=mid)L->insert(l, r, cual); else if(mid<l)R->insert(l, r, cual); else { L->insert(l, mid, cual); R->insert(mid+1, r, cual); } iscorrect = L->iscorrect && R->iscorrect; } }; bool join(int a, int b){ string nueva=""; //cout << a << " " << b << endl; for(int i = 0 ; i < n ; i++){ if(strings[a][i]==strings[b][i]){ nueva+=strings[a][i]; }else { if((strings[a][i]=='J' && strings[b][i]=='O' )|| (strings[b][i]=='J' && strings[a][i]=='O'))nueva+="I"; else if((strings[a][i]=='I' && strings[b][i]=='O') || (strings[b][i]=='I' && strings[a][i]=='O'))nueva+="J"; else if((strings[a][i]=='I' && strings[b][i]=='J') || (strings[b][i]=='I' && strings[a][i]=='J'))nueva+="O"; } } if(st.find(nueva)==st.end()){ //cout << nueva << endl; st.insert(nueva); strings.pb(nueva); }else{ return false; } return true; } void calculateString(){ bool ans = true; while(ans){ ans = false; int gen = strings.size(); for(int i = 0 ; i < gen-1; i++){ for(int j = i+1 ; j < gen ; j++){ if(join(i, j))ans = true; } } } } void querys(){ cin>>q; cin>>x; if(st.find(x)!=st.end())cout<<"Yes\n"; else cout << "No\n"; int l, r; char c; for(int i = 0 ;i < q ; i++){ cin>>l>>r>>c; for(int i = l-1 ; i <= r-1 ; i++){ x[i]=c; } //cout << "ask "<<x<<endl; if(st.find(x)!=st.end())cout<<"Yes\n"; else cout << "No\n"; } } crossing *seg; bool askforX(){ seg = new crossing(0, n-1); return seg->iscorrect; } void input(){ //cin.tie(0); //cout.tie(0); //ios_base::sync_with_stdio(false); cin>>n; cin>>a>>b>>c; strings.pb(a); strings.pb(b); strings.pb(c); st.insert(a); st.insert(b); st.insert(c); if(st.size()>=2){ calculateString(); querys(); }else{ cin>>q; cin>>x; if(askforX())cout << "Yes" << endl; else cout << "No" << endl; ll l, r; char value; for(int i = 0 ; i < q ; i++){ cin>>l>>r>>value; seg->insert(l-1, r-1, value); if(seg->iscorrect)cout<<"Yes" << endl; else cout << "No" << endl; } } } int main(){ input(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...