思路:

http://blog.csdn.net/lych_cys/article/details/50763073

lych的题解…… 写得很详细

//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
#define N 300050
int n,Q,A,age[N],w[N],v[N],next[N],first[N],tot,rev[N],root[N];
int xx,yy,zz,size[N],fa[N],top[N],cnt,p[N],dis[N],son[N],deep[N];
int ans,edg[N],sum[N];
struct Node{int age,id;}node[N],jy;
struct Tree{int l,r,sum,lazy;}tr[N*40];
bool operator<(Node a,Node b){return a.age<b.age;}
void add(int x,int y,int z){w[tot]=z,v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void dfs(int x){
size[x]=1;
for(int i=first[x];~i;i=next[i])if(v[i]!=fa[x]){
fa[v[i]]=x,dis[v[i]]=dis[x]+w[i],edg[v[i]]=w[i];
deep[v[i]]=deep[x]+1,dfs(v[i]);
size[x]+=size[v[i]];
if(size[son[x]]<size[v[i]])son[x]=v[i];
}
}
void dfs(int x,int tp){
top[x]=tp,p[x]=++cnt,rev[cnt]=x;
if(son[x])dfs(son[x],tp);
for(int i=first[x];~i;i=next[i])
if(v[i]!=fa[x]&&v[i]!=son[x])dfs(v[i],v[i]);
}
void insert(int l,int r,int x,int &y,int L,int R){
y=++cnt;int mid=(l+r)>>1;
tr[y].sum=tr[x].sum,tr[y].lazy=tr[x].lazy;
if(l==L&&r==R){tr[y].l=tr[x].l,tr[y].r=tr[x].r,tr[y].lazy++;return;}
tr[y].sum+=sum[R]-sum[L-1];
if(mid<L)tr[y].l=tr[x].l,insert(mid+1,r,tr[x].r,tr[y].r,L,R);
else if(mid>=R)tr[y].r=tr[x].r,insert(l,mid,tr[x].l,tr[y].l,L,R);
else insert(l,mid,tr[x].l,tr[y].l,L,mid),insert(mid+1,r,tr[x].r,tr[y].r,mid+1,R);
}
void insert(int x,int i){
root[i]=root[i-1];
while(top[x]!=1)insert(1,n,root[i],root[i],p[top[x]],p[x]),x=fa[top[x]];
insert(1,n,root[i],root[i],1,p[x]);
}
int query(int l,int r,int x,int y,int L,int R){
int mid=(l+r)>>1,temp=(tr[y].lazy-tr[x].lazy)*(sum[R]-sum[L-1]);
if(l>=L&&r<=R){return temp+tr[y].sum-tr[x].sum;}
if(mid<L)return temp+query(mid+1,r,tr[x].r,tr[y].r,L,R);
else if(mid>=R)return temp+query(l,mid,tr[x].l,tr[y].l,L,R);
else return temp+query(l,mid,tr[x].l,tr[y].l,L,mid)+query(mid+1,r,tr[x].r,tr[y].r,mid+1,R);
}
int query(int x,int y,int u){
int temp=0;
while(top[u]!=1)temp+=query(1,n,root[x],root[y],p[top[u]],p[u]),u=fa[top[u]];
return temp+query(1,n,root[x],root[y],1,p[u]);
}
signed main(){
memset(first,-1,sizeof(first));
scanf("%lld%lld%lld",&n,&Q,&A);
for(int i=1;i<=n;i++)scanf("%lld",&node[i].age),node[i].id=i;
sort(node+1,node+1+n);
for(int i=1;i<n;i++)
scanf("%lld%lld%lld",&xx,&yy,&zz),add(xx,yy,zz),add(yy,xx,zz);
dfs(1),dfs(1,1),cnt=0;
for(int i=1;i<=n;i++)sum[i]=sum[i-1]+edg[rev[i]];
for(int i=1;i<=n;i++)insert(node[i].id,i);
for(int i=1;i<=Q;i++){
int u,a,b,l,r;
scanf("%lld%lld%lld",&u,&a,&b);
a=(a+ans)%A,b=(b+ans)%A;
if(a>b)swap(a,b);
jy.age=a,l=lower_bound(node+1,node+1+n,jy)-node-1;
jy.age=b,r=upper_bound(node+1,node+1+n,jy)-node-1;
ans=tr[root[r]].sum-tr[root[l]].sum+dis[u]*(r-l)-2*query(l,r,u);
printf("%lld\n",ans);
}
}

BZOJ 4012 树链剖分+主席树的更多相关文章

  1. dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448

    4448: [Scoi2015]情报传递 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 588  Solved: 308[Submit][Status ...

  2. bzoj 4448 [Scoi2015]情报传递 (树链剖分+主席树)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4448 题面: Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络 ...

  3. BZOJ 4448: [Scoi2015]情报传递 树链剖分 主席树

    4448: [Scoi2015]情报传递 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4448 Description 奈特公司是一个巨 ...

  4. Codechef FIBTREE 树链剖分 主席树 LCA 二次剩余 快速幂

    原文链接https://www.cnblogs.com/zhouzhendong/p/CC-FIBTREE.html 题目传送门 - CC-FIBTREE 题意 给定一个有 $n$ 个节点,初始点权都 ...

  5. BZOJ1146 [CTSC2008]网络管理Network 树链剖分 主席树 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1146 题意概括 在一棵树上,每一个点一个权值. 有两种操作: 1.单点修改 2.询问两点之间的树链 ...

  6. [GDOI2016][树链剖分+主席树]疯狂动物城

    题面 Description Nick 是只在动物城以坑蒙拐骗为生的狐狸,儿时受到偏见的伤害,放弃了自己的理想.他被兔子 Judy 设下圈套,被迫与她合作查案,而卷入意想不到的阴谋,历尽艰险后成为搭档 ...

  7. HDU 5111 Alexandra and Two Trees 树链剖分 + 主席树

    题意: 给出两棵树,每棵树的节点都有一个权值. 同一棵树上的节点的权值互不相同,不同树上节点的权值可以相同. 要求回答如下询问: \(u_1 \, v_1 \, u_2 \, v_2\):询问第一棵树 ...

  8. 5.15 牛客挑战赛40 E 小V和gcd树 树链剖分 主席树 树状数组 根号分治

    LINK:小V和gcd树 时限是8s 所以当时好多nq的暴力都能跑过. 考虑每次询问暴力 跳父亲 这样是nq的 4e8左右 随便过. 不过每次跳到某个点的时候需要得到边权 如果直接暴力gcd的话 nq ...

  9. BZOJ3531 SDOI2014 旅行 - 树链剖分,主席树

    题意:给定一棵树,树上每个点有权值和类型.支持:修改某个点的类型:修改某个点的权值:询问某条链上某个类型的点的和/最大值.点数/类型数/询问数<=100000. 分析: 树链剖分,对每个类型的点 ...

  10. BZOJ4012 HNOI2015开店(树链剖分+主席树)

    考虑这样一个问题:一棵树初始全是白点,有两种操作:把一个点染黑:询问某点到所有黑点的距离之和. 注意到树上两点x和y的距离为depth[x]+depth[y]-depth[lca(x,y)]*2.要求 ...

随机推荐

  1. Java基础9一面向对象

    继承 1.特点 a) 要有一定的层次结构,并且具备可传递性. b) 判断两者之间是否有继承关系通过is-a来判断. c) 子类继承了父类,那么子类就继承了父类中所有的属性和方法,但是父类中的私有属性和 ...

  2. MySQL 5.6 Reference Manual-14.6 InnoDB Table Management

    14.6 InnoDB Table Management 14.6.1 Creating InnoDB Tables 14.6.2 Moving or Copying InnoDB Tables to ...

  3. 腾讯云TrustAsia DV SSL CA证书的申请及使用

    1.证书申请及管理     对于已经拥有域名及公网服务器的用户,可以通过腾讯云申请TrustAsia DV SSL CA证书,证书申请流程包含填写基本信息和域名认证两步,非常清晰和简单,没有什么需要过 ...

  4. easyui的datetimebox时间格式化详解

    今天公司让用easyui的datetimebox组件,而且还要让格式化成大家通用的那种,网上搜了很多,但差不多都是复制黏贴的,最后请教了下螃蟹. 感谢螃蟹抽空给做了个例子,现在拿出来和大家分享下,效果 ...

  5. Struts2学习笔记 - Part.01

    1.关于Struts2中的struts.xml文件中action设置 <!-- 它是一个通用action,此处的*表明它可以处理任意的请求--> <action name=" ...

  6. switch穿透中语句的执行顺序

    Day04_SHJavaTraing_4-6-2017 计算下列switch语句的运行结果 1. int x = 2,y=3; switch(x){ default: y++; case 3: y++ ...

  7. highcharts例子

    直接看代码 <script language="JavaScript"> $(document).ready(function() { $.ajax({ type:'p ...

  8. 接口测试及Postman工具

    首先,什么是接口呢? 接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口.系统对外的接口:比如你要从别的网站或服务器上获取资源或信息,别人肯定不会把数据库共享给你,他只能给你提供一个他们写 ...

  9. http-server 简介 复制的

    http-server 简介 https://blog.csdn.net/ithanmang/article/details/88375259http-server 是一个简单的零配置的命令行 htt ...

  10. 实现el-dialog的拖拽,全屏,缩小功能

    基于el-dialog, 封装了一下.,实在懒得写,所以直接把代码 粘出来了 大概粘了一下效果.自己体会把. 组件使用 <el-dialog v-dialogDrag ref="xhz ...