제출 #488816

#제출 시각아이디문제언어결과실행 시간메모리
488816cfalasDynamic Diameter (CEOI19_diameter)C++14
0 / 100
5092 ms31600 KiB
#include<bits/stdc++.h> using namespace std; #define mp make_pair #define INF 10000000 #define MOD 1000000007 #define MID ((l+r)/2) #define HASHMOD 2305843009213693951 #define ll long long #define ull unsigned long long #define F first #define S second typedef pair<ll, ll> ii; typedef pair<ii, ll> iii; typedef vector<ll> vi; typedef vector<ii> vii; typedef map<int, int> mii; #define EPS 1e-6 #define FOR(i,n) for(int i=0;i<((int)(n));i++) #define FORi(i,a,b) for(int i=((int)(a));i<((int)(b));i++) #define FOA(v, a) for(auto v : a) int t, n; vi a, b; vector<vii> adj; ii f; int cnt=0; vector<int> dfso; void dfs(int s, int p=-1, ll d=0){ dfso[s] = cnt++; if(d>f.F) f = max(f, {d, s}); FOA(v, adj[s]){ if(v.F!=p) dfs(v.F, s, d+v.S); } } vector<int> pr; struct node{ ii l1={0,0}, l2={0,0}; int w=0; int id=1; vector<node*> c; vector<node*> all_c; void build(int p=-1){ pr.push_back(id); FOA(v,adj[id]){ if(v.F!=p){ c.push_back(new node()); c[c.size()-1]->w = v.S; c[c.size()-1]->id = v.F; c[c.size()-1]->build(id); } } FOA(v, c){ if(v->w + v->l1.F > l1.F) l2 = l1, l1 = {v->l1.F + v->w, v->id}; else if(v->w + v->l1.F > l2.F && v->id != l1.S) l2 = {v->l1.F + v->w, v->id}; //else if(v->w + v->l2 > l2) l2 = v->l2 + v->w; } //cout<<id<<" ("<<l1.F<<" "<<l1.S<<") ("<<l2.F<<" "<<l2.S<<")"<<endl; } void update(int s, int t){ int pos = c.size()-1; FOR(i,c.size()-1){ if(dfso[c[i]->id] <= dfso[s] && dfso[s] < dfso[c[i+1]->id]) pos = i; } if(s==id){ //cout<<"CHAINGE "<<s<<endl; w = t; } else{ c[pos]->update(s, t); //node*v = c[pos]; l1 = {0,0}, l2 = {0,0}; FOA(v, c){ if(v->w + v->l1.F > l1.F) l2 = l1, l1 = {v->l1.F + v->w, v->id}; else if(v->w + v->l1.F > l2.F && v->id != l1.S) l2 = {v->l1.F + v->w, v->id}; //else if(v->w + v->l2 > l2) l2 = v->l2 + v->w; } /* if(v->id == l1.S) l1.F = v->l1.F + w; if(v->w + v->l1.F > l1.F) l2 = l1, l1 = {v->l1.F + v->w, v->id}; else if(v->w + v->l1.F > l2.F && v->id != l1.S) l2 = {v->l1.F + v->w, v->id};*/ //cout<<id<<" ("<<l1.F<<" "<<l1.S<<") ("<<l2.F<<" "<<l2.S<<")"<<endl; } } }; int main(){ int q; ll w; cin>>n>>q>>w; adj.assign(n+1, vii()); dfso.assign(n+1, 0); vector<pair<ii,ii> > edg(n-1); set<ii> ws; vi wu(n); FOR(i,n-1){ ll a, b, c; cin>>a>>b>>c; ws.insert({-c, i}); wu[i] = c; edg[i] = {{a, adj[a].size()}, {b, adj[b].size()}}; adj[a].push_back({b,c}); adj[b].push_back({a,c}); } node root; root.build(); ll last=0; dfs(1); //FOR(i,n) cout<<dfso[i+1]<<" "; //cout<<endl; while(q--){ ll a, b; cin>>a>>b; //cout<<"UPDATE\n"; a= (a + last) % (n-1); b = (b+last) % w; adj[edg[a].F.F][edg[a].F.S].S = b; adj[edg[a].S.F][edg[a].S.S].S = b; f = {0,1}; //dfs(1); //dfs(f.S); root.update(max(ii(dfso[edg[a].F.F], edg[a].F.F),ii(dfso[edg[a].S.F], edg[a].S.F)).S, b); //last = f.F; last = root.l1.F + root.l2.F; cout<<last<<endl; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...