题目:
和 bzoj 3070 震波 是一个套路。注意区间修改的话,树状数组不能表示 dis = 0 的位置,所以要手动改父亲的点权数组。
#include#include #include #include #define ll long longusing namespace std;const int N=1e5+5,K=20;int n,w[N],hd[N],xnt,to[N<<1],nxt[N<<1],siz[N],rt,mn;int pre[N][K],dep[N],dis[N][K],fs[N],gs[N]; vector f[N],g[N];bool vis[N];int rdn(){ int ret=0;bool fx=1;char ch=getchar(); while(ch>'9'||ch<'0'){ if(ch=='-')fx=0;ch=getchar();} while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar(); return fx?ret:-ret;}int Mx(int a,int b){ return a>b?a:b;}int Mn(int a,int b){ return a d)continue; add(pre[cr][i],d-dis[cr][i],k); w[pre[cr][i]]+=k;///// addx(pre[cr][i+1],d-dis[cr][i],k); }}ll query(int cr){ ll ret=w[cr]; for(int i=dep[cr]-1;i;i--) { ret+=qry(pre[cr][i],dis[cr][i]); ret-=qryx(pre[cr][i+1],dis[cr][i]); } return ret;}int main(){ n=rdn(); int Q=rdn(); for(int i=1,u,v;i