結果

問題 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;
      |                                     ^~~~~~

ソースコード

diff #

#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;
}
0