結果
問題 | No.2439 Fragile Apple Tree |
ユーザー | 沙耶花 |
提出日時 | 2023-08-19 00:12:57 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 3,951 ms / 10,000 ms |
コード長 | 4,660 bytes |
コンパイル時間 | 6,017 ms |
コンパイル使用メモリ | 285,492 KB |
実行使用メモリ | 122,328 KB |
最終ジャッジ日時 | 2024-05-06 07:48:54 |
合計ジャッジ時間 | 53,092 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1,415 ms
68,976 KB |
testcase_01 | AC | 2,640 ms
93,612 KB |
testcase_02 | AC | 2,716 ms
93,604 KB |
testcase_03 | AC | 778 ms
122,328 KB |
testcase_04 | AC | 1,481 ms
122,292 KB |
testcase_05 | AC | 2,301 ms
93,620 KB |
testcase_06 | AC | 2,541 ms
93,476 KB |
testcase_07 | AC | 3,908 ms
94,304 KB |
testcase_08 | AC | 3,951 ms
94,212 KB |
testcase_09 | AC | 1 ms
5,376 KB |
testcase_10 | AC | 1 ms
5,376 KB |
testcase_11 | AC | 2 ms
5,376 KB |
testcase_12 | AC | 2 ms
5,376 KB |
testcase_13 | AC | 1 ms
5,376 KB |
testcase_14 | AC | 3,823 ms
91,388 KB |
testcase_15 | AC | 1,657 ms
93,604 KB |
testcase_16 | AC | 2,522 ms
93,604 KB |
testcase_17 | AC | 2,442 ms
93,596 KB |
testcase_18 | AC | 825 ms
68,124 KB |
testcase_19 | AC | 799 ms
35,852 KB |
testcase_20 | AC | 303 ms
31,196 KB |
testcase_21 | AC | 115 ms
5,376 KB |
testcase_22 | AC | 1,418 ms
50,192 KB |
testcase_23 | AC | 599 ms
25,968 KB |
testcase_24 | AC | 703 ms
33,704 KB |
testcase_25 | AC | 536 ms
58,684 KB |
testcase_26 | AC | 667 ms
65,052 KB |
testcase_27 | AC | 541 ms
47,716 KB |
testcase_28 | AC | 1 ms
5,376 KB |
testcase_29 | AC | 2 ms
5,376 KB |
testcase_30 | AC | 1 ms
5,376 KB |
testcase_31 | AC | 1,381 ms
95,056 KB |
testcase_32 | AC | 1,398 ms
95,056 KB |
コンパイルメッセージ
main.cpp:96:24: warning: use of 'auto' in parameter declaration only available with '-std=c++20' or '-fconcepts' 96 | void dfs(int cv,int pv,auto &E){ | ^~~~ main.cpp: In function 'int main()': main.cpp:219:65: warning: 'target' may be used uninitialized [-Wmaybe-uninitialized] 219 | auto temp = seg.get(H.pos[target]); | ^ main.cpp:192:37: note: 'target' was declared here 192 | int target; | ^~~~~~
ソースコード
#include <stdio.h> #include <atcoder/all> #include <bits/stdc++.h> using namespace std; using namespace atcoder; using mint = modint998244353; #define rep(i,n) for (int i = 0; i < (n); ++i) #define Inf32 1000000001 #define Inf64 4000000000000000001 struct HLD{ vector<int> sz,parent,depth,root,pos; vector<int> arr; HLD(vector<vector<int>> &E){ sz.resize(E.size(),1); parent.resize(E.size(),0); depth.resize(E.size(),0); root.resize(E.size(),0); pos.resize(E.size(),0); dfs(0,-1,E); dfs2(0,-1,E,0); } void dfs(int now,int p,vector<vector<int>> &E){ parent[now] = p; if(p==-1){ depth[now] = 0; } else{ depth[now] = depth[p]+1; } for(int i=0;i<E[now].size();i++){ int to = E[now][i]; if(to==p)continue; dfs(to,now,E); sz[now] += sz[to]; } } void dfs2(int now,int p,vector<vector<int>> &E,int r){ pos[now] = arr.size(); arr.push_back(now); root[now] = r; int maxi = 0; int ind = -1; for(int i=0;i<E[now].size();i++){ int to = E[now][i]; if(to==p)continue; if(maxi<sz[to]){ maxi = sz[to]; ind = to; } } if(ind==-1)return; dfs2(ind,now,E,r); for(int i=0;i<E[now].size();i++){ int to = E[now][i]; if(to==p||to==ind)continue; dfs2(to,now,E,to); } } vector<pair<int,int>> query(int u,int v){ vector<pair<int,int>> ret; int t = 0; while(root[u]!=root[v]){ if(depth[root[u]] <= depth[root[v]]){ ret.insert(ret.begin()+t,{pos[root[v]], pos[v]}); v = parent[root[v]]; } else{ ret.insert(ret.begin()+t,{pos[u],pos[root[u]]}); u = parent[root[u]]; t++; } } ret.insert(ret.begin()+t,{pos[u],pos[v]}); return ret; } int lca(int u,int v){ for(;;v=parent[root[v]]){ if(pos[u]>pos[v])swap(u,v); if(root[u]==root[v])return u; } } int get_distance(int u,int v){ return depth[u] + depth[v] - 2 * depth[lca(u,v)]; } }; vector<array<long long,3>> t; void dfs(int cv,int pv,auto &E){ //cout<<cv<<endl; t[cv][0] = 1; t[cv][1] = 0; if(cv==0)t[cv][2] = Inf64; rep(i,E[cv].size()){ int to = E[cv][i].first; if(pv==to)continue; //cout<<cv<<','<<pv<<','<<to<<endl; long long c = E[cv][i].second; t[to][2] = c; dfs(to,cv,E); t[cv][0] += t[to][0]; } } array<long long,3> op(array<long long,3> a,array<long long,3> b){ array<long long,3> ret; rep(i,3)ret[i]= min(a[i],b[i]); return ret; } array<long long,3> e(){ array<long long,3> ret; rep(i,3)ret[i] = Inf64; return ret; } array<long long,3> mapping(array<long long,3> a,array<long long,3> b){ rep(i,3)a[i] += b[i]; return a; } array<long long,3> composition(array<long long,3> a,array<long long,3> b){ return mapping(a,b); } array<long long,3> id(){ array<long long,3> ret; rep(i,3)ret[i] = 0; return ret; } bool F(array<long long,3> a){ return a[2]>0; } int main(){ int n,q; cin>>n>>q; vector<vector<pair<int,long long>>> E(n); vector<vector<int>> es(n); rep(i,n-1){ long long a,b,c; cin>>a>>b>>c; a--,b--; E[a].emplace_back(b,c); E[b].emplace_back(a,c); es[a].push_back(b); es[b].push_back(a); } t.resize(n); dfs(0,-1,E); //cout<<'a'<<endl; HLD H(es); { vector<array<long long,3>> ta(n); rep(i,n){ ta[H.pos[i]] = t[i]; } swap(ta,t); } lazy_segtree<array<long long,3>,op,e,array<long long,3>,mapping,composition,id> seg(t); //cout<<'b'<<endl; rep(_,q){ int type; cin>>type; if(type==1){ int v; long long x; cin>>v>>x; v--; auto ret = H.query(v,0); array<long long,3> tt; tt[0] = 0; tt[1] = x; tt[2] = -x; rep(i,ret.size()){ int ll = ret[i].first,rr = ret[i].second; if(ll>rr)swap(ll,rr); rr++; seg.apply(ll,rr,tt); } if(seg.all_prod()[2]<=0){ int target; rep(i,ret.size()){ int ll = ret[i].first,rr = ret[i].second; if(ll>rr)swap(ll,rr); rr++; if(seg.prod(ll,rr)[2]>0)continue; ll = ret[i].first,rr = ret[i].second; if(ll<rr){ rr++; int tr = seg.max_right<F>(ll); target = H.arr[tr]; break; } else{ swap(ll,rr); rr++; int tl = seg.min_left<F>(rr); target = H.arr[tl-1]; break; } break; } //cout<<seg.get(H.pos[3])[2]<<endl; //cout<<"hoge"<<target<<endl; ret = H.query(target,0); auto temp = seg.get(H.pos[target]); tt[0] = -temp[0]; tt[1] = -temp[1]; tt[2] = temp[1]; //cout<<target<<' '<<tt[2]<<endl; rep(i,ret.size()){ int ll = ret[i].first,rr = ret[i].second; if(ll>rr)swap(ll,rr); rr++; seg.apply(ll,rr,tt); } seg.set(H.pos[target],e()); } } else{ cout<<seg.get(H.pos[0])[0]<<endl; } } return 0; }