MnZn刚学OI一普朗克时间,样例过了交上去全WA
查看原帖
MnZn刚学OI一普朗克时间,样例过了交上去全WA
343342
Obviathy楼主2023/5/22 18:30
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n,q;
int tot,h[N];
long long d[N],fa[N],son[N],id[N],siz[N],top[N],dfsid;
struct tree{
	int l,r;
	long long val,tag;
}t[N*4];
struct edge{
	int u,v,nxt;
}e[N*2];
inline void add(int u,int v){
	e[++tot].u = u;
	e[tot].v = v;
	e[tot].nxt = h[u];
	h[u] = tot;
}
inline void push_up(int p){
	t[p].val = t[p<<1].val + t[p<<1|1].val;
}
inline void push_down(int p){
	if(t[p].tag){
		t[p<<1].tag += t[p].tag;
		t[p<<1|1].tag += t[p].tag;
		t[p<<1].val += t[p].tag * (t[p<<1].r - t[p<<1].l + 1);
		t[p<<1|1].val += t[p].tag * (t[p<<1|1].r - t[p<<1|1].l + 1);	
	}
} 
void build(int p,int l,int r){
	t[p].l = l,t[p].r = r;
	if(l == r)return;
	int mid = (l + r) >> 1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	push_up(p);
}
inline void update(int p,int l,int r,long long val){
	if(t[p].l >= l && t[p].r <= r){
		t[p].tag += val;
		t[p].val += val * (t[p].r - t[p].l + 1);
		return ;
	}
	push_down(p);
	int mid = (t[p].l + t[p].r) >> 1;
	if(l <= mid) update(p<<1,l,r,val);
	if(r >  mid) update(p<<1|1,l,r,val);
	push_up(p);
}
inline long long query(int p,int l,int r){
	if(t[p].l >= l && t[p].r <= r)return t[p].val;
	int mid = (t[p].l + t[p].r) >> 1;
	long long res = 0;
	push_down(p);
	if(l <= mid)res += query(p<<1,l,r);
	if(r >  mid)res += query(p<<1|1,l,r);
	return res;
}
void dfs1(int u,int f){
	d[u] = d[f] + 1;
	fa[u] = f;
	siz[u] = 1;
	for(int i = h[u];i;i = e[i].nxt){
		int v = e[i].v;
		if(v == f)continue;
		dfs1(v,u);
		siz[u] += siz[v];
		if(!son[u] || siz[son[u]] < siz[v])son[u] = v;
	}
}
void dfs2(int u,int topx){
	top[u] = topx;
	id[u] = ++ dfsid;
	if(! son[u])return;
	dfs2(son[u],topx);
	for(int i = h[u];i;i = e[i].nxt){
		int v = e[i].v;
		if(v != fa[u] && son[u] != v)dfs2(v,v);
	}
}
inline void change(int l,int r,long long val){
	while(top[l] != top[r]){
		if(d[top[l]] < d[top[r]])swap(l,r);
		update(1,id[top[l]],id[l],val);
		l = fa[top[l]];
	}
	if(d[l] > d[r])swap(l,r);
	update(1,id[l],id[r],val);
}
int main(){
	cin >> n;
	for(int i = 1;i < n;i ++){
		int u,v;
		cin >> u >> v;
		add(u+1,v+1);
		add(v+1,u+1);
	} 
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,n);
	cin >> q;
	while(q --){
	//	cout << "x" << endl;
		char opt;
		cin >> opt;
		if(opt == 'A'){
			int u,v;
			long long k;
			cin >> u >> v >> k;
			change(id[u+1],id[v+1],k);
		}else{
			int x;
			cin >> x;
			cout << query(1,id[x+1],id[x+1]+siz[x+1]-1) << endl;
		}
	}
	return 0;
}

就算全开long log第一个点也输出-

Orz,ty

2023/5/22 18:30
加载中...