QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#878614 | #9677. 基础博弈练习题 | DaiRuiChen007 | 0 | 81ms | 143868kb | C++17 | 2.2kb | 2025-02-01 16:20:03 | 2025-02-01 16:20:04 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+5,inf=1e9;
int n,m,q,a[MAXN],b[MAXN];
int dcnt,dfn[MAXN],low[MAXN],tp,stk[MAXN],scnt,bl[MAXN],sz[MAXN];
bool ins[MAXN];
vector <int> G[MAXN],E[MAXN],V[MAXN];
int ord[MAXN],deg[MAXN];
void tarjan(int u) {
dfn[u]=low[u]=++dcnt,stk[++tp]=u,ins[u]=true;
for(int v:G[u]) {
if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
else if(ins[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]) {
for(++scnt;ins[u];--tp) bl[stk[tp]]=scnt,ins[stk[tp]]=false,V[scnt].push_back(stk[tp]);
}
}
int f[MAXN],g[MAXN],id[MAXN],d[MAXN];
vector <int> qy[MAXN];
int pr[MAXN],sf[MAXN],las[MAXN];
bool vis[MAXN];
signed main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>m>>q;
memset(id,0x3f,sizeof(id));
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=q;++i) cin>>b[i],id[b[i]]=min(id[b[i]],i);
for(int i=1,u,v;i<=m;++i) cin>>u>>v,G[u].push_back(v);
for(int i=1;i<=n;++i) if(!dfn[i]) tarjan(i);
for(int i=1;i<=n;++i) for(int j:G[i]) if(bl[i]!=bl[j]) E[bl[i]].push_back(bl[j]),++deg[bl[j]];
queue <int> Q;
for(int i=1;i<=scnt;++i) if(!deg[i]) Q.push(i);
for(int i=1;i<=scnt;++i) {
int u=ord[i]=Q.front(); Q.pop();
for(int v:E[u]) if(!--deg[v]) Q.push(v);
}
for(int u=1;u<=scnt;++u) {
int t=inf;
for(int x:V[u]) t=min(t,id[a[x]]);
qy[t].push_back(u);
}
for(int i=q,hd=0;i>=1;--i) {
sf[i]=hd,pr[hd]=i,hd=i;
if(las[b[i]]) {
int x=las[b[i]];
sf[pr[x]]=sf[x],pr[sf[x]]=pr[x];
}
las[b[i]]=i;
for(int u:qy[i]) {
for(int x:V[u]) vis[a[x]]=true;
d[u]=inf;
for(int t=hd;t;t=sf[t]) if(!vis[b[t]]) {
d[u]=t; break;
}
for(int x:V[u]) vis[a[x]]=false;
}
}
for(int o=scnt;o>=1;--o) {
int u=ord[o]; f[u]=g[u]=inf;
for(int v:E[u]) f[u]=min({f[u],f[v],g[v]});
int t=inf;
for(int x:V[u]) t=min(t,id[a[x]]);
if(t+1>=f[u]) continue;
if(V[u].size()==1) g[u]=t;
else {
int h=min(f[u]-1,d[u]);
if((h-t)%2==0) ++t;
g[u]=f[u]=t;
}
// for(int i:t[u]) if(i+1<f[u]) {
// g[u]=i;
// if(sz[u]>1) f[u]=i;
// }
}
for(int i=1;i<=n;++i) cout<<(f[bl[i]]==inf?-1:f[bl[i]]-1)<<" \n"[i==n];
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 0
Runtime Error
Test #1:
score: 0
Runtime Error
input:
83 93 13 8 9 10 7 7 7 6 3 1 10 6 2 5 7 1 3 4 2 1 10 7 4 8 9 2 2 1 9 2 5 1 7 8 6 1 9 9 10 4 1 2 9 2 3 4 2 9 10 8 1 4 1 8 4 1 4 4 7 4 8 2 9 2 5 2 2 3 3 8 5 2 9 3 10 8 8 1 6 6 1 6 7 10 7 5 10 3 2 2 7 4 8 7 6 6 5 56 36 33 41 32 62 37 7 6 53 41 13 9 36 44 77 38 62 76 16 72 5 40 13 55 60 5 78 72 45 13 44 ...
output:
result:
Subtask #2:
score: 0
Skipped
Dependency #1:
0%
Subtask #3:
score: 0
Runtime Error
Test #6:
score: 30
Accepted
time: 81ms
memory: 141720kb
input:
100000 355071 10000 5 7 4 7 4 1 10 5 9 4 9 4 3 10 5 4 9 1 7 10 1 6 10 3 10 9 8 4 6 3 10 8 6 8 3 5 10 9 7 7 1 3 8 8 6 2 8 4 2 9 1 10 3 6 3 8 9 10 5 7 3 2 1 5 7 4 3 4 6 4 2 7 2 5 5 6 4 6 7 4 4 6 4 2 3 9 9 9 10 8 1 6 7 2 9 8 2 3 1 6 9 4 10 3 10 1 2 3 3 4 1 1 1 5 8 6 8 3 1 6 2 9 5 9 4 7 2 10 7 5 2 2 7 4...
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
result:
ok 100000 numbers
Test #7:
score: 30
Accepted
time: 75ms
memory: 143868kb
input:
100000 300561 10000 6 3 6 10 10 9 7 3 6 4 5 4 1 2 3 2 10 6 3 7 8 7 10 5 9 10 2 3 9 5 6 10 9 1 4 9 1 10 7 2 9 10 5 5 9 3 5 5 5 9 9 5 1 7 5 10 8 6 8 4 5 9 2 10 1 6 4 10 10 9 2 1 10 1 9 5 3 2 9 3 4 8 10 7 5 2 4 5 3 6 9 7 5 10 2 7 4 7 10 8 1 7 7 1 7 7 6 6 7 1 5 4 6 2 1 8 6 10 6 10 1 5 8 4 6 2 10 6 10 4 ...
output:
0 4 0 0 3 0 0 4 0 0 0 0 0 0 0 0 0 0 1 0 0 1 7 0 1 2 0 0 0 0 4 0 0 1 0 0 0 2 0 0 0 3 0 0 1 0 0 0 3 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 1 0 9 0 0 0 2 0 3 1 0 2 1 0 0 0 2 0 0 0 0 0 0 3 0 0 0 0 0 2 2 0 0 1 0 0 0 0 0 1 0 0 1 0 2 0 6 0 0 1 5 0 0 3 0 0 1 2 0 2 3 0 0 2 0 1 1 9 0 2 5 2 0 2 1 3 1 6 4 0 0 1 0 2 1 0 ...
result:
ok 100000 numbers
Test #8:
score: 0
Runtime Error
input:
500000 1770902 50000 4 7 2 3 6 10 8 2 2 6 2 3 3 7 3 1 5 2 1 10 2 6 3 4 2 8 10 6 6 10 9 3 3 2 9 10 4 5 3 9 7 10 4 3 6 6 4 9 4 4 4 1 9 5 6 10 3 7 5 8 10 1 6 5 1 7 9 10 2 4 6 9 6 2 2 8 4 7 9 1 9 4 6 4 6 3 9 2 2 1 1 1 8 3 10 10 2 2 5 15 20 18 17 15 12 11 11 11 11 12 13 19 18 20 15 11 11 20 10 14 13 14 1...
output:
result:
Subtask #4:
score: 0
Skipped
Dependency #3:
0%
Subtask #5:
score: 0
Skipped
Dependency #4:
0%