QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#341211 | #4513. Slide Parade | Graphcity | 0 | 2543ms | 45136kb | C++20 | 3.6kb | 2024-02-29 16:34:23 | 2024-02-29 16:34:23 |
Judging History
answer
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rof(i,a,b) for(int i=(a);i>=(b);--i)
using namespace std;
const int Maxn=1e5,Maxk=1e6,inf=1e9;
int n,m,cnt[405][405];
struct Link{int to,nxt;} Edge[Maxk+5];
int tot,Head[Maxn+5];
inline void Add(int x,int y) {Edge[++tot]=(Link){y,Head[x]},Head[x]=tot;}
vector<int> st;
inline void dfs(int x)
{
for(int &i=Head[x];i;) {int y=Edge[i].to; i=Edge[i].nxt,dfs(y);}
st.push_back(x);
}
struct Graph
{
int s,t,vis[Maxn+5],dis[Maxn+5],maxf;
struct Node{int frm,to,nxt,w;} Edge[Maxn*2+5];
int tot=1,Head[Maxn+5],cur[Maxn+5],pr[Maxn+5];
inline void Addedge(int x,int y,int k)
{
Edge[++tot]=Node{x,y,Head[x],k},Head[x]=tot;
Edge[++tot]=Node{y,x,Head[y],0ll},Head[y]=tot;
}
inline int bfs()
{
queue<int> q; For(i,1,t) dis[i]=vis[i]=0,cur[i]=Head[i];
dis[s]=0,vis[s]=1,q.push(s);
while(!q.empty())
{
int x=q.front(); q.pop();
for(int i=Head[x];i;i=Edge[i].nxt)
{
int y=Edge[i].to;
if(Edge[i].w && !vis[y])
dis[y]=dis[x]+1,vis[y]=1,q.push(y);
}
} return vis[t];
}
inline int dfs(int x,int flow)
{
if(!flow || x==t) {maxf+=flow; return flow;}
int used=0,res=0;
for(int i=cur[x];i && used<flow;i=Edge[i].nxt)
{
int y=Edge[i].to; cur[x]=i;
if(dis[y]==dis[x]+1 && Edge[i].w)
if(res=dfs(y,min(flow-used,Edge[i].w)))
used+=res,Edge[i].w-=res,Edge[i^1].w+=res;
} return used;
}
inline void dfs(int x)
{
for(int i=Head[x];i;i=Edge[i].nxt) if(!Edge[i].w)
{
int y=Edge[i].to; if(y==s || y==t || vis[y]) continue;
vis[y]=1,pr[y]=x,dfs(y);
}
}
inline int Work(int x)
{
For(i,1,t) vis[i]=0; vis[x]=1,dfs(x);
for(int i=Head[x];i;i=Edge[i].nxt) if(Edge[i].w)
{
int y=Edge[i].to; if(y==s || y==t) continue;
if(!vis[y]) return 0; cnt[x][y]++;
for(int k=y;k!=x;k=pr[k])
{int a=pr[k],b=k; if(a>b) swap(a,b); cnt[a][b]++;}
} return 1;
}
inline void Solve()
{
For(x,1,n) for(int i=Head[x];i;i=Edge[i].nxt)
{
int y=Edge[i].to; if(y==s || y==t) continue;
if(!Edge[i].w) cnt[x][y]=m-cnt[x][y];
while(cnt[x][y]--) Add(y-n,x);
}
}
inline void Clear() {For(i,1,t) Head[i]=0; tot=1;}
} G;
inline void Clear()
{
G.Clear(); For(i,1,n) Head[i]=0;
For(i,1,n*2) For(j,1,n*2) cnt[i][j]=0;
tot=0,vector<int>().swap(st);
}
inline void Solve(int cid)
{
cin>>n>>m; G.s=n*2+1,G.t=n*2+2,G.maxf=0;
For(i,1,n) G.Addedge(G.s,i,1),G.Addedge(i+n,G.t,1);
For(i,1,m) {int a,b; cin>>a>>b; G.Addedge(b,a+n,1);}
while(G.bfs()) G.dfs(G.s,inf);
if(G.maxf!=n) {printf("Case #%d: IMPOSSIBLE\n",cid); Clear(); return;}
if(cid==25)
{
for(int i=G.Head[4];i;i=G.Edge[i].nxt)
{
int y=G.Edge[i].to;
if(y==n+3) assert(G.Edge[i].w);
}
}
For(i,1,n) if(!G.Work(i)) {printf("Case #%d: IMPOSSIBLE\n",cid); Clear(); return;}
G.Solve(),dfs(1),reverse(st.begin(),st.end());
printf("Case #%d: %d\n",cid,int(st.size()));
for(auto i:st) printf("%d ",i); printf("\n"),Clear();
}
int main()
{
// freopen("1.in","r",stdin);
int T,cid=0; cin>>T;
while(T--) Solve(++cid);
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Runtime Error
input:
100 5 8 1 2 1 3 1 4 1 5 2 1 3 1 4 1 5 1 5 10 1 3 1 4 2 3 2 5 3 1 3 4 3 5 4 2 5 1 5 3 5 10 1 4 2 3 2 5 3 1 3 5 4 2 4 3 4 5 5 1 5 2 3 6 1 2 1 3 2 1 2 3 3 1 3 2 5 10 1 2 1 5 2 3 2 4 3 1 4 3 4 5 5 2 5 3 5 4 4 10 1 2 1 3 1 4 2 1 2 3 2 4 3 1 3 4 4 2 4 3 5 10 1 2 1 3 2 1 2 4 3 1 3 5 4 2 4 5 5 3 5 4 5 10 1 ...
output:
Case #1: IMPOSSIBLE Case #2: 51 1 4 2 5 3 5 3 5 1 4 2 5 1 4 2 5 1 4 2 5 1 4 2 5 1 4 2 3 5 1 4 2 3 5 1 3 5 1 3 4 2 3 4 2 3 4 2 3 1 3 1 Case #3: 51 1 4 5 2 5 2 5 2 3 5 2 3 5 2 3 5 2 3 1 4 5 2 3 1 4 5 1 4 5 1 4 5 1 4 3 1 4 3 1 4 2 3 1 4 2 3 1 4 2 3 1 Case #4: 19 1 3 2 3 2 3 2 3 1 3 1 3 1 2 1 2 1 2 1 ...
result:
Test #2:
score: 0
Wrong Answer
time: 2543ms
memory: 45136kb
input:
100 199 4980 1 95 1 96 1 105 1 124 1 130 1 131 1 135 1 137 1 139 1 140 1 141 1 147 1 155 1 172 1 174 1 179 1 183 1 188 1 193 1 196 1 197 2 3 2 5 2 13 2 14 2 17 2 20 2 24 2 26 2 30 2 41 2 44 2 45 2 52 2 56 2 67 2 70 2 71 2 74 2 78 2 84 2 85 2 90 2 92 2 93 2 97 2 107 2 111 2 113 2 122 2 124 2 128 2 13...
output:
Case #1: IMPOSSIBLE Case #2: IMPOSSIBLE Case #3: 1000001 1 193 195 197 200 169 196 195 197 200 169 196 195 197 200 169 196 195 197 200 169 196 195 197 200 169 196 195 197 200 169 196 195 197 200 169 196 195 197 200 169 196 195 197 200 169 196 195 197 200 169 196 195 197 200 169 196 195 197 200 169 1...
result:
wrong answer the slide from 3 to 4 hasn't be used (test case 27)