标签:line 所在地 ora lap swa 做生意 大于等于 研究 int
风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到
#include<bits/stdc++.h> #define il inline #define LL long long #define _(d) while(d(isdigit(ch=getchar()))) using namespace std; const int N=150005;LL ans,s[N],sd[N]; struct node{int age,id;}b[N];struct data{int l,r,num;LL sum;}t[N*100]; int sz[N],fa[N],son[N],top[N],dfn[N],num[N],cnt,tag[N],c[N],A; int n,q,head[N],ne[N<<1],to[N<<1],w[N<<1],val[N],tot,nt,dist[N],rt[N]; il int read(){int x;char ch;_(!);x=ch^48;_()x=(x<<1)+(x<<3)+(ch^48);return x;} bool cmp(node t1,node t2){return t1.age<t2.age||(t1.age==t2.age&&t1.id<t2.id);} il void insert(int x,int y,int z){ne[++cnt]=head[x];head[x]=cnt;to[cnt]=y;w[cnt]=z;} il void dfs1(int x){ sz[x]=1;int maxn=-1; for(int i=head[x];i;i=ne[i]){ if(fa[x]==to[i])continue; fa[to[i]]=x;dist[to[i]]=dist[x]+w[i]; dfs1(to[i]);sz[x]+=sz[to[i]];val[to[i]]=w[i]; if(maxn<sz[to[i]])son[x]=to[i],maxn=sz[to[i]]; } } il void dfs2(int x,int root){ dfn[x]=++tot;num[tot]=x;top[x]=root; if(!son[x])return;dfs2(son[x],root); for(int i=head[x];i;i=ne[i]){ if(dfn[to[i]])continue; dfs2(to[i],to[i]); } } il void Ia(int &x,int y,int l,int r,int ql,int qr){ t[x=++nt]=t[y]; if(ql==l&&r==qr){t[x].num++;return;} int mid=(l+r)>>1;t[x].sum+=s[qr]-s[ql-1]; if(qr<=mid)Ia(t[x].l,t[y].l,l,mid,ql,qr); else if(mid<ql)Ia(t[x].r,t[y].r,mid+1,r,ql,qr); else Ia(t[x].l,t[y].l,l,mid,ql,mid),Ia(t[x].r,t[y].r,mid+1,r,mid+1,qr); } il void Ta(int u,int x){ rt[u]=rt[u-1]; while(x>1){ Ia(rt[u],rt[u],1,n,dfn[top[x]],dfn[x]); x=fa[top[x]]; } } il LL Iq(int x,int y,int l,int r,int ql,int qr){ LL res=1ll*(t[y].num-t[x].num)*(s[qr]-s[ql-1]); if(ql==l&&r==qr)return res+t[y].sum-t[x].sum; if(!x&&!y)return 0;int mid=(l+r)>>1; if(qr<=mid)return res+Iq(t[x].l,t[y].l,l,mid,ql,qr); if(mid<ql)return res+Iq(t[x].r,t[y].r,mid+1,r,ql,qr); return res+Iq(t[x].l,t[y].l,l,mid,ql,mid)+Iq(t[x].r,t[y].r,mid+1,r,mid+1,qr); } il LL Tq(int x,int y,int u){ LL res=0; while(u>1){ res+=Iq(x,y,1,n,dfn[top[u]],dfn[u]); u=fa[top[u]]; } return res; } int main() { n=read();q=read();A=read(); for(int i=1;i<=n;i++)b[i].age=read(),b[i].id=i; sort(b+1,b+1+n,cmp); for(int i=1;i<n;i++){ int x=read(),y=read(),z=read(); insert(x,y,z);insert(y,x,z); } dfs1(1);dfs2(1,1); for(int i=1;i<=n;i++)s[i]=s[i-1]+val[num[i]],sd[i]=sd[i-1]+dist[b[i].id]; for(int i=1;i<=n;i++)Ta(i,b[i].id),c[i]=b[i].age; while(q--){ int u=read(),l=read(),r=read(); l=(1ll*l+ans)%A;r=(1ll*r+ans)%A; if(l>r)swap(l,r); l=lower_bound(c+1,c+1+n,l)-c; r=upper_bound(c+1,c+1+n,r)-c-1; ans=sd[r]-sd[l-1]+1ll*(r-l+1)*dist[u]-2*Tq(rt[l-1],rt[r],u); printf("%lld\n",ans); } return 0; }
2019.01.02-dtoj2293-幻想乡开店(shop)
标签:line 所在地 ora lap swa 做生意 大于等于 研究 int
原文地址:https://www.cnblogs.com/Jessie-/p/10212028.html