제출 #1231342

#제출 시각아이디문제언어결과실행 시간메모리
1231342denislavColors (RMI18_colors)C++20
100 / 100
526 ms112032 KiB
# include <iostream> # include <vector> using namespace std; const int MAX=4e5+11; bool f=1; int n,m; int c[MAX]; int d[MAX]; vector<int> col[MAX]; vector<int> new_col[MAX]; vector<pair<int,int>> tree[MAX*4]; void add(int le, int ri, pair<int,int> pa, int v=1, int l=1, int r=n) { if(ri<l or r<le) return ; if(le<=l and r<=ri) { tree[v].push_back(pa); return ; } int mid=(l+r)/2; add(le,ri,pa,v*2,l,mid); add(le,ri,pa,v*2+1,mid+1,r); } struct Change { int tm; int* ptr; int last_val; }; struct dsu { int par[MAX]; int sz[MAX]; int timer; vector<Change> ve; void init() { timer=0; ve.clear(); for(int i=1;i<=n;i++) { sz[i]=1; par[i]=i; } } int root(int x) { if(par[x]==x) return x; return root(par[x]); } void unite(int u, int v) { u=root(u);v=root(v); timer++; if(u==v) return ; if(sz[u]<sz[v]) swap(u,v); ve.push_back({timer,par+v,par[v]}); ve.push_back({timer,sz+u,sz[u]}); par[v]=u; sz[u]+=sz[v]; } void undo() { timer--; while(ve.size()>0 and ve.back().tm>timer) { (*ve.back().ptr)=ve.back().last_val; ve.pop_back(); } } }dsu; void rec(int v=1, int l=1, int r=n) { for(pair<int,int> pa: tree[v]) dsu.unite(pa.first,pa.second); if(l!=r) { int mid=(l+r)/2; rec(v*2,l,mid); rec(v*2+1,mid+1,r); } else { if(new_col[l].size()>0 and col[l].size()==0) f=0; else for(int i=0;i<(int)new_col[l].size();i++) { if(dsu.root(new_col[l][i])!=dsu.root(col[l][0])) f=0; } } for(pair<int,int> pa: tree[v]) dsu.undo(); } void reset() { f=1; for(int i=1;i<=n*4;i++) tree[i].clear(); for(int i=1;i<=n;i++) { col[i].clear(); new_col[i].clear(); } } void solve() { cin>>n>>m; reset(); for(int i=1;i<=n;i++) { cin>>c[i]; col[c[i]].push_back(i); } for(int i=1;i<=n;i++) { cin>>d[i]; new_col[d[i]].push_back(i); } for(int i=1;i<=m;i++) { int u,v; cin>>u>>v; if(max(d[u],d[v])<=min(c[u],c[v])) add(max(d[u],d[v]),min(c[u],c[v]),{u,v}); } for(int i=1;i<=n;i++) { for(int j=0;j<(int)col[i].size()-1;j++) add(i,i,{col[i][j],col[i][j+1]}); } for(int i=1;i<=n;i++) { if(c[i]<d[i]) f=0; } if(!f) { cout<<0<<"\n"; return ; } dsu.init(); rec(); cout<<f<<"\n"; } int main() { ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); int t; cin>>t; while(t--) { solve(); } 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...