QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#742755#9424. Stop the Castle 2Nana7WA 5ms26140kbC++145.1kb2024-11-13 17:14:462024-11-13 17:14:47

Judging History

This is the latest submission verdict.

  • [2024-11-13 17:14:47]
  • Judged
  • Verdict: WA
  • Time: 5ms
  • Memory: 26140kb
  • [2024-11-13 17:14:46]
  • Submitted

answer

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<unordered_map>
#include<queue> 
#define I inline
#define inf (int)(1e9)
#define it set<int>::iterator 
using namespace std;

const int N = 100010;
struct node {
	int x,y;
}c[N],o[N];
int n,m,K,L[N],U[N],D[N],R[N],ans[N],del[N<<1];
set<int> stx[N],sty[N];

const int MAXM = 1200010;
const int MAXN = 200010;
int S=200009,T=200008;
int head[MAXN],cur[MAXN],dis[MAXN],vis[MAXN];
int ver[MAXM],mf[MAXM],Next[MAXM],id[MAXM];
int tot=1;
queue<int> jr;

I void add(int x,int y,int nf,int nid) {
	ver[++tot]=y; mf[tot]=nf; Next[tot]=head[x]; head[x]=tot; id[tot]=nid;
	ver[++tot]=x; mf[tot]=0; Next[tot]=head[y]; head[y]=tot; id[tot]=nid;
}
I bool spfa() {
	while(!jr.empty()) jr.pop();
	for(int i=1;i<=n*2;++i) dis[i]=inf,vis[i]=0;
	vis[S]=1; dis[S]=0; vis[T]=0; dis[T]=inf; jr.push(S);
	while(!jr.empty()) {
		int k=jr.front(); jr.pop(); vis[k]=0;
		for(int i=head[k];i;i=Next[i]) {
			int to=ver[i];
			if(!mf[i]) continue;
			if(dis[k]+1<dis[to])	{
			  	dis[to]=dis[k]+1;
			  	if(!vis[to]) vis[to]=1,jr.push(to);
			}
		}
	}
	if(dis[T]==inf) return false;
	return true;
}
I int dfs(int x,int limit) { 
	if(!limit) return 0;
	if(x==T) return limit;
	vis[x]=1;
	int nowflow=0;
	for(int i=cur[x];i;i=Next[i]) {
		if(!(limit-nowflow)) continue;
		int to=ver[i];
		cur[x]=i;
		if(vis[to]||(!mf[i])||dis[to]!=dis[x]+1) continue;
		int f=dfs(to,min(limit-nowflow,mf[i]));
		if(!f) continue;
		mf[i]-=f; mf[i^1]+=f;
		nowflow+=f; 
	}
	vis[x]=0;
	return nowflow;
}
I void ck1() {
	cout<<"L: ";
	for(int i=1;i<=n;++i) cout<<L[i]<<' '; cout<<endl;
	cout<<"R: ";
	for(int i=1;i<=n;++i) cout<<R[i]<<' '; cout<<endl; 
	cout<<"U: ";
	for(int i=1;i<=n;++i) cout<<U[i]<<' '; cout<<endl;
	cout<<"D: ";
	for(int i=1;i<=n;++i) cout<<D[i]<<' '; cout<<endl;
}

#define mkp make_pair
#define pii pair<int,int>
map<pii,int> mp;
unordered_map<int,int> cx,cy;

I void lsh() {
	int xcnt,ycnt;
	vector<int> vx,vy;
	for(int i=1;i<=n;++i) vx.push_back(c[i].x),vy.push_back(c[i].y);
	for(int i=1;i<=m;++i) vx.push_back(o[i].x),vy.push_back(o[i].y);
	sort(vx.begin(),vx.end()); sort(vy.begin(),vy.end());
	
	int lenx=unique(vx.begin(),vx.end())-vx.begin(),leny=unique(vy.begin(),vy.end())-vy.begin();
	for(int i=1;i<=n;++i) c[i].x=lower_bound(vx.begin(),vx.end(),c[i].x)-vx.begin()+1;
	for(int i=1;i<=n;++i) c[i].y=lower_bound(vy.begin(),vy.end(),c[i].y)-vy.begin()+1;
	for(int i=1;i<=m;++i) o[i].x=lower_bound(vx.begin(),vx.end(),o[i].x)-vx.begin()+1;
	for(int i=1;i<=m;++i) o[i].y=lower_bound(vy.begin(),vy.end(),o[i].y)-vy.begin()+1;
//	for(int i=1;i<=n;++i) cout<<"c"<<c[i].x<<' '<<c[i].y<<endl;
//	for(int i=1;i<=m;++i) cout<<"o"<<o[i].x<<' '<<o[i].y<<endl;
}
I void solve() {
	cin>>n>>m>>K; K=m-K; 
	for(int i=1;i<=n;++i) cin>>c[i].x>>c[i].y;
	for(int i=1;i<=m;++i) cin>>o[i].x>>o[i].y;
	
	lsh();
	
	for(int i=1;i<=n;++i) stx[c[i].x].insert(c[i].y);
	for(int i=1;i<=n;++i) sty[c[i].y].insert(c[i].x);
	
	int atk=0;
	for(int i=1;i<=n;++i) {
		if(cx[c[i].x]==0) {
			cx[c[i].x]=1;
		} else atk++;
		if(cy[c[i].y]==0) {
			cy[c[i].y]=1;
		} else atk++;
	}
	
	
	for(int i=1;i<=n;++i) add(S,i,1,-1),add(i+n,T,1,-1);
	for(int i=1;i<=m;++i) {
		it nL,nR,nU,nD;
		nR=stx[o[i].x].lower_bound(o[i].y);
		nL=stx[o[i].x].lower_bound(o[i].y);
		nD=sty[o[i].y].lower_bound(o[i].x);
		nU=sty[o[i].y].lower_bound(o[i].x);
		int cnt=0;
		if(nR!=stx[o[i].x].end()) {
			R[i]=mp[mkp(o[i].x,*nR)];
			cnt++;
		}
		if(nR!=stx[o[i].x].begin()) {
			nL--;
			L[i]=mp[mkp(o[i].x,*nL)];
			cnt++;
		}
		if(nD!=sty[o[i].y].end()) {
			D[i]=mp[mkp(*nD,o[i].y)];
			cnt++;
		}
		if(nD!=sty[o[i].y].begin()) {
			nU--;
			U[i]=mp[mkp(*nU,o[i].y)];
			cnt++;
		}
		if(cnt!=4) continue;
		add(R[i],D[i]+n,inf,i); 
	}
	//ck1();
	while(spfa()) {
	//	memcpy(cur,head,sizeof(cur));
		for(int i=1;i<=n*2;++i) cur[i]=head[i];
		cur[S]=head[S]; cur[T]=head[T];
		atk-=2*dfs(S,inf);
	}
	
	int cnt=0;
	for(int i=1;i<=n;++i) {
		if(cnt==K) break;
		for(int j=head[i];j;j=Next[j]) {
			int c=mf[j],u=ver[j];
			if(u>n&&u<=n*2&&c!=inf) {
				cnt++;
				ans[id[j]]=1;
				del[u]=del[i]=1;
				break;
			}
		}
	}
	for(int i=1;i<=m;++i) {
		if(cnt==K||ans[i]) break;
		if(L[i]&&R[i]&&!del[R[i]]) ans[i]=1,cnt++,atk--;
		if(U[i]&&D[i]&&!del[D[i]+n]) ans[i]=1,cnt++,atk--;	
	}
	for(int i=1;i<=m;++i) {
		if(!ans[i]&&cnt<K) cnt++,ans[i]=1;
	}
	cout<<atk<<endl;
	for(int i=1;i<=m;++i) {
		if(!ans[i]) cout<<i<<' ';
	} cout<<endl;
}
I void clear() {
	tot=1; mp.clear(); cx.clear(); cy.clear(); 
	for(int i=1;i<=n*2;++i) head[i]=0; head[S]=head[T]=0;
	for(int i=1;i<=n;++i) stx[c[i].x].clear(),sty[c[i].y].clear();
	for(int i=1;i<=m;++i) ans[i]=L[i]=U[i]=D[i]=R[i]=0;
	for(int i=1;i<=n*2;++i) del[i]=0;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	int TT; cin>>TT;
	while(TT--) {
		solve();
		clear();
	}
}
/*
1
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


1
3 2 1
10 12
10 10
10 11
1 4
1 5

 
*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 5ms
memory: 26140kb

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:

8
3 4 5 6 
2
2 
0
2 3 

result:

wrong answer Participant states the answer to be 8 but is actually 5 (test case 1)