日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jzoj5699-[GDOI2018day1]涛涛接苹果【树套树】

發(fā)布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jzoj5699-[GDOI2018day1]涛涛接苹果【树套树】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

正題

題目鏈接:https://gmoj.net/senior/#main/show/5699


題目大意

一棵樹,每個節(jié)點有權(quán)值,每天所有權(quán)值會往它的父節(jié)點滑一位,然后有操作會在某一天的某個節(jié)點加權(quán)值。

然后詢問若干次某個時間一個位置的子樹權(quán)值和。


解題思路

因為每次滑一位,所以我們直接把深度帶到時間里,也就是帶入t+depxt+dep_xt+depx?

這樣就可以只看時間了,那么對于一個詢問(t1,x1)(t_1,x_1)(t1?,x1?),會被修改(t2,x2,w)(t_2,x_2,w)(t2?,x2?,w)影響當(dāng)且僅當(dāng)。t2≤t1且t1+depx1≥t2+depx2t_2\leq t_1且t_1+dep_{x_1}\geq t_2+dep_{x_2}t2?t1?t1?+depx1??t2?+depx2??

然后樹套樹做即可。

時間復(fù)雜度O((n+q)log?2n)O((n+q)\log^2 n)O((n+q)log2n)


codecodecode

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long #define lowbit(x) (x&-x) using namespace std; const int N=2e5+10; struct enode{int to,next; }a[N]; struct qnode{int t,x,w; }q[N*2]; int n,m,T,cnt,num,tot,ls[N],rfn[N],ed[N],rt[N],dep[N]; ll ans[N]; struct Seg_Tree{int cnt,ls[N<<6],rs[N<<6];ll val[N<<6];void Change(int &x,int l,int r,int pos,int w){if(!x)x=++cnt;if(l==r){val[x]+=w;return;}int mid=(l+r)>>1;if(pos<=mid)Change(ls[x],l,mid,pos,w);else Change(rs[x],mid+1,r,pos,w);val[x]=val[ls[x]]+val[rs[x]];return;}ll Ask(int x,int L,int R,int l,int r){if(!x)return 0;if(L==l&&R==r)return val[x];int mid=(L+R)>>1;if(r<=mid)return Ask(ls[x],L,mid,l,r);if(l>mid)return Ask(rs[x],mid+1,R,l,r);return Ask(ls[x],L,mid,l,mid)+Ask(rs[x],mid+1,R,mid+1,r);} }Tr; void Change(int x,int pos,int val){x=N-x;while(x<N){Tr.Change(rt[x],1,n,pos,val);x+=lowbit(x);}return; } ll Ask(int x,int l,int r){ll ans=0;x=N-x;while(x){ans+=Tr.Ask(rt[x],1,n,l,r);x-=lowbit(x);}return ans; } void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return; } void dfs(int x,int fa){rfn[x]=++num;dep[x]=dep[fa]+1;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa)continue;dfs(y,x);}ed[x]=num; } bool cmp(qnode x,qnode y){if(x.t==y.t)return x.w<y.w;return x.t<y.t; } int main() {freopen("appletree.in","r",stdin);freopen("appletree.out","w",stdout);scanf("%d%d%d",&n,&m,&T);for(int i=1;i<=n;i++){int w;scanf("%d",&w);q[++cnt]=(qnode){0,i,w};}for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);addl(x,y);addl(y,x);}dfs(1,1);for(int i=1;i<=m;i++){int t,x,w;scanf("%d%d%d",&t,&x,&w);q[++cnt]=(qnode){t,x,w};}for(int i=1;i<=T;i++){int t,x;scanf("%d%d",&t,&x);q[++cnt]=(qnode){t,x,-i};}sort(q+1,q+1+cnt,cmp);for(int i=1;i<=cnt;i++){if(q[i].w<0)ans[-q[i].w]=Ask(q[i].t+dep[q[i].x]-1,rfn[q[i].x],ed[q[i].x]); else Change(q[i].t+dep[q[i].x],rfn[q[i].x],q[i].w);}for(int i=1;i<=T;i++)printf("%lld\n",ans[i]); }

總結(jié)

以上是生活随笔為你收集整理的jzoj5699-[GDOI2018day1]涛涛接苹果【树套树】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。