답안 #390185

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
390185 2021-04-15T14:21:33 Z arwaeystoamneg Regions (IOI09_regions) C++17
100 / 100
4646 ms 67404 KB
// EXPLOSION!
#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
#include<unordered_set>
#include<unordered_map>
#include<chrono>

using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<pair<int, int>> vpi;
typedef vector<pair<ll, ll>> vpll;

#define FOR(i,a,b) for (int i = (a); i < (b); ++i)
#define F0R(i,a) FOR(i,0,a)
#define ROF(i,a,b) for (int i = (b)-1; i >= (a); --i)
#define R0F(i,a) ROF(i,0,a)
#define trav(a,x) for (auto& a: x)

#define pb push_back
#define mp make_pair
#define rsz resize
#define sz(x) int(x.size())
#define all(x) x.begin(),x.end()
#define f first
#define s second
#define cont continue
//#define endl '\n'
//#define ednl '\n'
#define test int testc;cin>>testc;while(testc--)
#define pr(a, b) trav(x,a)cerr << x << b; cerr << endl;
#define message cout << "Hello World" << endl;
const int dx[4] = { 1,0,-1,0 }, dy[4] = { 0,1,0,-1 }; // for every grid problem!!
const ll linf = 4000000000000000000LL;
const ll inf = 1000000007;//998244353    

void pv(vi a) { trav(x, a)cout << x << " "; cout << endl; }void pv(vll a) { trav(x, a)cout << x << " "; cout << endl; }void pv(vector<vi>a) {
	F0R(i, sz(a)) { cout << i << endl; pv(a[i]); cout << endl; }
}void pv(vector<vll>a) { F0R(i, sz(a)) { cout << i << endl; pv(a[i]); }cout << endl; }void pv(vector<string>a) { trav(x, a)cout << x << endl; cout << endl; }
void setIO(string s) {
	ios_base::sync_with_stdio(0); cin.tie(0);
	if (sz(s))
	{
		freopen((s + ".in").c_str(), "r", stdin);
		if (s != "test1")
			freopen((s + ".out").c_str(), "w", stdout);
	}
}

const int MAX = 2e5 + 3, MAXK = 25e3 + 5;
vi adj[MAX], c[MAXK], d[MAXK];
int n, k, q, a[MAX], sizes[MAX], po = 0, tin[MAX], timenow;
void dfs(int i, int p = -1)
{
	c[a[i]].pb(i);
	tin[i] = timenow++;
	sizes[i] = 1;
	trav(x, adj[i])
	{
		if (x == p)continue;
		dfs(x, i);
		sizes[i] += sizes[x];
	}
}
map<int, int>ans[MAXK];
vi dp[MAXK];
void dfs(int i, int p, int t)
{
	if (a[i] == t)dp[t][i]++;
	trav(x, adj[i])
	{
		if (x == p)continue;
		dp[t][x] += dp[t][i];
		dfs(x, i, t);
	}
}
int main()
{
	setIO("");
	cin >> n >> k >> q;
	cin >> a[0];
	a[0]--;
	FOR(i, 1, n)
	{
		int p;
		cin >> p;
		adj[i].pb(--p);
		adj[p].pb(i);
		cin >> a[i];
		a[i]--;
	}
	dfs(0);
	int sq = 450;
	F0R(i, k)
	{
		trav(x, c[i])d[i].pb(tin[x]);
	}
	F0R(i, k)
	{
		if (sz(c[i]) > sq)
		{
			dp[i].rsz(n);
			dfs(0, -1, i);
		}
	}
	while (q--)
	{
		int x, y;
		cin >> x >> y;
		x--, y--;
		if (ans[x].find(y) != ans[x].end())
		{
			cout << ans[x][y] << endl;
		}
		else if (sz(c[y]) < sq && sz(c[x]) > sq)
		{
			int res = 0;
			trav(t, c[y])
			{
				res += dp[x][t];
			}
			ans[x][y] = res;
			cout << res << endl;
		}
		else
		{
			int res = 0;
			trav(t, c[x])
			{
				res += upper_bound(all(d[y]), tin[t] + sizes[t] - 1) - lower_bound(all(d[y]), tin[t]);
			}
			ans[x][y] = res;
			cout << res << endl;
		}
	}

}

Compilation message

regions.cpp: In function 'void setIO(std::string)':
regions.cpp:48:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   48 |   freopen((s + ".in").c_str(), "r", stdin);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
regions.cpp:50:11: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   50 |    freopen((s + ".out").c_str(), "w", stdout);
      |    ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 7880 KB Output is correct
2 Correct 5 ms 7880 KB Output is correct
3 Correct 6 ms 7880 KB Output is correct
4 Correct 8 ms 7880 KB Output is correct
5 Correct 11 ms 8008 KB Output is correct
6 Correct 29 ms 8080 KB Output is correct
7 Correct 36 ms 8092 KB Output is correct
8 Correct 50 ms 8128 KB Output is correct
9 Correct 58 ms 8748 KB Output is correct
10 Correct 119 ms 8768 KB Output is correct
11 Correct 124 ms 9216 KB Output is correct
12 Correct 141 ms 10020 KB Output is correct
13 Correct 232 ms 9908 KB Output is correct
14 Correct 290 ms 10228 KB Output is correct
15 Correct 272 ms 13376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1294 ms 19236 KB Output is correct
2 Correct 1468 ms 17964 KB Output is correct
3 Correct 2348 ms 22204 KB Output is correct
4 Correct 282 ms 11100 KB Output is correct
5 Correct 467 ms 13176 KB Output is correct
6 Correct 768 ms 25184 KB Output is correct
7 Correct 1040 ms 17120 KB Output is correct
8 Correct 1506 ms 61452 KB Output is correct
9 Correct 2520 ms 24236 KB Output is correct
10 Correct 4322 ms 67404 KB Output is correct
11 Correct 4646 ms 29160 KB Output is correct
12 Correct 1419 ms 24052 KB Output is correct
13 Correct 2370 ms 27040 KB Output is correct
14 Correct 2935 ms 43556 KB Output is correct
15 Correct 3826 ms 35032 KB Output is correct
16 Correct 3711 ms 44836 KB Output is correct
17 Correct 3922 ms 58920 KB Output is correct