답안 #390186

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
390186 2021-04-15T14:23:09 Z arwaeystoamneg Regions (IOI09_regions) C++17
100 / 100
4587 ms 54944 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 = 700;
	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 8 ms 7880 KB Output is correct
4 Correct 11 ms 7976 KB Output is correct
5 Correct 13 ms 8008 KB Output is correct
6 Correct 31 ms 8100 KB Output is correct
7 Correct 42 ms 8064 KB Output is correct
8 Correct 39 ms 8136 KB Output is correct
9 Correct 58 ms 8920 KB Output is correct
10 Correct 84 ms 8828 KB Output is correct
11 Correct 157 ms 9184 KB Output is correct
12 Correct 194 ms 9792 KB Output is correct
13 Correct 232 ms 9864 KB Output is correct
14 Correct 196 ms 10432 KB Output is correct
15 Correct 342 ms 13356 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1328 ms 15416 KB Output is correct
2 Correct 1545 ms 17044 KB Output is correct
3 Correct 2159 ms 22408 KB Output is correct
4 Correct 362 ms 10972 KB Output is correct
5 Correct 413 ms 13220 KB Output is correct
6 Correct 754 ms 12848 KB Output is correct
7 Correct 860 ms 13200 KB Output is correct
8 Correct 1585 ms 21008 KB Output is correct
9 Correct 2359 ms 24200 KB Output is correct
10 Correct 4587 ms 31124 KB Output is correct
11 Correct 4336 ms 29252 KB Output is correct
12 Correct 1452 ms 24224 KB Output is correct
13 Correct 2166 ms 27008 KB Output is correct
14 Correct 3078 ms 39772 KB Output is correct
15 Correct 3925 ms 35144 KB Output is correct
16 Correct 3309 ms 44792 KB Output is correct
17 Correct 3364 ms 54944 KB Output is correct