Submission #619368

# Submission time Handle Problem Language Result Execution time Memory
619368 2022-08-02T11:27:06 Z HappyPacMan Dynamic Diameter (CEOI19_diameter) C++17
49 / 100
5000 ms 487472 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],tinz[maxn],toutz[maxn];
unordered_map<int,int> tin[maxn],tout[maxn],edgeRoot[maxn];
unordered_map<int,ll> costEdge[maxn];
ll tempResult[maxn];
priority_queue<pair<ll,int> > bestEdge[maxn],result; 
ll cost[maxn];
 
inline 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];
		}
	}
}
inline 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;
}
inline 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]++;
		}
	}
}
inline 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);
		}
	}
}
inline 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;
			tinz[w] = tin[cent][w];
			toutz[w] = tout[cent][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
inline 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;
}
inline 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]);
	}
}
inline 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));
	}
}
 
int32_t 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]){
			int z = edgeRoot[it][i];
			upd(it,1,0,timer[it]-1,tin[it][i],tout[it][i]-1,cost[i]);
			costEdge[it][z] = qry(it,1,0,timer[it]-1,tinz[z],toutz[z]);
			bestEdge[it].emplace(costEdge[it][z],z);
		}
	}
	for(int i=0;i<n;i++){
		vector<pair<ll,int> > best;
		while(!bestEdge[i].empty() && best.size() < 2){
			auto [u,v] = bestEdge[i].top();
			bestEdge[i].pop();
			if(costEdge[i][v] == u && (best.empty() || best.back() != make_pair(u,v))){
				best.emplace_back(u,v);
			}
		}
		ll sum = 0;
		for(auto it : best){
			sum += it.first;
		}
		for(auto it : best){
			bestEdge[i].emplace(it);
		}
		tempResult[i] = sum;
		result.emplace(tempResult[i],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];
		assert(partOf[i].size() <= 20);
		for(int it : partOf[i]){
			int z = edgeRoot[it][i];
			upd(it,1,0,timer[it]-1,tin[it][i],tout[it][i]-1,df);
			costEdge[it][z] = qry(it,1,0,timer[it]-1,tinz[z],toutz[z]);
			bestEdge[it].emplace(costEdge[it][z],z);
			vector<pair<ll,int> > best;
			while(!bestEdge[it].empty() && best.size() < 2){
				auto [u,v] = bestEdge[it].top();
				bestEdge[it].pop();
				if(costEdge[it][v] == u && (best.empty() || best.back() != make_pair(u,v))){
					best.emplace_back(u,v);
				}
			}
			ll sum = 0;
			for(auto it2 : best){
				sum += it2.first;
			}
			for(auto it2 : best){
				bestEdge[it].emplace(it2);
			}
			tempResult[it] = sum;
			result.emplace(tempResult[it],it);
		}
		cost[i] = j;
		while(true){
			auto [u,v] = result.top();
			if(tempResult[v] == u){
				break;
			}
			result.pop();
		}
		last = result.top().first;
		cout << result.top().first << "\n";
	}
}
# Verdict Execution time Memory Grader output
1 Correct 19 ms 34772 KB Output is correct
2 Correct 19 ms 34808 KB Output is correct
3 Correct 22 ms 34772 KB Output is correct
4 Correct 20 ms 34712 KB Output is correct
5 Correct 20 ms 34772 KB Output is correct
6 Correct 24 ms 34772 KB Output is correct
7 Correct 20 ms 34856 KB Output is correct
8 Correct 19 ms 34748 KB Output is correct
9 Correct 20 ms 34772 KB Output is correct
10 Correct 22 ms 34836 KB Output is correct
11 Correct 26 ms 34936 KB Output is correct
12 Correct 21 ms 34812 KB Output is correct
13 Correct 19 ms 34900 KB Output is correct
14 Correct 21 ms 34912 KB Output is correct
15 Correct 25 ms 34900 KB Output is correct
16 Correct 25 ms 34856 KB Output is correct
17 Correct 22 ms 34952 KB Output is correct
18 Correct 23 ms 34864 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 19 ms 34772 KB Output is correct
2 Correct 19 ms 34808 KB Output is correct
3 Correct 22 ms 34772 KB Output is correct
4 Correct 20 ms 34712 KB Output is correct
5 Correct 20 ms 34772 KB Output is correct
6 Correct 24 ms 34772 KB Output is correct
7 Correct 20 ms 34856 KB Output is correct
8 Correct 19 ms 34748 KB Output is correct
9 Correct 20 ms 34772 KB Output is correct
10 Correct 22 ms 34836 KB Output is correct
11 Correct 26 ms 34936 KB Output is correct
12 Correct 21 ms 34812 KB Output is correct
13 Correct 19 ms 34900 KB Output is correct
14 Correct 21 ms 34912 KB Output is correct
15 Correct 25 ms 34900 KB Output is correct
16 Correct 25 ms 34856 KB Output is correct
17 Correct 22 ms 34952 KB Output is correct
18 Correct 23 ms 34864 KB Output is correct
19 Correct 45 ms 36820 KB Output is correct
20 Correct 47 ms 37024 KB Output is correct
21 Correct 54 ms 37272 KB Output is correct
22 Correct 68 ms 38012 KB Output is correct
23 Correct 126 ms 44680 KB Output is correct
24 Correct 124 ms 48124 KB Output is correct
25 Correct 142 ms 50452 KB Output is correct
26 Correct 157 ms 52796 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 22 ms 34688 KB Output is correct
2 Correct 26 ms 34808 KB Output is correct
3 Correct 22 ms 34736 KB Output is correct
4 Correct 34 ms 34984 KB Output is correct
5 Correct 103 ms 35464 KB Output is correct
6 Correct 20 ms 34780 KB Output is correct
7 Correct 20 ms 35028 KB Output is correct
8 Correct 20 ms 34940 KB Output is correct
9 Correct 24 ms 35080 KB Output is correct
10 Correct 45 ms 35352 KB Output is correct
11 Correct 142 ms 36484 KB Output is correct
12 Correct 25 ms 37072 KB Output is correct
13 Correct 26 ms 37048 KB Output is correct
14 Correct 28 ms 37164 KB Output is correct
15 Correct 54 ms 37496 KB Output is correct
16 Correct 147 ms 38384 KB Output is correct
17 Correct 148 ms 82784 KB Output is correct
18 Correct 147 ms 82828 KB Output is correct
19 Correct 149 ms 82732 KB Output is correct
20 Correct 179 ms 83036 KB Output is correct
21 Correct 383 ms 91176 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 29 ms 37168 KB Output is correct
2 Correct 69 ms 37648 KB Output is correct
3 Correct 197 ms 39388 KB Output is correct
4 Correct 358 ms 41600 KB Output is correct
5 Correct 136 ms 66760 KB Output is correct
6 Correct 219 ms 67624 KB Output is correct
7 Correct 491 ms 71052 KB Output is correct
8 Correct 847 ms 75668 KB Output is correct
9 Correct 731 ms 225836 KB Output is correct
10 Correct 835 ms 226680 KB Output is correct
11 Correct 1271 ms 229396 KB Output is correct
12 Correct 1853 ms 234092 KB Output is correct
13 Correct 1549 ms 443660 KB Output is correct
14 Correct 1671 ms 445188 KB Output is correct
15 Correct 2415 ms 449884 KB Output is correct
16 Correct 2929 ms 450452 KB Output is correct
17 Correct 3820 ms 487472 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4564 ms 361500 KB Output is correct
2 Correct 4619 ms 372432 KB Output is correct
3 Execution timed out 5093 ms 370832 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 19 ms 34772 KB Output is correct
2 Correct 19 ms 34808 KB Output is correct
3 Correct 22 ms 34772 KB Output is correct
4 Correct 20 ms 34712 KB Output is correct
5 Correct 20 ms 34772 KB Output is correct
6 Correct 24 ms 34772 KB Output is correct
7 Correct 20 ms 34856 KB Output is correct
8 Correct 19 ms 34748 KB Output is correct
9 Correct 20 ms 34772 KB Output is correct
10 Correct 22 ms 34836 KB Output is correct
11 Correct 26 ms 34936 KB Output is correct
12 Correct 21 ms 34812 KB Output is correct
13 Correct 19 ms 34900 KB Output is correct
14 Correct 21 ms 34912 KB Output is correct
15 Correct 25 ms 34900 KB Output is correct
16 Correct 25 ms 34856 KB Output is correct
17 Correct 22 ms 34952 KB Output is correct
18 Correct 23 ms 34864 KB Output is correct
19 Correct 45 ms 36820 KB Output is correct
20 Correct 47 ms 37024 KB Output is correct
21 Correct 54 ms 37272 KB Output is correct
22 Correct 68 ms 38012 KB Output is correct
23 Correct 126 ms 44680 KB Output is correct
24 Correct 124 ms 48124 KB Output is correct
25 Correct 142 ms 50452 KB Output is correct
26 Correct 157 ms 52796 KB Output is correct
27 Correct 22 ms 34688 KB Output is correct
28 Correct 26 ms 34808 KB Output is correct
29 Correct 22 ms 34736 KB Output is correct
30 Correct 34 ms 34984 KB Output is correct
31 Correct 103 ms 35464 KB Output is correct
32 Correct 20 ms 34780 KB Output is correct
33 Correct 20 ms 35028 KB Output is correct
34 Correct 20 ms 34940 KB Output is correct
35 Correct 24 ms 35080 KB Output is correct
36 Correct 45 ms 35352 KB Output is correct
37 Correct 142 ms 36484 KB Output is correct
38 Correct 25 ms 37072 KB Output is correct
39 Correct 26 ms 37048 KB Output is correct
40 Correct 28 ms 37164 KB Output is correct
41 Correct 54 ms 37496 KB Output is correct
42 Correct 147 ms 38384 KB Output is correct
43 Correct 148 ms 82784 KB Output is correct
44 Correct 147 ms 82828 KB Output is correct
45 Correct 149 ms 82732 KB Output is correct
46 Correct 179 ms 83036 KB Output is correct
47 Correct 383 ms 91176 KB Output is correct
48 Correct 29 ms 37168 KB Output is correct
49 Correct 69 ms 37648 KB Output is correct
50 Correct 197 ms 39388 KB Output is correct
51 Correct 358 ms 41600 KB Output is correct
52 Correct 136 ms 66760 KB Output is correct
53 Correct 219 ms 67624 KB Output is correct
54 Correct 491 ms 71052 KB Output is correct
55 Correct 847 ms 75668 KB Output is correct
56 Correct 731 ms 225836 KB Output is correct
57 Correct 835 ms 226680 KB Output is correct
58 Correct 1271 ms 229396 KB Output is correct
59 Correct 1853 ms 234092 KB Output is correct
60 Correct 1549 ms 443660 KB Output is correct
61 Correct 1671 ms 445188 KB Output is correct
62 Correct 2415 ms 449884 KB Output is correct
63 Correct 2929 ms 450452 KB Output is correct
64 Correct 3820 ms 487472 KB Output is correct
65 Correct 4564 ms 361500 KB Output is correct
66 Correct 4619 ms 372432 KB Output is correct
67 Execution timed out 5093 ms 370832 KB Time limit exceeded
68 Halted 0 ms 0 KB -