Submission #949322

#TimeUsernameProblemLanguageResultExecution timeMemory
949322koukirocksLove Polygon (BOI18_polygon)C++17
75 / 100
154 ms32432 KiB
#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 dp[MAX][3]; void dfs2(int v,int p) { if (cptG[v].size()==1) { dp[v][0]=0; dp[v][1]=-INF; return; } dp[v][0]=0; for (int i:cptG[v]) { if (i==p) continue; dfs2(i,v); dp[v][0]+=max(dp[i][0],dp[i][1]); } dp[v][1]=0; for (int i:cptG[v]) { if (i==p) continue; dp[v][1]=max(dp[v][1],dp[v][0]-max(dp[i][0],dp[i][1])+dp[i][0]+1); } // cout<<v<<" "<<dp[v][0]<<" "<<dp[v][1]<<"\n"; } 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 { int ans=0; for (int i=0;i<n;i++) { if (G[i]==i) { dfs2(i,i); ans+=max(dp[i][1],dp[i][0]); } } cout<<n-ans<<"\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...