Submission #307546

#TimeUsernameProblemLanguageResultExecution timeMemory
307546bigDuckColors (RMI18_colors)C++14
100 / 100
879 ms105920 KiB
#include<bits/stdc++.h> using namespace std; #define INIT ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); #define mp make_pair #define pb push_back #define ft first #define sc second #define ll long long #define pii pair<int, int> #define count_bits __builtin_popcount //#define int ll int ts, n, m, k, a[150010], b[150010], q, l, r; vector<int> oa[150010], ob[150010]; struct query{ int l, r, u, v; }; vector<query> seg[600010]; struct DSU{ int ptr[150010], sz[150010]; bool mrk[150010]; }; DSU dsu; struct ch{ int u, v, t; }; stack<ch> st; int find_root(int x){ int cr=x; while(dsu.ptr[cr]!=cr){cr=dsu.ptr[cr];}return cr; } void unite(int u, int v, int t){ int ru=find_root(u), rv=find_root(v); if(ru==rv){return;} if(dsu.sz[ru]>=dsu.sz[rv]){ dsu.ptr[rv]=ru; dsu.sz[ru]+=dsu.sz[rv]; ch c; c.u=ru; c.v=rv; c.t=t; st.push(c); } else{ dsu.ptr[ru]=rv; dsu.sz[rv]+=dsu.sz[ru]; ch c; c.u=rv; c.v=ru; c.t=t; st.push(c); } } void separ(int u, int v){ dsu.ptr[v]=v; dsu.sz[u]-=dsu.sz[v]; return; } void roll_back(int t){ while((!st.empty()) && ( ((st.top()).t)>=t)){ auto c=st.top(); st.pop(); separ(c.u, c.v); } return; } void ins(int nod, query q0, int tl, int tr){ if((tl>q0.r) || (tr<q0.l)){return;} if( (tl>=q0.l) && (tr<=q0.r) ){ seg[nod].pb(q0); return; } if(tl==tr){return;} int med=(tl+tr)/2; ins(nod*2, q0, tl, med); ins(2*nod+1, q0, med+1, tr); } void clean(){ for(int i=1; i<=4*n; i++){ seg[i].clear(); } } bool rec(int nod, int tl, int tr, int t){ bool res=true; for(auto q0:seg[nod]){ unite(q0.u, q0.v, t); } if(tl==tr){ for(auto u:oa[tl]){ int rt=find_root(u); dsu.mrk[rt]=true; } for(auto u:ob[tl]){ int rt=find_root(u); if(!dsu.mrk[rt]){res=false; break;} } for(auto u:oa[tl]){ int rt=find_root(u); dsu.mrk[rt]=false; } roll_back(t); return res; } int med=(tl+tr)/2; bool r1=rec(nod*2, tl, med, t+1); bool r2=rec(nod*2+1, med+1, tr, t+1); roll_back(t); return (r1&&r2); } int32_t main(){ INIT cin>>ts; while(ts--){ cin>>n>>m; for(int i=1; i<=n; i++){dsu.ptr[i]=i; dsu.sz[i]=1; dsu.mrk[i]=false;} for(int i=1; i<=n; i++){cin>>a[i]; oa[a[i] ].pb(i);} for(int i=1; i<=n; i++){cin>>b[i]; ob[b[i] ].pb(i);} for(int i=1; i<=m; i++){ int u, v; cin>>u>>v; query q0; q0.u=u; q0.v=v; q0.l=max(b[u], b[v]); q0.r=min(a[u], a[v]); ins(1, q0, 1, n); } bool res=rec(1, 1, n, 1); for(int i=1; i<=n;i++){ if(a[i]<b[i]){res=false; break;} } cout<<res<<"\n"; for(int i=1; i<=n; i++){ oa[i].clear(); ob[i].clear();} clean(); } 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...