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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bzoj 4012: [HNOI2015]开店

發布時間:2025/4/16 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj 4012: [HNOI2015]开店 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description
風見幽香有一個好朋友叫八云紫,她們經常一起看星星看月亮從詩詞歌賦談到
人生哲學。最近她們靈機一動,打算在幻想鄉開一家小店來做生意賺點錢。這樣的
想法當然非常好啦,但是她們也發現她們面臨著一個問題,那就是店開在哪里,面
向什么樣的人群。很神奇的是,幻想鄉的地圖是一個樹形結構,幻想鄉一共有 n
個地方,編號為 1 到 n,被 n-1 條帶權的邊連接起來。每個地方都住著一個妖怪,
其中第 i 個地方的妖怪年齡是 x_i。妖怪都是些比較喜歡安靜的家伙,所以它們并
不希望和很多妖怪相鄰。所以這個樹所有頂點的度數都小于或等于 3。妖怪和人一
樣,興趣點隨著年齡的變化自然就會變化,比如我們的 18 歲少女幽香和八云紫就
比較喜歡可愛的東西。幽香通過研究發現,基本上妖怪的興趣只跟年齡有關,所以
幽香打算選擇一個地方 u(u為編號),然后在 u開一家面向年齡在 L到R 之間(即
年齡大于等于 L、小于等于 R)的妖怪的店。也有可能 u這個地方離這些妖怪比較
遠,于是幽香就想要知道所有年齡在 L 到 R 之間的妖怪,到點 u 的距離的和是多
少(妖怪到 u 的距離是該妖怪所在地方到 u 的路徑上的邊的權之和) ,幽香把這個
稱為這個開店方案的方便值。幽香她們還沒有決定要把店開在哪里,八云紫倒是準
備了很多方案,于是幽香想要知道,對于每個方案,方便值是多少呢。

解題報告:
前情:本人的只是水過.
我們知道:\(dis[u,v]=d[u]+d[v]-2*d[lca(u,v)]\)
對于前兩項,我們是已知的,對于\(d[lca(u,v)]\)的求法十分有意思,其實就是u和v到1的路徑的交,這樣,我們就可以先用所有的v,將v到1的路徑打上標記,然后統計答案時就是u到1的路徑上的標記和,用樹鏈剖分即可\(logn\)的標記和查詢,然后關于年齡限制,我們只需將樹鏈剖分的線段樹可持久化一下即可.

一些注意的地方:
一開始標記打錯,應該標記上記錄的是經過次數而不是邊權×次數,然后就是區間修改主席樹的基本操作了.

#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> #define RG register #define il inline #define iter iterator #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) using namespace std; typedef long long ll; const int N=150005; int head[N],num=0,nxt[N<<1],to[N<<1],dis[N<<1],n,Q,A,edg[N],tot,val[N]; int bt=0,b[N],a[N];ll sum[N],w[N],sed[N]; int gi(){int str=0;char ch=getchar();while(ch>'9' || ch<'0')ch=getchar();while(ch>='0' && ch<='9')str=(str<<1)+(str<<3)+ch-48,ch=getchar();return str; } void link(int x,int y,int z){nxt[++num]=head[x];to[num]=y;dis[num]=z;head[x]=num;} bool comp(int i,int j){return edg[i]<edg[j];} int ids=0,fa[N],top[N],id[N],son[N],sz[N];ll path[N]; void dfs1(int x){int u;sz[x]=1;for(int i=head[x];i;i=nxt[i]){u=to[i];if(sz[u])continue;path[u]=path[x]+dis[i];fa[u]=x;val[u]=dis[i];dfs1(u);sz[x]+=sz[u];if(sz[u]>sz[son[x]])son[x]=u;} } void dfs2(int x,int tp){id[x]=++ids;top[x]=tp;if(son[x])dfs2(son[x],tp);int u;for(int i=head[x];i;i=nxt[i]){u=to[i];if(u==fa[x] || u==son[x])continue;dfs2(u,u);} } int root[N],totnode=0; struct node{int lazy,l,r;ll sum; }tr[N*30]; void upd(int rt,int l,int r){tr[rt].sum=tr[tr[rt].l].sum+tr[tr[rt].r].sum+tr[rt].lazy*(w[r]-w[l-1]); } void updata(int &rt,int last,int l,int r,int sa,int se){rt=++totnode;tr[rt]=tr[last];if(sa==l && r==se){tr[rt].sum+=w[r]-w[l-1];tr[rt].lazy++;return ;}int mid=(l+r)>>1;if(se<=mid)updata(tr[rt].l,tr[last].l,l,mid,sa,se);else if(sa>mid)updata(tr[rt].r,tr[last].r,mid+1,r,sa,se);else{updata(tr[rt].l,tr[last].l,l,mid,sa,mid);updata(tr[rt].r,tr[last].r,mid+1,r,mid+1,se);}upd(rt,l,r); } void updpath(int x){int rt=edg[x];while(x){updata(root[rt],root[rt],1,n,id[top[x]],id[x]);x=fa[top[x]];} } void solve(){sort(a+1,a+n+1,comp);dfs1(1);dfs2(1,1);for(int i=1;i<=n;i++)w[id[i]]=val[i],sed[edg[i]]+=path[i];for(int i=1;i<=n;i++)w[i]+=w[i-1],sed[i]+=sed[i-1];for(int j=1,i;j<=n;j++){i=a[j];if(!root[edg[i]])root[edg[i]]=root[edg[i]-1];updpath(i);} } ll query(int rt,int l,int r,int sa,int se,int mr){if(l==sa && r==se)return tr[rt].sum+(ll)mr*(w[r]-w[l-1]);int mid=(l+r)>>1;ll ret=0;mr+=tr[rt].lazy;if(se<=mid)ret=query(tr[rt].l,l,mid,sa,se,mr);else if(sa>mid)ret=query(tr[rt].r,mid+1,r,sa,se,mr);else{ret+=query(tr[rt].l,l,mid,sa,mid,mr);ret+=query(tr[rt].r,mid+1,r,mid+1,se,mr);}return ret; } ll qtree(int x,int fr){if(fr==0)return 0;ll ret=0;int rt=root[fr];while(x){ret+=query(rt,1,n,id[top[x]],id[x],0);x=fa[top[x]];}return ret; } void settle(){ll ret=0,ans=0,u,x,y,xa,xb;while(Q--){u=gi();xa=gi();xb=gi();x=Min((xa+ans)%A,(xb+ans)%A);y=Max((xa+ans)%A,(xb+ans)%A);x=lower_bound(b+1,b+tot+1,x)-b;y=upper_bound(b+1,b+tot+1,y)-b-1;ret=(ll)(sum[y]-sum[x-1])*path[u];ret+=sed[y]-sed[x-1];ret-=(ll)(qtree(u,y)-qtree(u,x-1))<<1;ans=ret;printf("%lld\n",ans);} } void work() {n=gi();Q=gi();A=gi();for(int i=1;i<=n;i++)edg[i]=gi(),b[++bt]=edg[i],a[i]=i;int x,y,z;for(int i=1;i<n;i++){x=gi();y=gi();z=gi();link(x,y,z);link(y,x,z);}sort(b+1,b+bt+1);tot=unique(b+1,b+bt+1)-b-1;for(int i=1;i<=n;i++)edg[i]=lower_bound(b+1,b+tot+1,edg[i])-b;for(int i=1;i<=n;i++)sum[edg[i]]++;for(int i=1;i<=tot;i++)sum[i]+=sum[i-1];solve();settle(); }int main() {work();return 0; }

轉載于:https://www.cnblogs.com/Yuzao/p/7505827.html

總結

以上是生活随笔為你收集整理的bzoj 4012: [HNOI2015]开店的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。