模拟网络流求调
查看原帖
模拟网络流求调
515129
TLEWA楼主2025/1/21 12:07

/kel,调了我一整个模拟赛

#include<bits/stdc++.h>

using namespace std;

const int N=20,K=100005;

/*
5e8,会赢吗 
怎么还卡空间的 
*/

int n,k,cnt;
int arr[N],tot[N],G[K*N][N],id[K*N][N];
int first[N][N],frm[K];

struct Node {
	int lst,nxt,id;
}List[N*N*K];
int ndcnt;

bool vis[N];
bool dfs(int u,int p) {
	vis[u]=1;int v;
	if(tot[u]>=k) {
		for(int i=1;i<=n;++i) {
			if(!vis[i] && first[u][i]) {
				if(dfs(i,List[first[u][i]].id)) {
					--tot[u];
					goto end;
				}
			}
		}
		return 0;
	}
	end:
	for(int i=1;i<=n;++i) {
		if(G[p][i]) {
			if(id[p][i]) {
				v=id[p][i];
				if(frm[p] && first[frm[p]][i]==v) 
					first[frm[p]][i]=List[v].nxt;
				List[List[v].lst].nxt=List[v].nxt;
				List[List[v].nxt].lst=List[v].lst;
				List[v]={0,0,p};
			}else {v=id[p][i]=++ndcnt;List[v].id=p;}
			List[v].nxt=first[u][i];
			List[first[u][i]].lst=v;
			first[u][i]=v;
		}
	}
	frm[p]=u,tot[u]++;
	return 1;
}

int main() {
	cin >> n >> k;
	for(int i=1;i<=n;++i) cin >> arr[i];
	
	int flow=n*k;
	for(int d=1;;++d) {
		++cnt;
		memset(G[cnt],0,sizeof(G[cnt]));
		for(int i=1;i<=n;++i) 
			if(((d-1)/arr[i])%2==0) G[cnt][i]=1;
		memset(vis,0,sizeof(vis));
		for(int i=1;i<=n;++i) {
			if(G[cnt][i] && dfs(i,cnt)) {
				flow--;
				goto GG;
			}
		}
		--cnt;continue;
		GG:
		if(!flow) {
			//for(int i=1;i<=n;++i) cout << tot[i] << ' ';
			//cout << endl;
			cout << d << '\n';
			break;
		}
		//if(flow%10000==0) cout << d << ' ' << flow << ' ' << ndcnt << ' ' << cnt << '\n';
	}
	
	return 0;
}

2025/1/21 12:07
加载中...