Submission #619054

# Submission time Handle Problem Language Result Execution time Memory
619054 2022-08-02T09:32:17 Z HappyPacMan Dynamic Diameter (CEOI19_diameter) C++14
31 / 100
5000 ms 426316 KB
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx2")
using namespace std;
using ll = long long;
const int maxn = 1e5 + 3;
vector<pair<int,int> > adj[maxn],edges;
vector<int> partOf[maxn];
vector<ll> seg[maxn],lazy[maxn];
bool isCent[maxn];
int subSz[maxn],centRoot,timer[maxn];
map<int,int> tin[maxn],tout[maxn],edgeRoot[maxn];
set<pair<ll,int> > bestEdge[maxn],result; 
ll cost[maxn];

void dfsSz(int u,int p){
	subSz[u] = 1;
	for(auto [v,w] : adj[u]){
		if(v != p && !isCent[v]){
			dfsSz(v,u);
			subSz[u] += subSz[v];
		}
	}
}
int fnCent(int u,int p,int s){
	for(auto [v,w] : adj[u]){
		if(v != p && !isCent[v] && subSz[v] > s/2){
			return fnCent(v,u,s);
		}
	}
	return u;
}
void dfsTour(int c,int u,int p){
	for(auto [v,w] : adj[u]){
		if(v != p && !isCent[v]){
			partOf[w].emplace_back(c);
			tin[c][w] = timer[c]++;
			dfsTour(c,v,u);
			tout[c][w] = timer[c]++;
		}
	}
}
void dfsEdgeRoot(int c,int d,int u,int p){
	for(auto [v,w] : adj[u]){
		if(v != p && !isCent[v]){
			edgeRoot[c][w] = d;
			dfsEdgeRoot(c,d,v,u);
		}
	}
}
void dfsCent(int u,int p){
	dfsSz(u,p);
	int cent = fnCent(u,u,subSz[u]);
	isCent[cent] = true;
	if(p != -1){
		centRoot = cent;
	}
	dfsTour(cent,cent,cent);
	for(auto [v,w] : adj[cent]){
		if(!isCent[v]){
			bestEdge[cent].emplace(0,w);
			edgeRoot[cent][w] = w;
			dfsEdgeRoot(cent,w,v,cent);
		}
	}
	seg[cent].resize(4*timer[cent]);
	lazy[cent].resize(4*timer[cent]);
	for(auto [v,w] : adj[cent]){
		if(!isCent[v]){
			dfsCent(v,cent);
		}
	}
}

// Segment Tree + Lazy Propagation
void push(int c,int i){
	lazy[c][i<<1] += lazy[c][i];
	seg[c][i<<1] += lazy[c][i];
	lazy[c][i<<1|1] += lazy[c][i];
	seg[c][i<<1|1] += lazy[c][i];
	lazy[c][i] = 0;
}
void upd(int c,int i,int l,int r,int ul,int ur,ll v){
	if(ul <= l && r <= ur){
		seg[c][i] += v;
		lazy[c][i] += v;
	}else if(ul > r || ur < l){
		return;
	}else{
		int m = (l+r)/2;
		push(c,i);
		upd(c,i<<1,l,m,ul,ur,v);
		upd(c,i<<1|1,m+1,r,ul,ur,v);
		seg[c][i] = max(seg[c][i<<1],seg[c][i<<1|1]);
	}
}
ll qry(int c,int i,int l,int r,int ql,int qr){
	if(ql <= l && r <= qr){
		return seg[c][i];
	}else if(ql > r || qr < l){
		return 0;
	}else{
		int m = (l+r)/2;
		push(c,i);
		return max(qry(c,i<<1,l,m,ql,qr),qry(c,i<<1|1,m+1,r,ql,qr));
	}
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n,q;
	ll w;
	cin >> n >> q >> w;
	for(int i=1;i<n;i++){
		int u,v;
		ll w;
		cin >> u >> v >> w;
		u--; v--;
		adj[u].emplace_back(v,i);
		adj[v].emplace_back(u,i);
		edges.emplace_back(u,v);
		cost[i] = w;
	}
	dfsCent(0,-1);
	for(int i=1;i<n;i++){
		for(int it : partOf[i]){
			bestEdge[it].erase(bestEdge[it].find(make_pair(qry(it,1,0,timer[it]-1,tin[it][edgeRoot[it][i]],tout[it][edgeRoot[it][i]]),edgeRoot[it][i])));
			upd(it,1,0,timer[it]-1,tin[it][i],timer[it]-1,cost[i]);
			upd(it,1,0,timer[it]-1,tout[it][i],timer[it]-1,-cost[i]);
			bestEdge[it].insert(make_pair(qry(it,1,0,timer[it]-1,tin[it][edgeRoot[it][i]],tout[it][edgeRoot[it][i]]),edgeRoot[it][i]));
		}
	}
	for(int i=0;i<n;i++){
		if(bestEdge[i].size() > 1){
			result.emplace((*prev(bestEdge[i].end())).first+(*prev(prev(bestEdge[i].end()))).first,i);
		}else if(bestEdge[i].size()){
			result.emplace((*prev(bestEdge[i].end())).first,i);
		}else{
			result.emplace(0,i);
		}
	}
	ll last = 0;
	while(q--){
		int i;
		ll j;
		cin >> i >> j;
		i = (i+last)%(n-1)+1;
		j = (j+last)%w;
		ll df = j-cost[i];
		for(int it : partOf[i]){
			if(bestEdge[it].size() > 1){
				result.erase(result.find(make_pair((*prev(bestEdge[it].end())).first+(*prev(prev(bestEdge[it].end()))).first,it)));
			}else if(bestEdge[it].size()){
				result.erase(result.find(make_pair((*prev(bestEdge[it].end())).first,it)));
			}else{
				result.erase(result.find(make_pair(0,it)));
			}
			bestEdge[it].erase(bestEdge[it].find(make_pair(qry(it,1,0,timer[it]-1,tin[it][edgeRoot[it][i]],tout[it][edgeRoot[it][i]]),edgeRoot[it][i])));
			upd(it,1,0,timer[it]-1,tin[it][i],timer[it]-1,df);
			upd(it,1,0,timer[it]-1,tout[it][i],timer[it]-1,-df);
			bestEdge[it].insert(make_pair(qry(it,1,0,timer[it]-1,tin[it][edgeRoot[it][i]],tout[it][edgeRoot[it][i]]),edgeRoot[it][i]));
			if(bestEdge[it].size() > 1){
				result.emplace((*prev(bestEdge[it].end())).first+(*prev(prev(bestEdge[it].end()))).first,it);
			}else if(bestEdge[it].size()){
				result.emplace((*prev(bestEdge[it].end())).first,it);
			}else{
				result.emplace(0,it);
			}
		}
		cost[i] = j;
		last = (*prev(result.end())).first;
		cout << (*prev(result.end())).first << "\n";
	}
}

Compilation message

diameter.cpp: In function 'void dfsSz(int, int)':
diameter.cpp:19:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   19 |  for(auto [v,w] : adj[u]){
      |           ^
diameter.cpp: In function 'int fnCent(int, int, int)':
diameter.cpp:27:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   27 |  for(auto [v,w] : adj[u]){
      |           ^
diameter.cpp: In function 'void dfsTour(int, int, int)':
diameter.cpp:35:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   35 |  for(auto [v,w] : adj[u]){
      |           ^
diameter.cpp: In function 'void dfsEdgeRoot(int, int, int, int)':
diameter.cpp:45:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   45 |  for(auto [v,w] : adj[u]){
      |           ^
diameter.cpp: In function 'void dfsCent(int, int)':
diameter.cpp:60:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   60 |  for(auto [v,w] : adj[cent]){
      |           ^
diameter.cpp:69:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   69 |  for(auto [v,w] : adj[cent]){
      |           ^
# Verdict Execution time Memory Grader output
1 Correct 20 ms 28500 KB Output is correct
2 Correct 14 ms 28432 KB Output is correct
3 Correct 14 ms 28468 KB Output is correct
4 Correct 15 ms 28504 KB Output is correct
5 Correct 13 ms 28452 KB Output is correct
6 Correct 14 ms 28564 KB Output is correct
7 Correct 21 ms 28500 KB Output is correct
8 Correct 15 ms 28576 KB Output is correct
9 Correct 20 ms 28500 KB Output is correct
10 Correct 19 ms 28500 KB Output is correct
11 Correct 17 ms 28536 KB Output is correct
12 Correct 16 ms 28588 KB Output is correct
13 Correct 14 ms 28520 KB Output is correct
14 Correct 14 ms 28616 KB Output is correct
15 Correct 15 ms 28504 KB Output is correct
16 Correct 17 ms 28608 KB Output is correct
17 Correct 16 ms 28628 KB Output is correct
18 Correct 16 ms 28628 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 20 ms 28500 KB Output is correct
2 Correct 14 ms 28432 KB Output is correct
3 Correct 14 ms 28468 KB Output is correct
4 Correct 15 ms 28504 KB Output is correct
5 Correct 13 ms 28452 KB Output is correct
6 Correct 14 ms 28564 KB Output is correct
7 Correct 21 ms 28500 KB Output is correct
8 Correct 15 ms 28576 KB Output is correct
9 Correct 20 ms 28500 KB Output is correct
10 Correct 19 ms 28500 KB Output is correct
11 Correct 17 ms 28536 KB Output is correct
12 Correct 16 ms 28588 KB Output is correct
13 Correct 14 ms 28520 KB Output is correct
14 Correct 14 ms 28616 KB Output is correct
15 Correct 15 ms 28504 KB Output is correct
16 Correct 17 ms 28608 KB Output is correct
17 Correct 16 ms 28628 KB Output is correct
18 Correct 16 ms 28628 KB Output is correct
19 Correct 63 ms 29972 KB Output is correct
20 Correct 74 ms 30256 KB Output is correct
21 Correct 96 ms 30556 KB Output is correct
22 Correct 96 ms 31004 KB Output is correct
23 Correct 160 ms 37580 KB Output is correct
24 Correct 235 ms 40384 KB Output is correct
25 Correct 318 ms 42052 KB Output is correct
26 Correct 310 ms 44180 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 16 ms 28500 KB Output is correct
2 Correct 17 ms 28500 KB Output is correct
3 Correct 21 ms 28504 KB Output is correct
4 Correct 47 ms 28596 KB Output is correct
5 Correct 122 ms 28916 KB Output is correct
6 Correct 17 ms 28500 KB Output is correct
7 Correct 20 ms 28732 KB Output is correct
8 Correct 21 ms 28664 KB Output is correct
9 Correct 20 ms 28768 KB Output is correct
10 Correct 58 ms 28756 KB Output is correct
11 Correct 208 ms 29100 KB Output is correct
12 Correct 36 ms 30896 KB Output is correct
13 Correct 31 ms 30860 KB Output is correct
14 Correct 38 ms 30900 KB Output is correct
15 Correct 89 ms 30996 KB Output is correct
16 Correct 362 ms 31416 KB Output is correct
17 Correct 484 ms 76632 KB Output is correct
18 Correct 480 ms 76760 KB Output is correct
19 Correct 463 ms 76632 KB Output is correct
20 Correct 587 ms 76760 KB Output is correct
21 Correct 1186 ms 77356 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 34 ms 30600 KB Output is correct
2 Correct 105 ms 30712 KB Output is correct
3 Correct 331 ms 30952 KB Output is correct
4 Correct 649 ms 31200 KB Output is correct
5 Correct 224 ms 59272 KB Output is correct
6 Correct 371 ms 59344 KB Output is correct
7 Correct 1036 ms 59504 KB Output is correct
8 Correct 1887 ms 59852 KB Output is correct
9 Correct 1442 ms 213856 KB Output is correct
10 Correct 1603 ms 213992 KB Output is correct
11 Correct 2643 ms 214156 KB Output is correct
12 Correct 4153 ms 214532 KB Output is correct
13 Correct 2881 ms 425924 KB Output is correct
14 Correct 3361 ms 425932 KB Output is correct
15 Correct 4867 ms 426160 KB Output is correct
16 Execution timed out 5050 ms 426316 KB Time limit exceeded
17 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 5063 ms 320880 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 20 ms 28500 KB Output is correct
2 Correct 14 ms 28432 KB Output is correct
3 Correct 14 ms 28468 KB Output is correct
4 Correct 15 ms 28504 KB Output is correct
5 Correct 13 ms 28452 KB Output is correct
6 Correct 14 ms 28564 KB Output is correct
7 Correct 21 ms 28500 KB Output is correct
8 Correct 15 ms 28576 KB Output is correct
9 Correct 20 ms 28500 KB Output is correct
10 Correct 19 ms 28500 KB Output is correct
11 Correct 17 ms 28536 KB Output is correct
12 Correct 16 ms 28588 KB Output is correct
13 Correct 14 ms 28520 KB Output is correct
14 Correct 14 ms 28616 KB Output is correct
15 Correct 15 ms 28504 KB Output is correct
16 Correct 17 ms 28608 KB Output is correct
17 Correct 16 ms 28628 KB Output is correct
18 Correct 16 ms 28628 KB Output is correct
19 Correct 63 ms 29972 KB Output is correct
20 Correct 74 ms 30256 KB Output is correct
21 Correct 96 ms 30556 KB Output is correct
22 Correct 96 ms 31004 KB Output is correct
23 Correct 160 ms 37580 KB Output is correct
24 Correct 235 ms 40384 KB Output is correct
25 Correct 318 ms 42052 KB Output is correct
26 Correct 310 ms 44180 KB Output is correct
27 Correct 16 ms 28500 KB Output is correct
28 Correct 17 ms 28500 KB Output is correct
29 Correct 21 ms 28504 KB Output is correct
30 Correct 47 ms 28596 KB Output is correct
31 Correct 122 ms 28916 KB Output is correct
32 Correct 17 ms 28500 KB Output is correct
33 Correct 20 ms 28732 KB Output is correct
34 Correct 21 ms 28664 KB Output is correct
35 Correct 20 ms 28768 KB Output is correct
36 Correct 58 ms 28756 KB Output is correct
37 Correct 208 ms 29100 KB Output is correct
38 Correct 36 ms 30896 KB Output is correct
39 Correct 31 ms 30860 KB Output is correct
40 Correct 38 ms 30900 KB Output is correct
41 Correct 89 ms 30996 KB Output is correct
42 Correct 362 ms 31416 KB Output is correct
43 Correct 484 ms 76632 KB Output is correct
44 Correct 480 ms 76760 KB Output is correct
45 Correct 463 ms 76632 KB Output is correct
46 Correct 587 ms 76760 KB Output is correct
47 Correct 1186 ms 77356 KB Output is correct
48 Correct 34 ms 30600 KB Output is correct
49 Correct 105 ms 30712 KB Output is correct
50 Correct 331 ms 30952 KB Output is correct
51 Correct 649 ms 31200 KB Output is correct
52 Correct 224 ms 59272 KB Output is correct
53 Correct 371 ms 59344 KB Output is correct
54 Correct 1036 ms 59504 KB Output is correct
55 Correct 1887 ms 59852 KB Output is correct
56 Correct 1442 ms 213856 KB Output is correct
57 Correct 1603 ms 213992 KB Output is correct
58 Correct 2643 ms 214156 KB Output is correct
59 Correct 4153 ms 214532 KB Output is correct
60 Correct 2881 ms 425924 KB Output is correct
61 Correct 3361 ms 425932 KB Output is correct
62 Correct 4867 ms 426160 KB Output is correct
63 Execution timed out 5050 ms 426316 KB Time limit exceeded
64 Halted 0 ms 0 KB -