【BZOJ4012】开店(主席树)

题面

Description

风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到

人生哲学。最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱。这样的

想法当然非常好啦,但是她们也发现她们面临着一个问题,那就是店开在哪里,面

向什么样的人群。很神奇的是,幻想乡的地图是一个树形结构,幻想乡一共有 n

个地方,编号为 1 到 n,被 n-1 条带权的边连接起来。每个地方都住着一个妖怪,

其中第 i 个地方的妖怪年龄是 x_i。妖怪都是些比较喜欢安静的家伙,所以它们并

不希望和很多妖怪相邻。所以这个树所有顶点的度数都小于或等于 3。妖怪和人一

样,兴趣点随着年龄的变化自然就会变化,比如我们的 18 岁少女幽香和八云紫就

比较喜欢可爱的东西。幽香通过研究发现,基本上妖怪的兴趣只跟年龄有关,所以

幽香打算选择一个地方 u(u为编号),然后在 u开一家面向年龄在 L到R 之间(即

年龄大于等于 L、小于等于 R)的妖怪的店。也有可能 u这个地方离这些妖怪比较

远,于是幽香就想要知道所有年龄在 L 到 R 之间的妖怪,到点 u 的距离的和是多

少(妖怪到 u 的距离是该妖怪所在地方到 u 的路径上的边的权之和) ,幽香把这个

称为这个开店方案的方便值。幽香她们还没有决定要把店开在哪里,八云紫倒是准

备了很多方案,于是幽香想要知道,对于每个方案,方便值是多少呢。

Input

第一行三个用空格分开的数 n、Q和A,表示树的大小、开店的方案个数和妖

怪的年龄上限。

第二行n个用空格分开的数 x_1、x_2、…、x_n,x_i 表示第i 个地点妖怪的年

龄,满足0<=x_i<A。(年龄是可以为 0的,例如刚出生的妖怪的年龄为 0。)

接下来 n-1 行,每行三个用空格分开的数 a、b、c,表示树上的顶点 a 和 b 之

间有一条权为c(1 <= c <= 1000)的边,a和b 是顶点编号。

接下来Q行,每行三个用空格分开的数 u、 a、 b。对于这 Q行的每一行,用 a、

b、A计算出 L和R,表示询问“在地方 u开店,面向妖怪的年龄区间为[L,R]的方

案的方便值是多少”。对于其中第 1 行,L 和 R 的计算方法为:L=min(a%A,b%A),

R=max(a%A,b%A)。对于第 2到第 Q行,假设前一行得到的方便值为 ans,那么当

前行的 L 和 R 计算方法为: L=min((a+ans)%A,(b+ans)%A),

R=max((a+ans)%A,(b+ans)%A)。

Output

对于每个方案,输出一行表示方便值。

Sample Input

10 10 10

0 0 7 2 1 4 7 7 7 9

1 2 270

2 3 217

1 4 326

2 5 361

4 6 116

3 7 38

1 8 800

6 9 210

7 10 278

8 9 8

2 8 0

9 3 1

8 0 8

4 2 7

9 7 3

4 7 0

2 2 7

3 2 1

2 3 4

Sample Output

1603

957

7161

9466

3232

5223

1879

1669

1282

0

HINT

满足 n<=150000,Q<=200000。对于所有数据,满足 A<=10^9

题解

这道题目和BZOJ3626 LCA很相似

所以现在就可以考虑像上面那道题目一样的

向链上打标记

但是考虑到有年龄的限制

所以需要用主席树

还有就是空间可能开不下

要标记永久化

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<set>
  8. #include<map>
  9. #include<vector>
  10. #include<queue>
  11. using namespace std;
  12. #define MAX 200000
  13. #define ll long long
  14. inline int read()
  15. {
  16. int x=0,t=1;char ch=getchar();
  17. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  18. if(ch=='-')t=-1,ch=getchar();
  19. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  20. return x*t;
  21. }
  22. struct Line
  23. {
  24. int v,next,w;
  25. }e[MAX<<1];
  26. int h[MAX],cnt=1;
  27. inline void Add(int u,int v,int w)
  28. {
  29. e[cnt]=(Line){v,h[u],w};h[u]=cnt++;
  30. }
  31. int n,Q,A,Age[MAX],S[MAX],tot;
  32. /***********************************************************************/
  33. int dfn[MAX],dis[MAX],top[MAX],size[MAX],hson[MAX],fa[MAX];
  34. int tim,ln[MAX];
  35. void dfs1(int u,int ff)
  36. {
  37. fa[u]=ff;size[u]=1;
  38. for(int i=h[u];i;i=e[i].next)
  39. {
  40. int v=e[i].v;
  41. if(v==ff)continue;
  42. dis[v]=dis[u]+e[i].w;
  43. dfs1(v,u);
  44. size[u]+=size[v];
  45. if(size[v]>size[hson[u]])hson[u]=v;
  46. }
  47. }
  48. void dfs2(int u,int tp)
  49. {
  50. top[u]=tp;dfn[u]=++tim;ln[tim]=u;
  51. if(hson[u])dfs2(hson[u],tp);
  52. for(int i=h[u];i;i=e[i].next)
  53. {
  54. int v=e[i].v;
  55. if(v==fa[u]||v==hson[u])continue;
  56. dfs2(v,v);
  57. }
  58. }
  59. /***********************************************************************/
  60. struct Node
  61. {
  62. int ls,rs;
  63. ll sum;
  64. ll lz;
  65. }t[MAX<<6];
  66. int Cnt;
  67. bool cmp(int a,int b){return Age[a]<Age[b];}
  68. void Build(int &now,int l,int r)
  69. {
  70. now=++Cnt;
  71. if(l==r)return;
  72. int mid=(l+r)>>1;
  73. Build(t[now].ls,l,mid);
  74. Build(t[now].rs,mid+1,r);
  75. }
  76. void Modify(int &now,int l,int r,int al,int ar)
  77. {
  78. t[++Cnt]=t[now];now=Cnt;
  79. t[now].sum+=dis[ln[ar]]-dis[fa[ln[al]]];
  80. if(l==al&&r==ar){t[now].lz++;return;}
  81. int mid=(l+r)>>1;
  82. if(ar<=mid)Modify(t[now].ls,l,mid,al,ar);
  83. else if(al>mid)Modify(t[now].rs,mid+1,r,al,ar);
  84. else
  85. {
  86. Modify(t[now].ls,l,mid,al,mid);
  87. Modify(t[now].rs,mid+1,r,mid+1,ar);
  88. }
  89. }
  90. ll Query(int now,int l,int r,ll ly,int al,int ar)
  91. {
  92. if(l==al&&r==ar)return t[now].sum+1ll*ly*(dis[ln[ar]]-dis[fa[ln[al]]]);
  93. int mid=(l+r)>>1;
  94. if(ar<=mid)return Query(t[now].ls,l,mid,ly+t[now].lz,al,ar);
  95. if(al>mid)return Query(t[now].rs,mid+1,r,ly+t[now].lz,al,ar);
  96. return Query(t[now].ls,l,mid,ly+t[now].lz,al,mid)+Query(t[now].rs,mid+1,r,ly+t[now].lz,mid+1,ar);
  97. }
  98. /***********************************************************************/
  99. ll sdis[MAX];
  100. int rt[MAX],id[MAX];
  101. ll Calc(int u,int K)
  102. {
  103. ll ret=0;
  104. while(top[u]!=1)ret+=Query(rt[K],1,n,0,dfn[top[u]],dfn[u]),u=fa[top[u]];
  105. ret+=Query(rt[K],1,n,0,1,dfn[u]);
  106. return ret;
  107. }
  108. int main()
  109. {
  110. n=read();Q=read();A=read();
  111. for(int i=1;i<=n;++i)id[i]=i,Age[i]=read(),S[++tot]=Age[i];
  112. sort(&S[1],&S[n+1]);
  113. sort(&id[1],&id[n+1],cmp);
  114. for(int i=1;i<n;++i)
  115. {
  116. int u=read(),v=read(),C=read();
  117. Add(u,v,C);Add(v,u,C);
  118. }
  119. dfs1(1,0);dfs2(1,1);
  120. Build(rt[0],1,n);
  121. for(int i=1;i<=n;++i)
  122. {
  123. int x=id[i];
  124. sdis[i]=sdis[i-1]+dis[x];
  125. rt[i]=rt[i-1];
  126. while(top[x]!=1)
  127. Modify(rt[i],1,n,dfn[top[x]],dfn[x]),x=fa[top[x]];
  128. Modify(rt[i],1,n,1,dfn[x]);
  129. }
  130. ll ans=0;
  131. int L,R;
  132. while(Q--)
  133. {
  134. ll u=read(),a=read(),b=read();
  135. L=min((ans+a)%A,(ans+b)%A);
  136. R=max((ans+a)%A,(ans+b)%A);
  137. L=lower_bound(&S[1],&S[tot+1],L)-S;
  138. R=lower_bound(&S[1],&S[tot+1],R+1)-S-1;
  139. ans=1ll*(R-L+1)*dis[u]+sdis[R]-sdis[L-1]-2ll*(Calc(u,R)-Calc(u,L-1));
  140. printf("%lld\n",ans);
  141. }
  142. return 0;
  143. }

【BZOJ4012】开店(主席树)的更多相关文章

  1. bzoj 4012: [HNOI2015]开店 主席树

    Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现 ...

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

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

  3. [HNOI2015]开店 树链剖分,主席树

    [HNOI2015]开店 LG传送门 蒟蒻表示不会动态淀粉质. 先把点按年龄排序, 设\(dis[i]\)表示\(i\)到根的距离. 把我们要算的东西稍微变下形:\(ans\) \[ = \sum \ ...

  4. [HNOI2015]开店(树剖+主席树+标记永久化)

    听说正解点分树?我不会就对了 此题是 \([LNOI2014]LCA\) 强化版,也是差分一下,转化为区间加区间和 不过权值有大小要求,那么我们按照权值排序,依次加入主席树,询问的时候 \(lower ...

  5. BZOJ 4012 [HNOI2015]开店 (区间修改 永久化标记 主席树)

    讲得好啊 主席树区间修改了,每一次遇到整区间就打永久化标记(不下传,访问的时候沿路径上的标记算答案)然后returnreturnreturn,那么每修改一次只会访问到lognlognlogn个节点,再 ...

  6. 洛谷$P$3241 开店 $[HNOI2015]$ 主席树/点分治

    正解:主席树/动态点分治 解题报告: 传送门! $umm$淀粉质的话要是动态的我还不会$QAQ$,,,所以先写下主席树的题解昂$QwQ$ 题目大意是说,给定一棵树,树上每个点都有个值,然后有若干个询问 ...

  7. BZOJ 3626 [LNOI2014]LCA 树剖+(离线+线段树 // 在线+主席树)

    BZOJ 4012 [HNOI2015]开店 的弱化版,离线了,而且没有边权(长度). 两种做法 1 树剖+离线+线段树 这道题求的是一个点zzz与[l,r][l,r][l,r]内所有点的lcalca ...

  8. bzoj3207--Hash+主席树

    题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...

  9. bzoj1901--树状数组套主席树

    树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...

随机推荐

  1. arm-点亮led灯

    点亮指路灯:学习四环节:led原理图分析,芯片手册导读,思维导图设计,为什么要使用led:通常led是作为程序调试的重要手段.led原理图:led实质为发光二极管,当其两端电压一定时,即处于导通状态. ...

  2. SpringBoot入门Demo

    前言:相信做java后台编程的童鞋都知道Spring家族,Spring作为我们项目中必备的框架.JavaSpringBoot号称javaEE的颠覆者,这引起了本Y的好奇,这才花费了一点时间,学习了下s ...

  3. 当inline元素包裹block元素时会发生什么

    经常有图片链接写法如下: <a href="www.baidu.com"><img src="baidu.jpg" /></a&g ...

  4. golang的GET请求(类似于PHP的CURL)

    check_url := "https://www.baidu.com" header := make(map[string]string) res, err := util.Hp ...

  5. 揽货最短路径解决方案算法 - C# 蚁群优化算法实现

    需求为(自己编的,非实际项目): 某配送中心进行揽货,目标客户数为50个客户,配送中心目前的运力资源如下: 现有车辆5台 单台运力最大行驶距离200千米 单台运力最大载重公斤1吨 问:运力怎样走法才能 ...

  6. Java基础(含思维导图)

    很早之前整理的Java基础的一些知识点,思维导图: 1.'别名现象' 对一个对象赋值另一个对象,会指向新的对象引用,赋值前的对象引用会由于不再被引用而被gc回收: 而基本类型则不同.基本类型存储了实际 ...

  7. mysql-connector-java 6.x 时区设置

    最近遇到了一个问题,java从mysql从读出的时间与本地时间有14个小时的时间差,经查证.测试解决了此问题,在此总结一下: jdbc:mysql:&allowMultiQueries=tru ...

  8. 危化品速查APP--Android Project

    开发环境 Android studio 2.3.1 功能描述 集成多种查询方式,查看本地数据库中危险化学品的信息: 按照中文拼音和英文首字母,对化学品进行查询: 按照UN号或者CAS号查询相应的化学品 ...

  9. SCU 4438 Censor KMP/Hash

    题意:给定一个模式串和文本,要求删除所有模式串.可能删除后会形成新的模式串,必须全部删除. 思路1:kmp算法求得失配数组,用一个match数组记录文本串中第i字符和未删除的字符能匹配模式串的长度.这 ...

  10. 转 Caffe学习系列(3):视觉层(Vision Layers)及参数

    所有的层都具有的参数,如name, type, bottom, top和transform_param请参看我的前一篇文章:Caffe学习系列(2):数据层及参数 本文只讲解视觉层(Vision La ...