QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#874024#1814. Kingdoms and QuarantineqwqUwU_TL 1ms4224kbC++143.4kb2025-01-27 12:01:552025-01-27 12:01:56

Judging History

你现在查看的是最新测评结果

  • [2025-01-27 12:01:56]
  • 评测
  • 测评结果:TL
  • 用时:1ms
  • 内存:4224kb
  • [2025-01-27 12:01:55]
  • 提交

answer

#include<bits/stdc++.h>
#define pb push_back
#define P make_pair
#define fi first
#define se second
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
using namespace std;
typedef long long ll; 
typedef unsigned long long ull;
typedef pair<int,int> pii;
inline ll read(){
	ll x=0,f=1,c=getchar();
	while(c<'0'||c>'9')f=(c=='-'?-1:1),c=getchar();
	while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x*f;
}
const int N=6010;
int n1,n2,m;
pii eg[N];
bool D[N],vis[N];
namespace sub1{
	int d[N];
	struct Node{int to,nxt,fl,c;}edge[N<<3];
	int head[N],tt=1;
	inline void ad(int u,int v,int w,int c){
		edge[++tt]={v,head[u],w,c};head[u]=tt;
		edge[++tt]={u,head[v],0,-c};head[v]=tt;
	}
	int dis[N],pre[N],incf[N];
	inline bool spfa(int s,int t){
		rep(i,1,n1+n2+4)dis[i]=1<<30,pre[i]=0,incf[i]=0;
		queue<int>q;q.push(s);
		dis[s]=0,incf[s]=1<<30;
		while(!q.empty()){
			int u=q.front();q.pop();
			for(int i=head[u];i;i=edge[i].nxt)if(edge[i].fl){
				int v=edge[i].to;
				if(dis[v]>dis[u]+edge[i].c){
					dis[v]=dis[u]+edge[i].c;
					incf[v]=min(incf[u],edge[i].fl);
					pre[v]=i;
					q.push(v);
				}
			}
		}
		return pre[t];
	}
	inline void MCMF(int s,int t,bool fl=0){
		while(spfa(s,t)){
			if(fl&&dis[t]>0)return;
			for(int u=t;u!=s;){
				int i=pre[u];
				edge[i].fl-=incf[t];
				edge[i^1].fl+=incf[t];
				u=edge[i^1].to;
			}
		}
	}
	inline void solve(){
		rep(i,1,m){
			int x=eg[i].fi,y=eg[i].se;
			if(D[x]^D[y])swap(x,y);
			--d[x],++d[y];
			ad(y,x,1,1);
		}
		int s=n1+n2+1,t=n1+n2+2,S=n1+n2+3,T=n1+n2+4;
		rep(i,1,n1)ad(s,i,1,0);
		rep(i,n1+1,n1+n2)ad(i,t,1,0);
		rep(i,1,n1+n2){
			if(d[i]>0)ad(S,i,d[i],0);
			if(d[i]<0)ad(i,T,-d[i],0);
		}
		ad(t,s,1<<30,0);
		MCMF(S,T);
		edge[tt].fl=edge[tt-1].fl=0;
		MCMF(s,t,1);
		int cnt=0;
		rep(i,1,m)if(edge[i<<1].fl)vis[i]=1,++cnt;
		printf("%d\n",cnt);
	}
}
vector<pii>G[N];
bool flag;
int dfn[N],F[N],ct;
bool inq[N];
vector<int>vec,ve[N];
inline void dfs(int u,int fa){
	if(flag)return;
	inq[u]=1;dfn[u]=1;
	F[u]=fa;
	for(pii A:G[u])if(vis[A.se]){
		int v=A.fi;
		if(!dfn[v])dfs(v,A.se);
		else if(inq[v]){
			if(flag)return;
			vector<int>&B=ve[++ct];
			flag=1;
			if(D[u]==D[v])B.pb(A.se);
			for(int w=u;w!=v;w=eg[F[w]].fi)B.pb(F[w]);
			if(D[u]!=D[v])B.pb(A.se);
			return ;
		}
	}
	inq[u]=0;
}
inline void dfs(int u){
	for(pii A:G[u])if(vis[A.se]){
		int v=A.fi;
		ve[ct].pb(A.se);
		vis[A.se]=0;
		dfs(v);
		return;
	}
}
int main() {
	//freopen("data.in", "r", stdin);
	//freopen("myans.out","w",stdout);
	n1=read(),n2=read(),m=read();
	rep(i,1,m){
		int x=read(),y=read();
		eg[i]=P(x,y);
		D[x]^=1,D[y]^=1;
	}
	sub1::solve();
	rep(i,1,m)if(vis[i]){
		int &x=eg[i].fi,&y=eg[i].se;
		if(D[x]^D[y])swap(y,x);
		G[x].pb(P(y,i));
	}
	while(1){
		flag=0;
		rep(i,1,n1+n2)dfn[i]=inq[i]=F[i]=0;
		rep(i,1,n1+n2)if(!dfn[i])dfs(i,0);
		if(!flag)break;
		for(int i:ve[ct])vis[i]=0;
	}
	//cerr<<ct<<endl;
	while(1){
		static int in[N],out[N];
		rep(i,1,n1+n2)in[i]=out[i]=0;
		flag=1;
		rep(i,1,n1+n2)for(pii A:G[i])if(vis[A.se]){
			++out[i];
			flag=0,in[A.fi]=1;
		}
		if(flag)break;
		rep(p,1,n1+n2)if(!in[p]){++ct;dfs(p);break;}
	}
	//cerr<<ct<<endl;
	rep(i,1,ct){
		int m=ve[i].size();
		for(int j=0;j<m;j+=2)printf("%d ",ve[i][j]);
		for(int j=1;j<m;j+=2)printf("%d ",ve[i][j]);
	}
	return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 4224kb

input:

2 3 5
1 3
1 4
1 5
2 4
2 5

output:

3
4 1 2 

result:

ok accepted

Test #2:

score: 0
Accepted
time: 0ms
memory: 4096kb

input:

1 2 2
1 2
1 3

output:

0

result:

ok accepted

Test #3:

score: 0
Accepted
time: 1ms
memory: 4096kb

input:

4 3 7
1 5
2 5
2 6
2 7
3 6
4 5
4 7

output:

5
2 7 4 6 1 

result:

ok accepted

Test #4:

score: -100
Time Limit Exceeded

input:

10 10 20
2 11
2 17
1 12
8 14
9 15
10 12
9 13
1 18
3 15
2 14
2 16
7 13
8 15
8 20
9 12
6 13
8 16
6 11
4 20
6 16

output:


result: