Submission #949153

# Submission time Handle Problem Language Result Execution time Memory
949153 2024-03-19T02:44:40 Z koukirocks Love Polygon (BOI18_polygon) C++17
46 / 100
129 ms 22760 KB
#include <bits/stdc++.h>
#define speed ios_base::sync_with_stdio(0); cin.tie(0)
#define all(x) (x).begin(),(x).end()
#define F first
#define S second
 
using namespace std;
typedef long long ll;
typedef double db;
typedef long double ldb;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
 
const ll MAX=1e5+10,P=998244353;
const ll INF=0x3f3f3f3f,oo=0x3f3f3f3f3f3f3f3f;

int n;
vector<pair<string,string> > eg;
int G[MAX];
vector<int> cptG[MAX];

int dfs2(int v,int p,bool can) {
//	cout<<v<<" "<<p<<" "<<can<<"\n";
	if (cptG[v].size()==1) return can;
	int ans=0;
	int minn=INF;
	int id=0;
	if (can) {
		for (int i:cptG[v]) {
			if (i==p) continue;
			if (cptG[i].size()<minn) {
				minn=cptG[i].size();
				id=i;
			}
		}
		ans+=dfs2(id,v,0)+1;
	}
	for (int i:cptG[v]) {
		if (i==p) continue;
		if (can and i==id) continue;
		ans+=dfs2(i,v,1);
	}
	return ans;
}

int main() {
	speed;
	cin>>n;
	vector<string> dct;
	for (int i=0;i<n;i++) {
		string a,b;
		cin>>a>>b;
		eg.emplace_back(a,b);
		dct.push_back(a);
		dct.push_back(b);
	}
	sort(all(dct));
	dct.resize(unique(all(dct))-dct.begin());
	vector<int> lvd(n,0);
	for (int i=0;i<n;i++) {
		auto [a,b]=eg[i];
		int va=lower_bound(all(dct),a)-dct.begin();
		int vb=lower_bound(all(dct),b)-dct.begin();
		G[va]=vb;
		cptG[va].push_back(vb);
		cptG[vb].push_back(va);
		lvd[vb]++;
	}
	bool alllvd=true;
	for (int i=0;i<n;i++) {
		if (lvd[i]!=1) {
			alllvd=false;
			break;
		}
	}
	if (n&1) {
		cout<<"-1\n";
		return 0;
	}
	if (n<=20) {
		int ans=n;
		for (int st=0;st<(1<<n);st++) {
			bool flag=true;
			vector<int> cnt(n,0);
			for (int i=0;i<n;i++) {
				if (st&(1<<i)) continue;
				if (G[i]==i) {
					flag=false;
					break;
				}
				int tgt=G[i];
				if (G[tgt]==i) continue;
				if (st&(1<<tgt)) {
					if (cnt[tgt]==0) {
						cnt[tgt]++;
						continue;
					}
				}
				flag=false;
				break;
			}
	//		if (flag) cout<<st<<"\n";
			if (flag) ans=min(ans,__builtin_popcount(st));
		}
		cout<<ans<<"\n";
	} else if (alllvd) {
		vector<bool> vis(n,0);
		int ans=0;
		for (int i=0;i<n;i++) {
			if (vis[i]) continue;
			int now=i;
			int st=i;
			int sz=1;
			vis[i]=true;
			while (G[now]!=st) {
//				cout<<now<<" ";
				sz++;
				now=G[now];
				vis[now]=true;
			}
			if (sz==2) continue;
			ans+=(sz+1)>>1;
		}
		cout<<ans<<"\n";
	} else {
		vector<int> sz(n);
		int ans=0;
		for (int i=0;i<n;i++) {
			if (G[i]==i) {
				ans+=dfs2(i,i,1);
			}
		}
		cout<<ans<<"\n";
	}
	return 0;
}



Compilation message

polygon.cpp: In function 'int dfs2(int, int, bool)':
polygon.cpp:31:22: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   31 |    if (cptG[i].size()<minn) {
      |        ~~~~~~~~~~~~~~^~~~~
# Verdict Execution time Memory Grader output
1 Correct 28 ms 2648 KB Output is correct
2 Correct 22 ms 2964 KB Output is correct
3 Correct 27 ms 2652 KB Output is correct
4 Correct 1 ms 2648 KB Output is correct
5 Correct 1 ms 2652 KB Output is correct
6 Correct 1 ms 2652 KB Output is correct
7 Correct 27 ms 2652 KB Output is correct
8 Correct 28 ms 2820 KB Output is correct
9 Correct 24 ms 2652 KB Output is correct
10 Correct 31 ms 2792 KB Output is correct
11 Correct 30 ms 2648 KB Output is correct
12 Correct 1 ms 2648 KB Output is correct
13 Correct 1 ms 2652 KB Output is correct
14 Correct 1 ms 2652 KB Output is correct
15 Correct 1 ms 2648 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 2652 KB Output is correct
2 Correct 1 ms 2652 KB Output is correct
3 Correct 1 ms 2648 KB Output is correct
4 Correct 129 ms 21928 KB Output is correct
5 Correct 116 ms 20104 KB Output is correct
6 Correct 114 ms 20148 KB Output is correct
7 Correct 115 ms 20876 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 125 ms 22760 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 28 ms 2648 KB Output is correct
2 Correct 22 ms 2964 KB Output is correct
3 Correct 27 ms 2652 KB Output is correct
4 Correct 1 ms 2648 KB Output is correct
5 Correct 1 ms 2652 KB Output is correct
6 Correct 1 ms 2652 KB Output is correct
7 Correct 27 ms 2652 KB Output is correct
8 Correct 28 ms 2820 KB Output is correct
9 Correct 24 ms 2652 KB Output is correct
10 Correct 31 ms 2792 KB Output is correct
11 Correct 30 ms 2648 KB Output is correct
12 Correct 1 ms 2648 KB Output is correct
13 Correct 1 ms 2652 KB Output is correct
14 Correct 1 ms 2652 KB Output is correct
15 Correct 1 ms 2648 KB Output is correct
16 Correct 1 ms 2652 KB Output is correct
17 Correct 1 ms 2652 KB Output is correct
18 Correct 1 ms 2648 KB Output is correct
19 Correct 129 ms 21928 KB Output is correct
20 Correct 116 ms 20104 KB Output is correct
21 Correct 114 ms 20148 KB Output is correct
22 Correct 115 ms 20876 KB Output is correct
23 Incorrect 125 ms 22760 KB Output isn't correct
24 Halted 0 ms 0 KB -