Submission #116560

# Submission time Handle Problem Language Result Execution time Memory
116560 2019-06-13T00:05:29 Z kig9981 Regions (IOI09_regions) C++17
100 / 100
7694 ms 43248 KB
#include <bits/stdc++.h>
 
#ifdef NON_SUBMIT
#define TEST(n) (n)
#define tout cerr
#else
#define TEST(n) ((void)0)
#define tout cin
#endif
 
using namespace std;
 
const int rt=448;
vector<int> adj[200000], R[25000], O;
int node_cnt=-1, RV[200000], num[200000], fin[200000], sum[200000], sum2[200000], tree[200001];
pair<long long,long long> ans[rt][25000];
 
void add_tree(int n, int v)
{
	for(++n;n<=200000;n+=n&-n) tree[n]+=v;
}
 
int get_sum(int n)
{
	int ret=0;
	for(++n;n;n-=n&-n) ret+=tree[n];
	return ret;
}
 
int get_sum(int s, int e)
{
	return get_sum(e)-get_sum(s-1);
}
 
void dfs(int c)
{
	num[c]=++node_cnt;
	for(auto n: adj[c]) dfs(n);
	fin[c]=node_cnt;
}
 
void dfs2(int c, int v)
{
	sum[c]+=RV[c]==v;
	sum2[c]=RV[c]==v;
	for(auto n: adj[c]) {
		sum[n]=sum[c];
		dfs2(n,v);
		sum2[c]+=sum2[n];
	}
}
 
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	TEST(freopen("input.txt","r",stdin));
	TEST(freopen("output.txt","w",stdout));
	TEST(freopen("debug.txt","w",stderr));
	int N, M, Q, p;
	cin>>N>>M>>Q>>RV[0];
	R[--RV[0]].push_back(0);
	for(int i=1;i<N;i++) {
		cin>>p>>RV[i];
		adj[--p].push_back(i);
		R[--RV[i]].push_back(i);
	}
	dfs(0);
	for(int i=0;i<M;i++) if(R[i].size()>=rt) {
		sum[0]=0;
		dfs2(0,i);
		for(int j=0;j<N;j++) {
			ans[O.size()][RV[j]].first+=sum[j];
			ans[O.size()][RV[j]].second+=sum2[j];
		}
		O.push_back(i);
	}
	while(Q--) {
		int a, b;
		cin>>a>>b; --a; --b;
		if(R[a].size()>=rt) cout<<ans[lower_bound(O.begin(),O.end(),a)-O.begin()][b].first<<'\n';
		else if(R[b].size()>=rt) cout<<ans[lower_bound(O.begin(),O.end(),b)-O.begin()][a].second<<'\n';
		else {
			long long ans=0;
			for(auto r: R[b]) add_tree(num[r],1);
			for(auto r: R[a]) ans+=get_sum(num[r],fin[r]);
			for(auto r: R[b]) add_tree(num[r],-1);
			cout<<ans<<'\n';
		}
		cout.flush();
	}
	return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 6 ms 5760 KB Output is correct
2 Correct 6 ms 5632 KB Output is correct
3 Correct 7 ms 5760 KB Output is correct
4 Correct 8 ms 5572 KB Output is correct
5 Correct 14 ms 5760 KB Output is correct
6 Correct 27 ms 5676 KB Output is correct
7 Correct 32 ms 5632 KB Output is correct
8 Correct 40 ms 5760 KB Output is correct
9 Correct 31 ms 6196 KB Output is correct
10 Correct 104 ms 6144 KB Output is correct
11 Correct 139 ms 6448 KB Output is correct
12 Correct 112 ms 6912 KB Output is correct
13 Correct 196 ms 6528 KB Output is correct
14 Correct 356 ms 7040 KB Output is correct
15 Correct 393 ms 9080 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1458 ms 10752 KB Output is correct
2 Correct 1885 ms 9592 KB Output is correct
3 Correct 3638 ms 12664 KB Output is correct
4 Correct 382 ms 7168 KB Output is correct
5 Correct 398 ms 8440 KB Output is correct
6 Correct 762 ms 15676 KB Output is correct
7 Correct 2156 ms 12540 KB Output is correct
8 Correct 1328 ms 31136 KB Output is correct
9 Correct 4513 ms 14200 KB Output is correct
10 Correct 4968 ms 43248 KB Output is correct
11 Correct 7694 ms 14020 KB Output is correct
12 Correct 2044 ms 17792 KB Output is correct
13 Correct 2875 ms 18008 KB Output is correct
14 Correct 4056 ms 24324 KB Output is correct
15 Correct 6071 ms 22240 KB Output is correct
16 Correct 5670 ms 27692 KB Output is correct
17 Correct 4553 ms 33064 KB Output is correct