답안 #238385

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
238385 2020-06-11T00:02:19 Z b00n0rp 수도 (JOI20_capital_city) C++17
100 / 100
427 ms 51692 KB
// --------------------------------------------------<TEMPLATE>--------------------------------------------------
// --------------------<optimizations>--------------------
#pragma GCC optimize("O3")
//(UNCOMMENT WHEN HAVING LOTS OF RECURSIONS)\
#pragma comment(linker, "/stack:200000000")
//(UNCOMMENT WHEN NEEDED)\
#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")\
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
 
// -------------------</optimizations>--------------------
 
// ---------------<Headers and namespaces>----------------
#include <algorithm>
#include <bitset>
#include <cassert>
#include <chrono>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <limits>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <ratio>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>
using namespace std;
 
/*
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/rope>
using namespace __gnu_pbds;
using namespace __gnu_cxx;
*/
 
// ---------------</Headers and namespaces>---------------
 
// -----------------<Defines and typedefs>----------------
// typedef tree<int,null_type,less<int>,rb_tree_tag, \
tree_order_statistics_node_update> indexed_set; // use less_equal for multiset
// order_of_key (val): returns the no. of values less than val
// find_by_order (k): returns the iterator to kth largest element.(0-based)
 
typedef long double LD;
typedef long long ll;
#define int ll
#define pb push_back
#define mp make_pair
#define REP(i,n) for (int i = 0; i < n; i++)
#define FOR(i,a,b) for (int i = a; i < b; i++)
#define REPD(i,n) for (int i = n-1; i >= 0; i--)
#define FORD(i,a,b) for (int i = a; i >= b; i--)
#define remax(a,b) a = max(a,b)
#define remin(a,b) a = min(a,b)
#define all(v) v.begin(),v.end()
typedef map<int,int> mii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int,int> pii;
typedef vector<pii> vpii;
#define F first
#define S second
#define PQ(type) priority_queue<type>
#define PQD(type) priority_queue<type,vector<type>,greater<type> >
#define ITR :: iterator it
#define WL(t) while(t --)
#define SZ(x) ((int)(x).size())
#define runtime() ((double)clock() / CLOCKS_PER_SEC)
#define TR(container,it) for(typeof(container.begin()) it=container.begin();it!=container.end();it++)
#define sqr(x) ((x)*(x))
#define inrange(i,a,b) ((i>=min(a,b)) && (i<=max(a,b)))
 
// -----<SCANF>-----
#define sfi(x) scanf("%d",&x);
#define sfi2(x,y) scanf("%d%d",&x,&y);
#define sfi3(x,y,z) scanf("%d%d%d",&x,&y,&z);
 
#define sfl(x) scanf("%lld",&x);
#define sfl2(x,y) scanf("%lld%lld",&x,&y);
#define sfl3(x,y,z) scanf("%lld%lld%lld",&x,&y,&z);
#define sfl4(x,y,z,x1) scanf("%lld%lld%lld%lld",&x,&y,&z,&x1);
#define sfl5(x,y,z,x1,y1) scanf("%lld%lld%lld%lld%lld",&x,&y,&z,&x1,&y1);
#define sfl6(x,y,z,x1,y1,z1) scanf("%lld%lld%lld%lld%lld%lld",&x,&y,&z,&x1,&y1,&z1);
 
#define sfs(x) scanf("%s",x);
#define sfs2(x,y) scanf("%s%s",x,y);
#define sfs3(x,y,z) scanf("%s%s%s",x,y,z);
// ----</SCANF>-----
 
// ----<PRINTF>-----
#define pfi(x) printf("%d\n",x);
#define pfi2(x,y) printf("%d %d\n",x,y);
#define pfi3(x,y,z) printf("%d %d %d\n",x,y,z);
 
#define pfl(x) printf("%lld\n",x);
#define pfl2(x,y) printf("%lld %lld\n",x,y);
#define pfl3(x,y,z) printf("%lld %lld %lld\n",x,y,z);
 
#define pfs(x) printf("%s\n",x);
#define pfs2(x,y) printf("%s %s\n",x,y);
#define pfs3(x,y,z) printf("%s %s %s\n",x,y,z);
 
#define pwe(x) printf("%lld ",x); // print without end
// ----</PRINTF>----
 
#define FLSH fflush(stdout)
#define fileIO(name) \
    freopen(name".in", "r", stdin); \
    freopen(name".out", "w", stdout);
#define PRECISION(x) cout << fixed << setprecision(x); 
#define FAST_IO ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
 
// ----------------</Defines and typedefs>----------------
 
// -------------------<Debugging stuff>-------------------
#define TRACE
 
#ifdef TRACE
#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1>
void __f(const char* name, Arg1&& arg1){
	cerr << name << " : " << arg1 << std::endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args){
	const char* comma = strchr(names + 1, ',');cerr.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...);
}
#else
#define trace(...)
#endif
 
// ------------------</Debugging stuff>-------------------
 
// ------------------------<Consts>-----------------------
const int MAXN = 1000005;
const int SQRTN = 1003;
const int LOGN = 22;
const double PI=acos(-1);
 
#ifdef int
const int INF=1e16;
#else
const int INF=1e9;
#endif
 
const int MOD = 1000000007;
const int FMOD = 998244353;
const double eps = 1e-9;
 
// -----------------------</Consts>-----------------------
 
// -------------------------<RNG>-------------------------
mt19937 RNG(chrono::steady_clock::now().time_since_epoch().count()); 
#define SHUF(v) shuffle(all(v), RNG);
// Use mt19937_64 for 64 bit random numbers.
 
// ------------------------</RNG>-------------------------
 
// ----------------------<MATH>---------------------------
template<typename T> T gcd(T a, T b){return(b?__gcd(a,b):a);}
template<typename T> T lcm(T a, T b){return(a*(b/gcd(a,b)));}
int add(int a, int b, int c = MOD){int res=a+b;return(res>=c?res-c:res);}
int mod_neg(int a, int b, int c = MOD){int res;if(abs(a-b)<c)res=a-b;else res=(a-b)%c;return(res<0?res+c:res);}
int mul(int a, int b, int c = MOD){ll res=(ll)a*b;return(res>=c?res%c:res);}
int muln(int a, int b, int c = MOD){ll res=(ll)a*b;return ((res%c)+c)%c;}
ll mulmod(ll a,ll b, ll m = MOD){ll q = (ll)(((LD)a*(LD)b)/(LD)m);ll r=a*b-q*m;if(r>m)r%=m;if(r<0)r+=m;return r;}
template<typename T>T expo(T e, T n){T x=1,p=e;while(n){if(n&1)x=x*p;p=p*p;n>>=1;}return x;}
template<typename T>T power(T e, T n, T m = MOD){T x=1,p=e;while(n){if(n&1)x=mul(x,p,m);p=mul(p,p,m);n>>=1;}return x;}
template<typename T>T extended_euclid(T a, T b, T &x, T &y){T xx=0,yy=1;y=0;x=1;while(b){T q=a/b,t=b;b=a%b;a=t;\
t=xx;xx=x-q*xx;x=t;t=yy;yy=y-q*yy;y=t;}return a;}
template<typename T>T mod_inverse(T a, T n = MOD){T x,y,z=0;T d=extended_euclid(a,n,x,y);return(d>1?-1:mod_neg(x,z,n));}
 
const int FACSZ = 1; // Make sure to change this
 
int fact[FACSZ],ifact[FACSZ];
 
void precom(int c = MOD){
	fact[0] = 1;
	FOR(i,1,FACSZ) fact[i] = mul(fact[i-1],i,c);
	ifact[FACSZ-1] = mod_inverse(fact[FACSZ-1],c);
	REPD(i,FACSZ-1){
		ifact[i] = mul(i+1,ifact[i+1],c);
	}
}
 
int ncr(int n,int r,int c = MOD){
	return mul(mul(ifact[r],ifact[n-r],c),fact[n],c);
} 
// ----------------------</MATH>--------------------------
// --------------------------------------------------</TEMPLATE>--------------------------------------------------
 
void solvethetestcase();
 
signed main(){
	// (UNCOMMENT FOR CIN/COUT) \
	FAST_IO
	PRECISION(10)
 
	int t = 1;
	// (UNCOMMENT FOR MULTIPLE TEST CASES) \
	sfl(t);
	FOR(testcase,1,t+1){
		// (UNCOMMENT FOR CODEJAM) \
		printf("Case #%lld: ",testcase); 
		solvethetestcase();
	}
}   
 
int n,k;
vi adj[200005];
int c[200005]; 
vi gg[200005]; 

vi dirg[200005]; 
vi revg[200005]; 

int par[200005],dep[200005];

int tim;
int lft[200005],rgt[200005];

void dfs(int u,int p,int d = 0){
	par[u] = p;
	lft[u] = tim;
	tim++;
	dep[u] = d;
	for(auto v:adj[u]){
		if(v == p) continue;
		dfs(v,u,d+1);
	
	}
	rgt[u] = tim;
}

bitset<200005> vis; 

vi order;

void dirdfs(int u){
	vis[u] = 1;
	for(auto v:dirg[u]){
		if(!vis[v]) dirdfs(v);
	}
	order.pb(u);
}

vi sizes;
int comp[200005];
int compnum,compcnt;
 
void dirdfs2(int u){
	vis[u] = 1;
	compcnt++;
	comp[u] = compnum;
	for(auto v:revg[u]){
		if(!vis[v]) dirdfs2(v);
	}
	
}

void solvethetestcase(){
	sfl2(n,k)
	REP(i,n-1){
		int u,v; 
		sfl2(u,v)
		adj[u].pb(v);
		adj[v].pb(u);
	}
	FOR(i,1,n+1){
		sfl(c[i])
		gg[c[i]].pb(i);
	}
	tim = 0;
	dfs(1,1);
	FOR(i,1,k+1){
		int lowd = -1;
		for(auto x:gg[i]){
			if(lowd == -1 or dep[lowd] > dep[x]) lowd = x;
		}
		bool f = 1;
		for(auto x:gg[i]){
			if(lft[x] >= lft[lowd] and lft[x] < rgt[lowd]) continue;
			f = 0;
			break;
		}
		for(auto x:gg[i]){
			if(x != lowd or f == 0){
				if(c[par[x]] != i){
					dirg[i].pb(c[par[x]]);
					revg[c[par[x]]].pb(i);
				}
			}
		}
	}
	FOR(i,1,k+1){
		if(!vis[i]) dirdfs(i);
	}
	reverse(all(order));
	vis.reset();
	compnum = 0;
	for(auto u:order){
		compcnt = 0;
		if(vis[u]) continue;
		dirdfs2(u);
		compnum++;
		sizes.pb(compcnt);
	}
	FOR(i,1,k+1){
		for(auto v:dirg[i]){
			if(comp[v] == comp[i]) continue;
			sizes[comp[i]] = INF;
			break;
		}
	}
	int ans = INF;
	for(auto x:sizes) remin(ans,x);
	pfl(ans-1)
}
/*
6 3                     
2 1 
3 5
6 2
3 4
2 3
1 3 1 2 3 2

8 4
4 1
1 3
3 6
6 7
7 2
2 5
5 8
2 4 3 1 1 2 3 4

12 4
7 9
1 3
4 6
2 4
10 12
1 2
2 10
11 1
2 8
5 3
6 7
3 1 1 2 4 3 3 2 2 3 4 4
*/

Compilation message

capital_city.cpp:4:1: warning: multi-line comment [-Wcomment]
 //(UNCOMMENT WHEN HAVING LOTS OF RECURSIONS)\
 ^
capital_city.cpp:6:1: warning: multi-line comment [-Wcomment]
 //(UNCOMMENT WHEN NEEDED)\
 ^
capital_city.cpp:56:1: warning: multi-line comment [-Wcomment]
 // typedef tree<int,null_type,less<int>,rb_tree_tag, \
 ^
capital_city.cpp:212:2: warning: multi-line comment [-Wcomment]
  // (UNCOMMENT FOR CIN/COUT) \
  ^
capital_city.cpp:217:2: warning: multi-line comment [-Wcomment]
  // (UNCOMMENT FOR MULTIPLE TEST CASES) \
  ^
capital_city.cpp:220:3: warning: multi-line comment [-Wcomment]
   // (UNCOMMENT FOR CODEJAM) \
   ^
capital_city.cpp: In function 'void solvethetestcase()':
capital_city.cpp:96:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
 #define sfl2(x,y) scanf("%lld%lld",&x,&y);
                   ~~~~~^~~~~~~~~~~~~~~~~~
capital_city.cpp:279:2: note: in expansion of macro 'sfl2'
  sfl2(n,k)
  ^~~~
capital_city.cpp:96:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
 #define sfl2(x,y) scanf("%lld%lld",&x,&y);
                   ~~~~~^~~~~~~~~~~~~~~~~~
capital_city.cpp:282:3: note: in expansion of macro 'sfl2'
   sfl2(u,v)
   ^~~~
capital_city.cpp:95:21: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
 #define sfl(x) scanf("%lld",&x);
                ~~~~~^~~~~~~~~~~
capital_city.cpp:287:3: note: in expansion of macro 'sfl'
   sfl(c[i])
   ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 19200 KB Output is correct
2 Correct 16 ms 19200 KB Output is correct
3 Correct 16 ms 19200 KB Output is correct
4 Correct 16 ms 19200 KB Output is correct
5 Correct 18 ms 19200 KB Output is correct
6 Correct 16 ms 19200 KB Output is correct
7 Correct 16 ms 19200 KB Output is correct
8 Correct 16 ms 19200 KB Output is correct
9 Correct 18 ms 19200 KB Output is correct
10 Correct 16 ms 19200 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 19200 KB Output is correct
2 Correct 16 ms 19200 KB Output is correct
3 Correct 16 ms 19200 KB Output is correct
4 Correct 16 ms 19200 KB Output is correct
5 Correct 18 ms 19200 KB Output is correct
6 Correct 16 ms 19200 KB Output is correct
7 Correct 16 ms 19200 KB Output is correct
8 Correct 16 ms 19200 KB Output is correct
9 Correct 18 ms 19200 KB Output is correct
10 Correct 16 ms 19200 KB Output is correct
11 Correct 18 ms 19456 KB Output is correct
12 Correct 17 ms 19456 KB Output is correct
13 Correct 18 ms 19456 KB Output is correct
14 Correct 19 ms 19456 KB Output is correct
15 Correct 22 ms 19456 KB Output is correct
16 Correct 19 ms 19456 KB Output is correct
17 Correct 19 ms 19456 KB Output is correct
18 Correct 22 ms 19456 KB Output is correct
19 Correct 21 ms 19456 KB Output is correct
20 Correct 20 ms 19456 KB Output is correct
21 Correct 19 ms 19456 KB Output is correct
22 Correct 19 ms 19456 KB Output is correct
23 Correct 18 ms 19456 KB Output is correct
24 Correct 18 ms 19456 KB Output is correct
25 Correct 18 ms 19456 KB Output is correct
26 Correct 17 ms 19456 KB Output is correct
27 Correct 17 ms 19456 KB Output is correct
28 Correct 20 ms 19456 KB Output is correct
29 Correct 20 ms 19456 KB Output is correct
30 Correct 20 ms 19456 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 310 ms 51692 KB Output is correct
2 Correct 156 ms 51420 KB Output is correct
3 Correct 333 ms 51436 KB Output is correct
4 Correct 152 ms 51412 KB Output is correct
5 Correct 313 ms 49484 KB Output is correct
6 Correct 155 ms 51368 KB Output is correct
7 Correct 284 ms 49224 KB Output is correct
8 Correct 143 ms 49900 KB Output is correct
9 Correct 303 ms 45560 KB Output is correct
10 Correct 241 ms 44400 KB Output is correct
11 Correct 298 ms 45556 KB Output is correct
12 Correct 236 ms 46576 KB Output is correct
13 Correct 233 ms 44276 KB Output is correct
14 Correct 287 ms 46832 KB Output is correct
15 Correct 274 ms 47052 KB Output is correct
16 Correct 355 ms 44656 KB Output is correct
17 Correct 351 ms 45052 KB Output is correct
18 Correct 353 ms 45040 KB Output is correct
19 Correct 272 ms 46460 KB Output is correct
20 Correct 240 ms 47072 KB Output is correct
21 Correct 16 ms 19200 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 19200 KB Output is correct
2 Correct 16 ms 19200 KB Output is correct
3 Correct 16 ms 19200 KB Output is correct
4 Correct 16 ms 19200 KB Output is correct
5 Correct 18 ms 19200 KB Output is correct
6 Correct 16 ms 19200 KB Output is correct
7 Correct 16 ms 19200 KB Output is correct
8 Correct 16 ms 19200 KB Output is correct
9 Correct 18 ms 19200 KB Output is correct
10 Correct 16 ms 19200 KB Output is correct
11 Correct 18 ms 19456 KB Output is correct
12 Correct 17 ms 19456 KB Output is correct
13 Correct 18 ms 19456 KB Output is correct
14 Correct 19 ms 19456 KB Output is correct
15 Correct 22 ms 19456 KB Output is correct
16 Correct 19 ms 19456 KB Output is correct
17 Correct 19 ms 19456 KB Output is correct
18 Correct 22 ms 19456 KB Output is correct
19 Correct 21 ms 19456 KB Output is correct
20 Correct 20 ms 19456 KB Output is correct
21 Correct 19 ms 19456 KB Output is correct
22 Correct 19 ms 19456 KB Output is correct
23 Correct 18 ms 19456 KB Output is correct
24 Correct 18 ms 19456 KB Output is correct
25 Correct 18 ms 19456 KB Output is correct
26 Correct 17 ms 19456 KB Output is correct
27 Correct 17 ms 19456 KB Output is correct
28 Correct 20 ms 19456 KB Output is correct
29 Correct 20 ms 19456 KB Output is correct
30 Correct 20 ms 19456 KB Output is correct
31 Correct 310 ms 51692 KB Output is correct
32 Correct 156 ms 51420 KB Output is correct
33 Correct 333 ms 51436 KB Output is correct
34 Correct 152 ms 51412 KB Output is correct
35 Correct 313 ms 49484 KB Output is correct
36 Correct 155 ms 51368 KB Output is correct
37 Correct 284 ms 49224 KB Output is correct
38 Correct 143 ms 49900 KB Output is correct
39 Correct 303 ms 45560 KB Output is correct
40 Correct 241 ms 44400 KB Output is correct
41 Correct 298 ms 45556 KB Output is correct
42 Correct 236 ms 46576 KB Output is correct
43 Correct 233 ms 44276 KB Output is correct
44 Correct 287 ms 46832 KB Output is correct
45 Correct 274 ms 47052 KB Output is correct
46 Correct 355 ms 44656 KB Output is correct
47 Correct 351 ms 45052 KB Output is correct
48 Correct 353 ms 45040 KB Output is correct
49 Correct 272 ms 46460 KB Output is correct
50 Correct 240 ms 47072 KB Output is correct
51 Correct 16 ms 19200 KB Output is correct
52 Correct 359 ms 43176 KB Output is correct
53 Correct 285 ms 43128 KB Output is correct
54 Correct 269 ms 43000 KB Output is correct
55 Correct 314 ms 43128 KB Output is correct
56 Correct 258 ms 43000 KB Output is correct
57 Correct 339 ms 43128 KB Output is correct
58 Correct 253 ms 46188 KB Output is correct
59 Correct 256 ms 46444 KB Output is correct
60 Correct 292 ms 46572 KB Output is correct
61 Correct 370 ms 46700 KB Output is correct
62 Correct 155 ms 51436 KB Output is correct
63 Correct 163 ms 51436 KB Output is correct
64 Correct 143 ms 50284 KB Output is correct
65 Correct 148 ms 51360 KB Output is correct
66 Correct 189 ms 43380 KB Output is correct
67 Correct 279 ms 43376 KB Output is correct
68 Correct 187 ms 43368 KB Output is correct
69 Correct 224 ms 43372 KB Output is correct
70 Correct 188 ms 43372 KB Output is correct
71 Correct 189 ms 43368 KB Output is correct
72 Correct 218 ms 43368 KB Output is correct
73 Correct 234 ms 42988 KB Output is correct
74 Correct 184 ms 43368 KB Output is correct
75 Correct 195 ms 43376 KB Output is correct
76 Correct 325 ms 49508 KB Output is correct
77 Correct 427 ms 48744 KB Output is correct
78 Correct 242 ms 45424 KB Output is correct
79 Correct 298 ms 44184 KB Output is correct
80 Correct 304 ms 46824 KB Output is correct
81 Correct 323 ms 45620 KB Output is correct
82 Correct 355 ms 45588 KB Output is correct
83 Correct 256 ms 44280 KB Output is correct
84 Correct 239 ms 46596 KB Output is correct
85 Correct 294 ms 45812 KB Output is correct
86 Correct 233 ms 44148 KB Output is correct
87 Correct 311 ms 44788 KB Output is correct
88 Correct 241 ms 45940 KB Output is correct
89 Correct 221 ms 44280 KB Output is correct
90 Correct 300 ms 44228 KB Output is correct
91 Correct 230 ms 45364 KB Output is correct
92 Correct 225 ms 44916 KB Output is correct
93 Correct 226 ms 44424 KB Output is correct
94 Correct 262 ms 44320 KB Output is correct
95 Correct 285 ms 44780 KB Output is correct
96 Correct 289 ms 44552 KB Output is correct
97 Correct 226 ms 45136 KB Output is correct