101162024-03-27 00:13:59111Játék a síkoncpp17Időlimit túllépés 10/100600ms6592 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

struct P{
	int x,y;
};

bool kuhn(vector<vector<int>>& g, vector<int>& b, int i) {
	vector<int> v(g.size());
	auto dfs = [&](auto self, int i) {
		if (v[i]) {
			return 0;
		}
		v[i] = 1;
		for (int j : g[i]) {
			if (b[j] == -2) {
				continue;
			}
			if (b[j] == -1 || self(self, b[j])) {
				b[j] = i;
				return 1;
			}
		}
		return 0;
	};
	return dfs(dfs, i);
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int N;
	cin>>N;
	vector<P>v(N);
	for(int i=0;i<N;i++){
		cin>>v[i].x>>v[i].y;
	}
	int p=partition(v.begin(),v.end(),[&](P p){return p.x%2==p.y%2;})-v.begin();
	vector<vector<int>>g(p),gg(N-p);
	for(int i=0;i<p;i++){
		for(int j=p;j<N;j++){
			if(abs(v[j].x-v[i].x)+abs(v[j].y-v[i].y)==1){
				g[i].push_back(j-p);
				gg[j-p].push_back(i);
			}
		}
	}
	vector<int>b(N-p,-1),bb(p,-1);
	for(int i=0;i<p;i++){
		kuhn(g,b,i);
	}
	for(int i=0;i<N-p;i++){
		kuhn(gg,bb,i);
	}
	vector<int>ans;
	for(int i=0;i<N-p;i++){
		if(b[i]==-1){
			ans.push_back(p+i);
			continue;
		}
		int x=b[i];
		b[i]=-2;
		if(kuhn(g,b,x)){
			ans.push_back(p+i);
			b[i]=-1;
		}
		else{
			b[i]=x;
		}
	}
	for(int i=0;i<p;i++){
		if(bb[i]==-1){
			ans.push_back(i);
			continue;
		}
		int x=bb[i];
		bb[i]=-2;
		if(kuhn(gg,bb,x)){
			ans.push_back(i);
			bb[i]=-1;
		}
		else{
			bb[i]=x;
		}
	}
	if(1){
		vector<int>ans1;
		vector<vector<int>>g(N);
		for(int i=0;i<N;i++){
			for(int j=0;j<N;j++){
				if(abs(v[j].x-v[i].x)+abs(v[j].y-v[i].y)==1){
					g[i].push_back(j);
				}
			}
		}
		vector<int>w(N);
		auto bt=[&](auto self,int i)->int{
			if(w[i]){
				return 1;
			}
			w[i]=1;
			for(int j:g[i]){
				if(!self(self,j)){
					w[i]=0;
					return 1;
				}
			}
			w[i]=0;
			return 0;
		};
		for(int i=0;i<N;i++){
			if(!bt(bt,i)){
				ans1.push_back(i);
			}
		}
		if(ans.size()!=ans1.size()){
			set<pair<int,int>>ss;
			for(int i=0;i<N;i++){
				if(!ss.insert({v[i].x,v[i].y}).second)exit(1);
			}
		}
	}
	cout<<ans.size()<<'\n';
	for(int i:ans){
		cout<<v[i].x<<' '<<v[i].y<<'\n';
	}
	return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1888 KiB
2Időlimit túllépés600ms1584 KiB
subtask20/9
3Hibás válasz3ms2208 KiB
4Elfogadva3ms2336 KiB
subtask30/10
5Elfogadva3ms2548 KiB
6Elfogadva3ms2732 KiB
7Elfogadva3ms2836 KiB
8Hibás válasz3ms3092 KiB
9Elfogadva3ms3160 KiB
10Elfogadva3ms3164 KiB
11Elfogadva3ms3392 KiB
12Hibás válasz3ms3608 KiB
subtask410/10
13Elfogadva7ms3948 KiB
14Elfogadva7ms4096 KiB
15Elfogadva7ms4104 KiB
16Elfogadva8ms4364 KiB
subtask50/16
17Hibás válasz10ms4524 KiB
18Elfogadva8ms4300 KiB
19Hibás válasz8ms4676 KiB
20Hibás válasz9ms4940 KiB
21Elfogadva25ms4808 KiB
subtask60/18
22Elfogadva7ms4792 KiB
23Hibás válasz7ms5264 KiB
24Hibás válasz7ms5096 KiB
25Hibás válasz8ms5112 KiB
26Időlimit túllépés566ms4020 KiB
subtask70/37
27Hibás válasz92ms6592 KiB
28Elfogadva90ms5804 KiB
29Időlimit túllépés564ms4984 KiB
30Időlimit túllépés561ms5100 KiB
31Időlimit túllépés527ms5068 KiB
32Időlimit túllépés550ms4708 KiB
33Időlimit túllépés578ms4460 KiB
34Időlimit túllépés565ms4660 KiB
35Időlimit túllépés561ms4644 KiB
36Időlimit túllépés558ms5056 KiB
37Időlimit túllépés550ms4988 KiB
38Időlimit túllépés561ms4940 KiB
39Időlimit túllépés560ms4988 KiB
40Időlimit túllépés549ms5208 KiB
41Időlimit túllépés564ms5196 KiB
42Időlimit túllépés552ms4952 KiB