Submission #207972

# Submission time Handle Problem Language Result Execution time Memory
207972 2020-03-09T14:43:42 Z E869120 Dynamic Diameter (CEOI19_diameter) C++14
55 / 100
2382 ms 44028 KB
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <functional>
using namespace std;
#pragma warning (disable: 4996)

class LazySegmentTree {
public:
	int size_ = 1;
	vector<long long> dat, lazy;

	void init(int sz) {
		while (size_ <= sz) size_ *= 2;
		dat.resize(size_ * 2, 0);
		lazy.resize(size_ * 2, 0);
	}
	void refresh(int u) {
		if (u < size_) {
			lazy[u * 2 + 0] += lazy[u];
			lazy[u * 2 + 1] += lazy[u];
			lazy[u] = 0;
			dat[u] = max(dat[u * 2] + lazy[u * 2], dat[u * 2 + 1] + lazy[u * 2 + 1]);
		}
		else {
			dat[u] += lazy[u];
			lazy[u] = 0;
		}
	}
	void add_(int l, int r, long long x, int a, int b, int u) {
		if (l <= a && b <= r) { lazy[u] += x; return; }
		if (r <= a || b <= l) return;
		refresh(u);
		add_(l, r, x, a, (a + b) >> 1, u * 2);
		add_(l, r, x, (a + b) >> 1, b, u * 2 + 1);
		refresh(u);
	}
	void add(int l, int r, long long x) {
		add_(l, r, x, 0, size_, 1);
	}
	long long query_(int l, int r, int a, int b, int u) {
		if (l <= a && b <= r) return dat[u] + lazy[u];
		if (r <= a || b <= l) return -(1LL << 60);
		refresh(u);
		long long v1 = query_(l, r, a, (a + b) >> 1, u * 2);
		long long v2 = query_(l, r, (a + b) >> 1, b, u * 2 + 1);
		refresh(u);
		return max(v1, v2);
	}
	long long query(int l, int r) {
		return query_(l, r, 0, size_, 1);
	}
};

// Input
long long N, A[1 << 18], B[1 << 18], C[1 << 18];
long long Q, D[1 << 18], E[1 << 18];
long long W;
vector<pair<int, long long>> X[1 << 18];

// Some Information
long long dist[1 << 18];

// Subtask 2
void dfs1(int pos, long long dep) {
	dist[pos] = dep;
	for (int i = 0; i < X[pos].size(); i++) {
		if (dist[X[pos][i].first] != (1LL << 60)) continue;
		dfs1(X[pos][i].first, dep + X[pos][i].second);
	}
}

void getdist(int pos) {
	for (int i = 1; i <= N; i++) dist[i] = (1LL << 60);
	dfs1(pos, 0);
}

long long solve1() {
	for (int i = 1; i <= N; i++) X[i].clear();
	for (int i = 1; i <= N - 1; i++) {
		X[A[i]].push_back(make_pair(B[i], C[i]));
		X[B[i]].push_back(make_pair(A[i], C[i]));
	}
	getdist(1);
	pair<long long, int> maxn1 = make_pair(-1, -1);
	for (int i = 1; i <= N; i++) maxn1 = max(maxn1, make_pair(dist[i], i));
	getdist(maxn1.second);
	pair<long long, int> maxn2 = make_pair(-1, -1);
	for (int i = 1; i <= N; i++) maxn2 = max(maxn2, make_pair(dist[i], i));
	return maxn2.first;
}

void solve_subtask2() {
	long long last = 0;
	for (int i = 1; i <= Q; i++) {
		D[i] = (D[i] + last) % (N - 1LL) + 1LL;
		E[i] = (E[i] + last) % W;
		C[D[i]] = E[i];
		last = solve1();
		printf("%lld\n", last);
	}
}

int cnts, cl[1 << 18], cr[1 << 18], depth[1 << 18], idx[1 << 18];
vector<int> Y[1 << 18];
LazySegmentTree Z;
set<pair<long long, int>> Set;

void dfs2(int pos, int dep) {
	depth[pos] = dep;
	cnts++; cl[pos] = cnts;
	for (int i = 0; i < X[pos].size(); i++) {
		if (cl[X[pos][i].first] >= 1) continue;
		Y[pos].push_back(X[pos][i].first);
		dfs2(X[pos][i].first, dep + 1);
	}
	cr[pos] = cnts;
}

void dfs3(int pos, int id) {
	idx[pos] = id;
	for (int i : Y[pos]) dfs3(i, id);
}

void solve_subtask5() {
	dfs2(1, 0);
	for (int i = 0; i < Y[1].size(); i++) dfs3(Y[1][i], Y[1][i]);

	Z.init(N + 2);
	for (int i = 1; i <= N - 1; i++) {
		if (depth[A[i]] > depth[B[i]]) swap(A[i], B[i]);
		Z.add(cl[B[i]], cr[B[i]] + 1, C[i]);
	}
	for (int i = 0; i < Y[1].size(); i++) {
		long long val = Z.query(cl[Y[1][i]], cr[Y[1][i]] + 1);
		Set.insert(make_pair(val, Y[1][i]));
	}

	long long last = 0;
	for (int i = 1; i <= Q; i++) {
		D[i] = (D[i] + last) % (N - 1LL) + 1LL;
		E[i] = (E[i] + last) % W;
		long long changes = E[i] - C[D[i]];
		long long pos = B[D[i]];
		long long root = idx[B[D[i]]];
		long long val1 = Z.query(cl[root], cr[root] + 1);
		Set.erase(make_pair(val1, root));
		Z.add(cl[pos], cr[pos] + 1, changes);
		long long val2 = Z.query(cl[root], cr[root] + 1);
		Set.insert(make_pair(val2, root));

		long long r = 0; auto itr = Set.end();
		for (int t = 1; t <= 2; t++) {
			if (itr == Set.begin()) break;
			itr--;
			r += (*itr).first;
		}
		last = r; C[D[i]] = E[i];
		printf("%lld\n", r);
	}
}

int main() {
	scanf("%lld%lld%lld", &N, &Q, &W);
	for (int i = 1; i <= N - 1; i++) {
		scanf("%lld%lld%lld", &A[i], &B[i], &C[i]);
		X[A[i]].push_back(make_pair(B[i], C[i])); 
		X[B[i]].push_back(make_pair(A[i], C[i])); 
	}
	for (int i = 1; i <= Q; i++) scanf("%lld%lld", &D[i], &E[i]);

	if (N <= 5000 && Q <= 5000) {
		solve_subtask2();
	}
	else {
		solve_subtask5();
	}
	return 0;
}

Compilation message

diameter.cpp:9:0: warning: ignoring #pragma warning  [-Wunknown-pragmas]
 #pragma warning (disable: 4996)
 
diameter.cpp: In function 'void dfs1(int, long long int)':
diameter.cpp:70:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < X[pos].size(); i++) {
                  ~~^~~~~~~~~~~~~~~
diameter.cpp: In function 'void dfs2(int, int)':
diameter.cpp:115:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < X[pos].size(); i++) {
                  ~~^~~~~~~~~~~~~~~
diameter.cpp: In function 'void solve_subtask5()':
diameter.cpp:130:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < Y[1].size(); i++) dfs3(Y[1][i], Y[1][i]);
                  ~~^~~~~~~~~~~~~
diameter.cpp:137:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < Y[1].size(); i++) {
                  ~~^~~~~~~~~~~~~
diameter.cpp: In function 'int main()':
diameter.cpp:167:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%lld%lld%lld", &N, &Q, &W);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
diameter.cpp:169:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld%lld%lld", &A[i], &B[i], &C[i]);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diameter.cpp:173:36: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for (int i = 1; i <= Q; i++) scanf("%lld%lld", &D[i], &E[i]);
                               ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 12 ms 12664 KB Output is correct
2 Correct 12 ms 12536 KB Output is correct
3 Correct 12 ms 12664 KB Output is correct
4 Correct 12 ms 12664 KB Output is correct
5 Correct 12 ms 12664 KB Output is correct
6 Correct 12 ms 12664 KB Output is correct
7 Correct 12 ms 12664 KB Output is correct
8 Correct 12 ms 12664 KB Output is correct
9 Correct 12 ms 12664 KB Output is correct
10 Correct 12 ms 12664 KB Output is correct
11 Correct 12 ms 12664 KB Output is correct
12 Correct 13 ms 12664 KB Output is correct
13 Correct 13 ms 12664 KB Output is correct
14 Correct 13 ms 12664 KB Output is correct
15 Correct 12 ms 12664 KB Output is correct
16 Correct 13 ms 12664 KB Output is correct
17 Correct 14 ms 12792 KB Output is correct
18 Correct 13 ms 12664 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 12 ms 12664 KB Output is correct
2 Correct 12 ms 12536 KB Output is correct
3 Correct 12 ms 12664 KB Output is correct
4 Correct 12 ms 12664 KB Output is correct
5 Correct 12 ms 12664 KB Output is correct
6 Correct 12 ms 12664 KB Output is correct
7 Correct 12 ms 12664 KB Output is correct
8 Correct 12 ms 12664 KB Output is correct
9 Correct 12 ms 12664 KB Output is correct
10 Correct 12 ms 12664 KB Output is correct
11 Correct 12 ms 12664 KB Output is correct
12 Correct 13 ms 12664 KB Output is correct
13 Correct 13 ms 12664 KB Output is correct
14 Correct 13 ms 12664 KB Output is correct
15 Correct 12 ms 12664 KB Output is correct
16 Correct 13 ms 12664 KB Output is correct
17 Correct 14 ms 12792 KB Output is correct
18 Correct 13 ms 12664 KB Output is correct
19 Correct 314 ms 12920 KB Output is correct
20 Correct 316 ms 13176 KB Output is correct
21 Correct 329 ms 12920 KB Output is correct
22 Correct 378 ms 13176 KB Output is correct
23 Correct 1989 ms 13304 KB Output is correct
24 Correct 2077 ms 13448 KB Output is correct
25 Correct 2202 ms 13432 KB Output is correct
26 Correct 2382 ms 13832 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 11 ms 12664 KB Output is correct
2 Correct 12 ms 12664 KB Output is correct
3 Correct 15 ms 12664 KB Output is correct
4 Correct 27 ms 13048 KB Output is correct
5 Correct 91 ms 15224 KB Output is correct
6 Correct 12 ms 12664 KB Output is correct
7 Correct 13 ms 12792 KB Output is correct
8 Correct 18 ms 12664 KB Output is correct
9 Correct 58 ms 12792 KB Output is correct
10 Correct 36 ms 13304 KB Output is correct
11 Correct 125 ms 15224 KB Output is correct
12 Correct 19 ms 13816 KB Output is correct
13 Correct 19 ms 13816 KB Output is correct
14 Correct 21 ms 13816 KB Output is correct
15 Correct 53 ms 14432 KB Output is correct
16 Correct 173 ms 16888 KB Output is correct
17 Correct 174 ms 33252 KB Output is correct
18 Correct 202 ms 33556 KB Output is correct
19 Correct 186 ms 33380 KB Output is correct
20 Correct 237 ms 33892 KB Output is correct
21 Correct 517 ms 36540 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 59 ms 12792 KB Output is correct
2 Incorrect 25 ms 13048 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 448 ms 31000 KB Output is correct
2 Correct 441 ms 34936 KB Output is correct
3 Correct 436 ms 34936 KB Output is correct
4 Correct 443 ms 34940 KB Output is correct
5 Correct 470 ms 35400 KB Output is correct
6 Correct 414 ms 37256 KB Output is correct
7 Correct 471 ms 38136 KB Output is correct
8 Correct 486 ms 38372 KB Output is correct
9 Correct 486 ms 38008 KB Output is correct
10 Correct 442 ms 38136 KB Output is correct
11 Correct 452 ms 38388 KB Output is correct
12 Correct 439 ms 39604 KB Output is correct
13 Correct 519 ms 43768 KB Output is correct
14 Correct 510 ms 44028 KB Output is correct
15 Correct 439 ms 43896 KB Output is correct
16 Correct 485 ms 43916 KB Output is correct
17 Correct 455 ms 43380 KB Output is correct
18 Correct 462 ms 41576 KB Output is correct
19 Correct 492 ms 43768 KB Output is correct
20 Correct 489 ms 43704 KB Output is correct
21 Correct 492 ms 43896 KB Output is correct
22 Correct 485 ms 43892 KB Output is correct
23 Correct 481 ms 43512 KB Output is correct
24 Correct 453 ms 41708 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 12 ms 12664 KB Output is correct
2 Correct 12 ms 12536 KB Output is correct
3 Correct 12 ms 12664 KB Output is correct
4 Correct 12 ms 12664 KB Output is correct
5 Correct 12 ms 12664 KB Output is correct
6 Correct 12 ms 12664 KB Output is correct
7 Correct 12 ms 12664 KB Output is correct
8 Correct 12 ms 12664 KB Output is correct
9 Correct 12 ms 12664 KB Output is correct
10 Correct 12 ms 12664 KB Output is correct
11 Correct 12 ms 12664 KB Output is correct
12 Correct 13 ms 12664 KB Output is correct
13 Correct 13 ms 12664 KB Output is correct
14 Correct 13 ms 12664 KB Output is correct
15 Correct 12 ms 12664 KB Output is correct
16 Correct 13 ms 12664 KB Output is correct
17 Correct 14 ms 12792 KB Output is correct
18 Correct 13 ms 12664 KB Output is correct
19 Correct 314 ms 12920 KB Output is correct
20 Correct 316 ms 13176 KB Output is correct
21 Correct 329 ms 12920 KB Output is correct
22 Correct 378 ms 13176 KB Output is correct
23 Correct 1989 ms 13304 KB Output is correct
24 Correct 2077 ms 13448 KB Output is correct
25 Correct 2202 ms 13432 KB Output is correct
26 Correct 2382 ms 13832 KB Output is correct
27 Correct 11 ms 12664 KB Output is correct
28 Correct 12 ms 12664 KB Output is correct
29 Correct 15 ms 12664 KB Output is correct
30 Correct 27 ms 13048 KB Output is correct
31 Correct 91 ms 15224 KB Output is correct
32 Correct 12 ms 12664 KB Output is correct
33 Correct 13 ms 12792 KB Output is correct
34 Correct 18 ms 12664 KB Output is correct
35 Correct 58 ms 12792 KB Output is correct
36 Correct 36 ms 13304 KB Output is correct
37 Correct 125 ms 15224 KB Output is correct
38 Correct 19 ms 13816 KB Output is correct
39 Correct 19 ms 13816 KB Output is correct
40 Correct 21 ms 13816 KB Output is correct
41 Correct 53 ms 14432 KB Output is correct
42 Correct 173 ms 16888 KB Output is correct
43 Correct 174 ms 33252 KB Output is correct
44 Correct 202 ms 33556 KB Output is correct
45 Correct 186 ms 33380 KB Output is correct
46 Correct 237 ms 33892 KB Output is correct
47 Correct 517 ms 36540 KB Output is correct
48 Correct 59 ms 12792 KB Output is correct
49 Incorrect 25 ms 13048 KB Output isn't correct
50 Halted 0 ms 0 KB -