QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#597478#9424. Stop the Castle 2ucup-team5075#RE 36ms302848kbC++145.0kb2024-09-28 17:54:102024-09-28 17:54:10

Judging History

This is the latest submission verdict.

  • [2024-09-28 17:54:10]
  • Judged
  • Verdict: RE
  • Time: 36ms
  • Memory: 302848kb
  • [2024-09-28 17:54:10]
  • Submitted

answer

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<cstdlib>
using namespace std;
#define int long long
const int N=3e6+9,M=3e6+9,inf=1e16;
namespace WLL{
struct Edge{
	int nxt,to,dis;
	Edge(){}
	Edge(int x,int y,int z){nxt=x,to=y,dis=z;}
}edge[M<<1];
int head[N],edge_cnt=1;
void Add_edge(int u,int v,int w){edge[++edge_cnt]=Edge(head[u],v,w);head[u]=edge_cnt;}
void Add(int u,int v,int w)
{
	// cerr<<"Add "<<u<<" "<<v<<" "<<w<<endl;
	Add_edge(u,v,w),Add_edge(v,u,0);
}
int S,T;
queue<int> q;
int dep[N];
bool bfs()
{
	while(!q.empty()) q.pop();
	for(int i=1;i<=T;i++) dep[i]=0;
	dep[S]=1;q.push(S);
	while(!q.empty())
	{
		int u=q.front();q.pop();
		for(int i=head[u],v;i;i=edge[i].nxt)
		if(!dep[v=edge[i].to]&&edge[i].dis>0)
		{
			dep[v]=dep[u]+1;
			q.push(v);
		}
	}
	return dep[T];
}
int cur[N];
int dfs(int u,int flow)
{
	if(u==T) return flow;
	for(int &i=cur[u],v;i;i=edge[i].nxt)
	if(dep[v=edge[i].to]==dep[u]+1&&edge[i].dis>0)
	{
		int qwq=dfs(v,min(flow,edge[i].dis));
		if(qwq)
		{
			edge[i].dis-=qwq;
			edge[i^1].dis+=qwq;
			return qwq;
		}
	}
	return 0;
}
int Dinic()
{
	int ans=0;
	while(bfs())
	{
		for(int i=1;i<=T;i++) cur[i]=head[i];
		while(int d=dfs(S,inf)) ans+=d;
	}
	return ans;
}
void Clear()
{
	for(int i=1;i<=edge_cnt;i++) edge[i]=Edge(0,0,0);
	for(int i=1;i<=T;i++) head[i]=dep[i]=cur[i]=0;
	edge_cnt=1;
	S=T=0;
}
}
using WLL::Add;
using WLL::Dinic;
//--------------------------------------------------------------------------
int pos1[N][2],pos2[N][2];
int n,m,K;
int lsh[N<<1],lm=0;
vector<pair<int,int> > ma1[N],ma2[N];
int hcnt,lcnt;
int idx[N][2];
int ans=0;
map<int,int> ma[N];
int used[N];
int used2[N];
void Clear2()
{
	for(int i=1;i<=lm;i++) ma1[i].clear(),ma2[i].clear();
	for(int i=0;i<=hcnt+lcnt;i++) ma[i].clear();
	hcnt=lcnt=0;
	for(int i=1;i<=m;i++) idx[i][0]=idx[i][1]=used[i]=0;
	ans=0;
	lm=0;
}


void work()
{
	WLL::Clear();
	Clear2();
	scanf("%lld%lld%lld",&n,&m,&K);
	// cerr<<n<<" "<<m<<" "<<K<<endl;
	K=m-K;
	for(int i=1;i<=n;i++) scanf("%lld%lld",&pos1[i][0],&pos1[i][1]);
	for(int i=1;i<=m;i++) scanf("%lld%lld",&pos2[i][0],&pos2[i][1]);
	for(int i=1;i<=n;i++) lsh[++lm]=pos1[i][0],lsh[++lm]=pos1[i][1];
	for(int i=1;i<=m;i++) lsh[++lm]=pos2[i][0],lsh[++lm]=pos2[i][1];
	sort(lsh+1,lsh+lm+1);
	lm=unique(lsh+1,lsh+lm+1)-lsh-1;
	for(int i=1;i<=n;i++)
	for(int j=0;j<=1;j++)
	pos1[i][j]=lower_bound(lsh+1,lsh+lm+1,pos1[i][j])-lsh;
	for(int i=1;i<=m;i++)
	for(int j=0;j<=1;j++)
	pos2[i][j]=lower_bound(lsh+1,lsh+lm+1,pos2[i][j])-lsh;

	// for(int i=1;i<=n;i++) cerr<<pos1[i][0]<<" "<<pos1[i][1]<<endl;

	for(int i=1;i<=n;i++)
	ma1[pos1[i][0]].push_back(make_pair(pos1[i][1],0));
	for(int i=1;i<=n;i++)
	ma2[pos1[i][1]].push_back(make_pair(pos1[i][0],0));

	for(int i=1;i<=m;i++)
	ma1[pos2[i][0]].push_back(make_pair(pos2[i][1],i));
	for(int i=1;i<=m;i++)
	ma2[pos2[i][1]].push_back(make_pair(pos2[i][0],i));
	
	for(int i=1;i<=lm;i++)
	{
		sort(ma1[i].begin(),ma1[i].end());
		int lst=-1;
		for(int j=0;j<ma1[i].size();j++)
		if(ma1[i][j].second==0)
		{
			if(lst!=-1)
			{
				if(lst==j-1) ans++;
				else
				{
					hcnt++;
					for(int k=lst+1;k<j;k++) 
					idx[ma1[i][k].second][0]=hcnt;
				}
			}
			lst=j;
		}
	}
	
	
	for(int i=1;i<=lm;i++)
	{
		sort(ma2[i].begin(),ma2[i].end());
		int lst=-1;
		for(int j=0;j<ma2[i].size();j++)
		if(ma2[i][j].second==0)
		{
			if(lst!=-1)
			{
				if(lst==j-1) ans++;
				else
				{
					lcnt++;
					for(int k=lst+1;k<j;k++)
					idx[ma2[i][k].second][1]=lcnt;
				}
			}
			lst=j;
		}
	}

	WLL::S=hcnt+lcnt+1;
	WLL::T=hcnt+lcnt+2;
	
	for(int i=1;i<=hcnt;i++) Add(WLL::S,i,1);
	for(int i=1;i<=lcnt;i++) Add(i+hcnt,WLL::T,1);
	for(int i=1;i<=m;i++)
	if(idx[i][0]&&idx[i][1]) Add(idx[i][0],idx[i][1]+hcnt,1);
	
	int fuck=Dinic();
	int ts_cnt=min(fuck,K);
	int normal_cnt=min(hcnt+lcnt-ts_cnt*2,K-ts_cnt);
	// cerr<<ts_cnt<<" "<<normal_cnt<<endl;
	int qwq=ans+(hcnt+lcnt)-(2*ts_cnt+normal_cnt);
	printf("%lld\n",qwq);

	//print answer
	int fz1=0;
	for(int i=1;i<=m;i++) ma[idx[i][0]][idx[i][1]]=i;
	for(int i=1;i<=hcnt+lcnt;i++) used2[i]=0;

	for(int u=1;u<=hcnt;u++)
	for(int i=WLL::head[u];i;i=WLL::edge[i].nxt)
	if(WLL::edge[i].dis==0)
	{
		int v=WLL::edge[i].to;
		if(v<WLL::S)
		{
			if(fz1<ts_cnt)
			{
				fz1++;
				used[ma[u][v-hcnt]]=1;
				used2[u]=1;
				used2[v]=1;
			}
		}
	}
	int fz2=0;
	for(int i=1;i<=hcnt;i++)
	if(!used2[i]&&fz2<normal_cnt&&ma[i][0])
	{
		fz2++;
		used[ma[i][0]]=1;
	}
	for(int i=1;i<=lcnt;i++)
	if(!used2[i+hcnt]&&fz2<normal_cnt&&ma[0][i])
	{
		fz2++;
		used[ma[0][i]]=1;
	}
	int fz3=fz1+fz2;
	for(int i=1;i<=m;i++)
	if(!used[i]&&fz3<K)
	{
		fz3++;
		used[i]=1;
	}
	if(fz1!=ts_cnt) exit(-1);
	if(fz2!=normal_cnt) exit(-1);
	for(int i=1;i<=m;i++)
	if(!used[i]) printf("%lld ",i);
	puts("");
}
signed main()
{
	int T;
	scanf("%lld",&T);
	// T=1;
	while(T--) work();
}

详细

Test #1:

score: 100
Accepted
time: 36ms
memory: 302848kb

input:

3
8 6 4
1 3
2 1
2 6
4 1
4 7
6 1
6 3
6 6
2 3
3 1
4 3
4 6
5 2
6 4
3 2 1
10 12
10 10
10 11
1 4
1 5
1 3 2
1 1
2 1
2 2
2 3

output:

4
2 3 5 6 
2
2 
0
2 3 

result:

ok ok 3 cases (3 test cases)

Test #2:

score: -100
Runtime Error

input:

1224
11 17 14
7 3
4 2
8 13
3 15
3 4
5 11
10 2
3 3
8 6
7 11
2 3
10 4
1 3
12 1
2 5
11 9
11 6
11 10
8 15
1 5
9 14
4 11
1 6
10 7
7 6
11 4
8 4
1 11
18 3 2
14 8
2 14
13 13
9 12
14 12
5 6
8 1
10 5
8 6
8 9
6 6
7 5
12 11
6 11
13 5
1 10
7 6
14 5
6 15
2 4
11 1
1 6 4
14 14
13 9
9 3
10 12
7 5
8 13
9 14
1 9 8
4 9...

output:

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

result: