Submission #376949

#TimeUsernameProblemLanguageResultExecution timeMemory
376949AriaHLove Polygon (BOI18_polygon)C++11
29 / 100
383 ms43884 KiB
/** I can do this all day **/

#pragma GCC optimize("O2")
#include <bits/stdc++.h>
using namespace std;

typedef long long                   ll;
typedef long double                 ld;
typedef pair<int,int>               pii;
typedef pair<ll,ll>                 pll;
#define all(x)                      (x).begin(),(x).end()
#define F                           first
#define S                           second
#define Mp                          make_pair
#define SZ(x)			    		(int)x.size()
#define fast_io                     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io                     freopen("in.txt" , "r+" , stdin) ; freopen("out.txt" , "w+" , stdout);

const int N = 1e6 + 10;
const ll mod = 1e9 + 7;
const ll mod2 = 998244353;
const ll inf = 8e18;
const int LOG = 22;

ll pw(ll a , ll b, ll M)  { return (!b ? 1 : (b & 1 ? (a * pw(a * a % M, b / 2, M)) % M : pw(a * a % M, b / 2, M))); }

char C[N];

string ask()
{
	scanf("%s", C);
	string s = C;
	return s;
}

int n, mark[N], dp[2][N]; /// dp[0][v] -> v match shode bashe
						  /// dp[1][v] -> v match nashode bashe

map < string , int > mp;

vector < int > G[N], roots;

void dfs(int v)
{
	mark[v] = 1;
	for(auto u : G[v])
	{
		if(mark[u]) continue;
		dfs(u);
		dp[0][v] = max(dp[0][v] + max(dp[0][u], dp[1][u]), dp[1][v] + dp[1][u] + 1);
		dp[1][v] = dp[1][v] + max(dp[0][u], dp[1][u]);
	}
}

int main()
{
	scanf("%d", &n);
	if(n & 1)
	{
		return !printf("-1");
	}
	int cnt = 0;
	for(int i = 1; i <= n; i ++)
	{
		string s = ask(), t = ask();
		if(mp.count(s) == 0) mp[s] = ++ cnt;
		if(mp.count(t) == 0) mp[t] = ++ cnt;
		if(mp[s] == mp[t]) { roots.push_back(mp[s]); continue; }
		G[mp[t]].push_back(mp[s]);
	}
	int tot = n;
	for(auto i : roots)
	{
		if(mark[i]) continue;
		dfs(i);
		tot -= max(dp[0][i], dp[1][i]);
	}
	printf("%d\n", tot);
	return 0;
}

/** test corner cases(n = 1?) watch for overflow or minus indices **/

Compilation message (stderr)

polygon.cpp: In function 'std::string ask()':
polygon.cpp:31:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   31 |  scanf("%s", C);
      |  ~~~~~^~~~~~~~~
polygon.cpp: In function 'int main()':
polygon.cpp:57:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   57 |  scanf("%d", &n);
      |  ~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...