답안 #431888

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
431888 2021-06-17T16:42:38 Z amunduzbaev Regions (IOI09_regions) C++14
0 / 100
8000 ms 131076 KB
/* made by amunduzbaev */
 
#include "bits/stdc++.h"
 
using namespace std;
 
//~ #include <ext/pb_ds/assoc_container.hpp>
//~ #include <ext/pb_ds/tree_policy.hpp>
//~ using namespace __gnu_pbds;
//~ template<class T> using oset = tree<T, 
//~ null_type, less_equal<T>, rb_tree_tag, 
//~ tree_order_statistics_node_update>;
 
#define ff first
#define ss second
#define pb push_back
#define mp make_pair
#define ub upper_bound
#define lb lower_bound
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(),x.rend()
#define NeedForSpeed ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define vv vector
#define mem(arr, v) memset(arr, v, sizeof arr)
#define int long long
#define degub(x) cout<<#x<<" : "<<x<<"\n"
#define GG cout<<"here"<<endl;
 
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii; 
typedef vector<int> vii;
typedef vector<pii> vpii;
template<class T> bool umin(T& a, const T& b) { return a > b ? a = b, true : false; }
template<class T> bool umax(T& a, const T& b) { return a < b ? a = b, true : false; }
template<int sz> using tut = array<int, sz>;
void usaco(string s) { freopen((s+".in").c_str(),"r",stdin);  
	freopen((s+".out").c_str(),"w",stdout); NeedForSpeed }
 
const int N = 2e5+5;
const int mod = 1e9+7;
const ll inf = 1e18;
const ld Pi = acos(-1);
const int B = 500;
 
#define MULTI 0
int n, m, k, t, q, ans, res, a[N];
int heavy[N], last[N], id[N];
int bs[N / B + 10][N];
int sb[N][N / B + 10];
vii edges[N], cnt[N];

//~ BIG_SMALL BIG_BIG
int cur;
void bsdfs(int u, int p = -1, int cnt = 0){
	//~ cout<<cur<<" "<<id[a[u]]<<" "<<a[u]<<" "<<cnt<<"\n";
	bs[cur][a[u]] += cnt;
	if(id[a[u]] == cur) cnt++;
	for(auto x : edges[u]) bsdfs(x, u, cnt);
}

//~ SMALL_BIG
map<int, int> sbdfs(int u, int p = -1){
	map<int, int> cnt;
	if(heavy[a[u]]) cnt[a[u]]++;
	for(auto x : edges[u]) {
		map<int, int> tmp = sbdfs(x, u);
		if(sz(tmp) > sz(cnt)) swap(cnt, tmp);
		for(auto x : tmp) cnt[x.ff] += x.ss;
	}
	
	if(!heavy[a[u]]){
		for(auto x : cnt) sb[a[u]][x.ff] += x.ss;
	} return cnt;
}

int tin[N], tout[N];
void dfs(int u, int p = -1){
	tin[u] = t++;
	for(auto x : edges[u]) dfs(x, u);
	tout[u] = t - 1;
}

bool par(int a, int b) { return (tin[a] <= tin[b] && tout[b] <= tout[a]); }

void solve(int t_case){
	cin>>n>>m>>q;
	cin>>a[1];
	for(int i=2;i<=n;i++){
		int p; cin>>p>>a[i];
		edges[p].pb(i);
	}
	
	for(int i=1;i<=n;i++) cnt[a[i]].pb(i);
	int last = 1;
	for(int i=1;i<=m;i++){
		if(sz(cnt[i]) > B) heavy[i] = 1, id[i] = last++;
	}
	
	for(int i=1;i<last;i++) cur = i, bsdfs(1);
	sbdfs(1), dfs(1);

	for(int i=1;i<=q;i++){
		int x, b; cin>>x>>b;
		if(heavy[a[x]]) cout<<bs[id[a[x]]][a[b]]<<endl;
		else if(heavy[a[b]]) cout<<sb[a[x]][a[b]]<<endl;
		else { res = 0;
			//~ SMALL_SMALL
			for(auto xx : cnt[a[x]])
				for(auto y : cnt[a[b]]) res += par(xx, y);
			cout<<res<<endl;
		}
	}
}

signed main(){
	NeedForSpeed
	if(MULTI){
		int t; cin>>t;
		for(int t_case = 1; t_case <= t; t_case++) solve(t_case);
	} else solve(1);
	return 0;
}

Compilation message

regions.cpp: In function 'void usaco(std::string)':
regions.cpp:38:31: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   38 | void usaco(string s) { freopen((s+".in").c_str(),"r",stdin);
      |                        ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
regions.cpp:39:9: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   39 |  freopen((s+".out").c_str(),"w",stdout); NeedForSpeed }
      |  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 9672 KB Output isn't correct
2 Incorrect 6 ms 9672 KB Output isn't correct
3 Incorrect 7 ms 9736 KB Output isn't correct
4 Incorrect 10 ms 9664 KB Output isn't correct
5 Incorrect 12 ms 9672 KB Output isn't correct
6 Incorrect 25 ms 9884 KB Output isn't correct
7 Incorrect 33 ms 9800 KB Output isn't correct
8 Incorrect 55 ms 9800 KB Output isn't correct
9 Incorrect 35 ms 11008 KB Output isn't correct
10 Incorrect 71 ms 10384 KB Output isn't correct
11 Incorrect 215 ms 10800 KB Output isn't correct
12 Incorrect 240 ms 11996 KB Output isn't correct
13 Incorrect 446 ms 11096 KB Output isn't correct
14 Incorrect 1446 ms 11772 KB Output isn't correct
15 Incorrect 1403 ms 20004 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6339 ms 18480 KB Output isn't correct
2 Incorrect 4931 ms 15432 KB Output isn't correct
3 Execution timed out 8018 ms 23876 KB Time limit exceeded
4 Incorrect 593 ms 11972 KB Output isn't correct
5 Incorrect 705 ms 16948 KB Output isn't correct
6 Execution timed out 8074 ms 13888 KB Time limit exceeded
7 Incorrect 7723 ms 15040 KB Output isn't correct
8 Execution timed out 8096 ms 29076 KB Time limit exceeded
9 Execution timed out 8032 ms 23228 KB Time limit exceeded
10 Execution timed out 8045 ms 37816 KB Time limit exceeded
11 Execution timed out 8028 ms 21568 KB Time limit exceeded
12 Incorrect 3732 ms 74044 KB Output isn't correct
13 Incorrect 5344 ms 76412 KB Output isn't correct
14 Incorrect 4446 ms 91784 KB Output isn't correct
15 Execution timed out 8037 ms 117508 KB Time limit exceeded
16 Runtime error 139 ms 131076 KB Execution killed with signal 9
17 Incorrect 5745 ms 125388 KB Output isn't correct