Submission #619232

# Submission time Handle Problem Language Result Execution time Memory
619232 2022-08-02T10:36:34 Z HappyPacMan Dynamic Diameter (CEOI19_diameter) C++14
49 / 100
5000 ms 486868 KB
#include <bits/stdc++.h>
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];
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];
 
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));
	}
}
 
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,tin[it][z],tout[it][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,tin[it][z],tout[it][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";
	}
}

Compilation message

diameter.cpp: In function 'void dfsSz(int, int)':
diameter.cpp:18:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   18 |  for(auto [v,w] : adj[u]){
      |           ^
diameter.cpp: In function 'int fnCent(int, int, int)':
diameter.cpp:26:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   26 |  for(auto [v,w] : adj[u]){
      |           ^
diameter.cpp: In function 'void dfsTour(int, int, int)':
diameter.cpp:34:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   34 |  for(auto [v,w] : adj[u]){
      |           ^
diameter.cpp: In function 'void dfsEdgeRoot(int, int, int, int)':
diameter.cpp:44:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   44 |  for(auto [v,w] : adj[u]){
      |           ^
diameter.cpp: In function 'void dfsCent(int, int)':
diameter.cpp:59:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   59 |  for(auto [v,w] : adj[cent]){
      |           ^
diameter.cpp:68:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   68 |  for(auto [v,w] : adj[cent]){
      |           ^
diameter.cpp: In function 'int32_t main()':
diameter.cpp:138:9: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  138 |    auto [u,v] = bestEdge[i].top();
      |         ^
diameter.cpp:170:10: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  170 |     auto [u,v] = bestEdge[it].top();
      |          ^
diameter.cpp:188:9: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  188 |    auto [u,v] = result.top();
      |         ^
# Verdict Execution time Memory Grader output
1 Correct 25 ms 34772 KB Output is correct
2 Correct 21 ms 34780 KB Output is correct
3 Correct 23 ms 34708 KB Output is correct
4 Correct 23 ms 34780 KB Output is correct
5 Correct 23 ms 34900 KB Output is correct
6 Correct 24 ms 34776 KB Output is correct
7 Correct 20 ms 34772 KB Output is correct
8 Correct 20 ms 34832 KB Output is correct
9 Correct 19 ms 34768 KB Output is correct
10 Correct 26 ms 34760 KB Output is correct
11 Correct 24 ms 34772 KB Output is correct
12 Correct 26 ms 34740 KB Output is correct
13 Correct 25 ms 34916 KB Output is correct
14 Correct 23 ms 34856 KB Output is correct
15 Correct 25 ms 34900 KB Output is correct
16 Correct 25 ms 34904 KB Output is correct
17 Correct 22 ms 34912 KB Output is correct
18 Correct 24 ms 34976 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 25 ms 34772 KB Output is correct
2 Correct 21 ms 34780 KB Output is correct
3 Correct 23 ms 34708 KB Output is correct
4 Correct 23 ms 34780 KB Output is correct
5 Correct 23 ms 34900 KB Output is correct
6 Correct 24 ms 34776 KB Output is correct
7 Correct 20 ms 34772 KB Output is correct
8 Correct 20 ms 34832 KB Output is correct
9 Correct 19 ms 34768 KB Output is correct
10 Correct 26 ms 34760 KB Output is correct
11 Correct 24 ms 34772 KB Output is correct
12 Correct 26 ms 34740 KB Output is correct
13 Correct 25 ms 34916 KB Output is correct
14 Correct 23 ms 34856 KB Output is correct
15 Correct 25 ms 34900 KB Output is correct
16 Correct 25 ms 34904 KB Output is correct
17 Correct 22 ms 34912 KB Output is correct
18 Correct 24 ms 34976 KB Output is correct
19 Correct 52 ms 36776 KB Output is correct
20 Correct 66 ms 37060 KB Output is correct
21 Correct 80 ms 37376 KB Output is correct
22 Correct 78 ms 38028 KB Output is correct
23 Correct 120 ms 44780 KB Output is correct
24 Correct 157 ms 48008 KB Output is correct
25 Correct 233 ms 50544 KB Output is correct
26 Correct 208 ms 53028 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 25 ms 34700 KB Output is correct
2 Correct 23 ms 34772 KB Output is correct
3 Correct 25 ms 34772 KB Output is correct
4 Correct 50 ms 35100 KB Output is correct
5 Correct 128 ms 35772 KB Output is correct
6 Correct 23 ms 34772 KB Output is correct
7 Correct 20 ms 35028 KB Output is correct
8 Correct 20 ms 34956 KB Output is correct
9 Correct 22 ms 34980 KB Output is correct
10 Correct 50 ms 35532 KB Output is correct
11 Correct 159 ms 36676 KB Output is correct
12 Correct 35 ms 37072 KB Output is correct
13 Correct 26 ms 37072 KB Output is correct
14 Correct 29 ms 37072 KB Output is correct
15 Correct 55 ms 37544 KB Output is correct
16 Correct 157 ms 38780 KB Output is correct
17 Correct 176 ms 82592 KB Output is correct
18 Correct 166 ms 82568 KB Output is correct
19 Correct 171 ms 82576 KB Output is correct
20 Correct 220 ms 82968 KB Output is correct
21 Correct 409 ms 91032 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 33 ms 37156 KB Output is correct
2 Correct 73 ms 37736 KB Output is correct
3 Correct 224 ms 39832 KB Output is correct
4 Correct 442 ms 41900 KB Output is correct
5 Correct 157 ms 66812 KB Output is correct
6 Correct 235 ms 67788 KB Output is correct
7 Correct 602 ms 71492 KB Output is correct
8 Correct 1042 ms 76100 KB Output is correct
9 Correct 880 ms 226016 KB Output is correct
10 Correct 971 ms 226812 KB Output is correct
11 Correct 1756 ms 229960 KB Output is correct
12 Correct 2156 ms 234692 KB Output is correct
13 Correct 1803 ms 444000 KB Output is correct
14 Correct 2106 ms 445200 KB Output is correct
15 Correct 2869 ms 449608 KB Output is correct
16 Correct 3458 ms 450652 KB Output is correct
17 Correct 4717 ms 486868 KB Output is correct
# Verdict Execution time Memory Grader output
1 Execution timed out 5101 ms 362772 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 25 ms 34772 KB Output is correct
2 Correct 21 ms 34780 KB Output is correct
3 Correct 23 ms 34708 KB Output is correct
4 Correct 23 ms 34780 KB Output is correct
5 Correct 23 ms 34900 KB Output is correct
6 Correct 24 ms 34776 KB Output is correct
7 Correct 20 ms 34772 KB Output is correct
8 Correct 20 ms 34832 KB Output is correct
9 Correct 19 ms 34768 KB Output is correct
10 Correct 26 ms 34760 KB Output is correct
11 Correct 24 ms 34772 KB Output is correct
12 Correct 26 ms 34740 KB Output is correct
13 Correct 25 ms 34916 KB Output is correct
14 Correct 23 ms 34856 KB Output is correct
15 Correct 25 ms 34900 KB Output is correct
16 Correct 25 ms 34904 KB Output is correct
17 Correct 22 ms 34912 KB Output is correct
18 Correct 24 ms 34976 KB Output is correct
19 Correct 52 ms 36776 KB Output is correct
20 Correct 66 ms 37060 KB Output is correct
21 Correct 80 ms 37376 KB Output is correct
22 Correct 78 ms 38028 KB Output is correct
23 Correct 120 ms 44780 KB Output is correct
24 Correct 157 ms 48008 KB Output is correct
25 Correct 233 ms 50544 KB Output is correct
26 Correct 208 ms 53028 KB Output is correct
27 Correct 25 ms 34700 KB Output is correct
28 Correct 23 ms 34772 KB Output is correct
29 Correct 25 ms 34772 KB Output is correct
30 Correct 50 ms 35100 KB Output is correct
31 Correct 128 ms 35772 KB Output is correct
32 Correct 23 ms 34772 KB Output is correct
33 Correct 20 ms 35028 KB Output is correct
34 Correct 20 ms 34956 KB Output is correct
35 Correct 22 ms 34980 KB Output is correct
36 Correct 50 ms 35532 KB Output is correct
37 Correct 159 ms 36676 KB Output is correct
38 Correct 35 ms 37072 KB Output is correct
39 Correct 26 ms 37072 KB Output is correct
40 Correct 29 ms 37072 KB Output is correct
41 Correct 55 ms 37544 KB Output is correct
42 Correct 157 ms 38780 KB Output is correct
43 Correct 176 ms 82592 KB Output is correct
44 Correct 166 ms 82568 KB Output is correct
45 Correct 171 ms 82576 KB Output is correct
46 Correct 220 ms 82968 KB Output is correct
47 Correct 409 ms 91032 KB Output is correct
48 Correct 33 ms 37156 KB Output is correct
49 Correct 73 ms 37736 KB Output is correct
50 Correct 224 ms 39832 KB Output is correct
51 Correct 442 ms 41900 KB Output is correct
52 Correct 157 ms 66812 KB Output is correct
53 Correct 235 ms 67788 KB Output is correct
54 Correct 602 ms 71492 KB Output is correct
55 Correct 1042 ms 76100 KB Output is correct
56 Correct 880 ms 226016 KB Output is correct
57 Correct 971 ms 226812 KB Output is correct
58 Correct 1756 ms 229960 KB Output is correct
59 Correct 2156 ms 234692 KB Output is correct
60 Correct 1803 ms 444000 KB Output is correct
61 Correct 2106 ms 445200 KB Output is correct
62 Correct 2869 ms 449608 KB Output is correct
63 Correct 3458 ms 450652 KB Output is correct
64 Correct 4717 ms 486868 KB Output is correct
65 Execution timed out 5101 ms 362772 KB Time limit exceeded
66 Halted 0 ms 0 KB -