# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
307491 |
2020-09-28T10:57:45 Z |
bigDuck |
Colors (RMI18_colors) |
C++14 |
|
3000 ms |
40132 KB |
#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(q0.l>q0.r){return;}
if( (tl==q0.l) && (tr==q0.r) ){
seg[nod].pb(q0); return;
}
int med=(tl+tr)/2;
query q1=q0; q1.r=min(q1.r,med);
ins(nod*2, q1, tl, med);
q1.r=q0.r; q1.l=max(med+1, q0.l);
ins(2*nod+1, q1, med+1, tr);
}
void clean(int nod, int tl , int tr){
int med=(tl+tr)/2;
seg[nod].clear(); if(tl==tr){return;} clean(nod*2, tl, med); clean(nod*2+1, med+1, tr);
}
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){
if(ob[tl].size()==0){return true;}
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();}
}
return 0;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
3090 ms |
30456 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2202 ms |
40132 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
3066 ms |
27912 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
3066 ms |
27912 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
3090 ms |
30456 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
3079 ms |
28868 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
812 ms |
30140 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
3090 ms |
30456 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |