답안 #390182

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
390182 2021-04-15T14:14:06 Z arwaeystoamneg Regions (IOI09_regions) C++17
35 / 100
5174 ms 67636 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] = 1;
	trav(x, adj[i])
	{
		if (x == p)continue;
		dfs(x, i, t);
		dp[t][i] += dp[t][x];
	}
}
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 7 ms 7976 KB Output is correct
4 Correct 9 ms 7880 KB Output is correct
5 Correct 16 ms 8020 KB Output is correct
6 Correct 31 ms 8088 KB Output is correct
7 Correct 33 ms 8128 KB Output is correct
8 Correct 30 ms 8176 KB Output is correct
9 Correct 75 ms 8720 KB Output is correct
10 Correct 95 ms 8868 KB Output is correct
11 Correct 161 ms 9328 KB Output is correct
12 Correct 152 ms 9772 KB Output is correct
13 Correct 236 ms 10012 KB Output is correct
14 Correct 299 ms 10260 KB Output is correct
15 Correct 324 ms 13412 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1497 ms 19312 KB Output isn't correct
2 Incorrect 1707 ms 17944 KB Output isn't correct
3 Incorrect 2630 ms 21892 KB Output isn't correct
4 Correct 314 ms 11012 KB Output is correct
5 Correct 466 ms 13232 KB Output is correct
6 Incorrect 698 ms 25272 KB Output isn't correct
7 Incorrect 927 ms 17036 KB Output isn't correct
8 Incorrect 1469 ms 61348 KB Output isn't correct
9 Correct 2932 ms 24188 KB Output is correct
10 Incorrect 5174 ms 67636 KB Output isn't correct
11 Correct 4611 ms 29224 KB Output is correct
12 Incorrect 1733 ms 24140 KB Output isn't correct
13 Incorrect 2317 ms 26964 KB Output isn't correct
14 Incorrect 3140 ms 43480 KB Output isn't correct
15 Incorrect 3494 ms 35236 KB Output isn't correct
16 Incorrect 3103 ms 44796 KB Output isn't correct
17 Incorrect 3268 ms 58872 KB Output isn't correct