传送门(洛谷)
树链剖分模板题,线段树的区间修改和区间查询,弱智爆了,我居然打了两个小时!!
注意开 l o n g      l o n g long\;\;long longlong
Code
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(register ll (i)=(a);(i)<=(b);(i)++)
#define don(i,a,b) for(register ll (i)=(a);(i)>=(b);(i)--)
using namespace std;
const ll maxn=1e6+10;
const ll maxm=1e3+10;
ll n,cnt,m;
ll head[maxn];
ll f[maxn],dep[maxn],id[maxn],size[maxn],son[maxn],wt[maxn],top[maxn];
ll root[maxn*4],lazy[maxn*4];
#define lson rt<<1
#define rson rt<<1|1
template <class t> inline void read(t &x) {
x=0;int f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=10*x+ch-'0';ch=getchar();}
x*=f;
}
struct node{
ll v,nex;
}e[maxn<<1];
void add(ll u,ll v) {
e[++cnt].v=v;
e[cnt].nex=head[u];
head[u]=cnt;
}
void dfs1(ll u,ll deep,ll fa) {
f[u]=fa;
size[u]=1;
dep[u]=deep;
ll maxson=-1;
for(ll i=head[u];~i;i=e[i].nex) {
ll v=e[i].v;
if(v==fa) continue;
dfs1(v,deep+1,u);
size[u]+=size[v];
if(size[v]>maxson) {
maxson=size[v];
son[u]=v;
}
}
}
void dfs2(ll u,ll topf) {
top[u]=topf;
id[u]=++cnt;
wt[cnt]=u;
if(!son[u]) return;
dfs2(son[u],topf);
for(ll i=head[u];~i;i=e[i].nex) {
ll v=e[i].v;
if(v==f[u] || v==son[u]) continue;
dfs2(v,v);
}
}
void readdata() {
memset(head,-1,sizeof(head));
read(n);
rep(i,1,n-1) {
ll x,y;
read(x),read(y);
add(x,y);add(y,x);
}
}
void pushup(ll rt) {
root[rt]=root[lson]+root[rson];
}
void Add(ll l,ll r,ll rt,ll delta) {
lazy[rt]+=delta;
root[rt]+=(r-l+1)*delta;
return;
}
void pushdown(ll l,ll r,ll rt,ll mid) {
if(lazy[rt]==0) return;
Add(l,mid,lson,lazy[rt]);
Add(mid+1,r,rson,lazy[rt]);
lazy[rt]=0;
}
void buildtree(ll l,ll r,ll rt) {
if(l==r) {
root[rt]=0;
return;
}
ll mid=(l+r)/2;
buildtree(l,mid,lson);
buildtree(mid+1,r,rson);
pushup(rt);
}
void update(ll l,ll r,ll rt,ll x,ll y,ll delta) {
if(x<=l && y>=r) {
Add(l,r,rt,delta);
return;
}
ll mid=(l+r)/2;
pushdown(l,r,rt,mid);
if(x<=mid) update(l,mid,lson,x,y,delta);
if(y>mid) update(mid+1,r,rson,x,y,delta);
pushup(rt);
}
void qchange(ll x,ll y,ll delta) {
while(top[x]!=top[y]) {
if(dep[top[x]]<dep[top[y]]) swap(x,y);
update(1,n,1,id[top[x]],id[x],delta);
x=f[top[x]];
}
if(id[x]>id[y]) swap(x,y);
update(1,n,1,id[x],id[y],delta);
}
inline ll query(ll l,ll r,ll rt,ll x,ll y) {
if(x<=l && y>=r) {
return root[rt];
}
ll ans=0;
ll mid=(l+r)/2;
pushdown(l,r,rt,mid);
if(x<=mid) ans+=query(l,mid,lson,x,y);
if(y>mid) ans+=query(mid+1,r,rson,x,y);
return ans;
}
void work() {
cnt=0;
dfs1(0,1,-1);
dfs2(0,0);
buildtree(1,n,1);
read(m);
while(m--) {
char flag;
scanf("%s",&flag);
if(flag=='A') {
ll x,y,z;
read(x),read(y),read(z);
qchange(x,y,z);
}
else {
ll x;
read(x);
printf("%lld\n",query(1,n,1,id[x],id[x]+size[x]-1));
}
}
}
int main() {
freopen("input.txt","r",stdin);
readdata();
work();
return 0;
}