题面

根据树上距离的计算方法,可以先把答案化成$\sum dep_i+n*dep_u-\sum 2*dep[LCA(i,u)]$的形式,然后维护$\sum 2*dep[LCA(i,u)]$

把妖怪们按年龄排序,轻重剖分后插入每个点到根的路径,记录经过次数,询问也是往根跳然后每次统计边权*次数。

可持久化线段树+差分

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=,M=1e7+,inf=1e9;
  6. int root[N],son[M][],num[M];
  7. int p[N],noww[N],goal[N],val[N];
  8. int siz[N],far[N],imp[N],top[N],dfn[N];
  9. long long dis[N],sum1[N],sum2[N],sum[M],ans;
  10. int n,m,nm,rt,t1,t2,t3,rot,cnt,tot;
  11. struct a
  12. {
  13. int age,idx;
  14. }mon[N];
  15. bool operator < (a x,a y)
  16. {
  17. return x.age==y.age?x.idx<y.idx:x.age<y.age;
  18. }
  19. void Link(int f,int t,int v)
  20. {
  21. noww[++cnt]=p[f],p[f]=cnt;
  22. goal[cnt]=t,val[cnt]=v;
  23. noww[++cnt]=p[t],p[t]=cnt;
  24. goal[cnt]=f,val[cnt]=v;
  25. }
  26. void DFS(int nde,int fth)
  27. {
  28. int tmp=;
  29. siz[nde]=,far[nde]=fth;
  30. for(int i=p[nde],g;i;i=noww[i])
  31. if((g=goal[i])!=fth)
  32. {
  33. dis[g]=dis[nde]+val[i];
  34. DFS(g,nde),siz[nde]+=siz[g];
  35. if(siz[g]>tmp) tmp=siz[g],imp[nde]=g;
  36. }
  37. }
  38. void Mark(int nde,int tpp)
  39. {
  40. top[nde]=tpp,dfn[nde]=++tot;
  41. sum1[tot]=dis[nde]-dis[far[nde]];
  42. if(imp[nde])
  43. {
  44. Mark(imp[nde],tpp);
  45. for(int i=p[nde],g;i;i=noww[i])
  46. if((g=goal[i])!=far[nde]&&g!=imp[nde]) Mark(g,g);
  47. }
  48. }
  49.  
  50. int Insert(int pre,int l,int r,int ll,int rr)
  51. {
  52. int nde=++tot;
  53. son[nde][]=son[pre][];
  54. son[nde][]=son[pre][];
  55. num[nde]=num[pre],sum[nde]=sum[pre];
  56. if(l==ll&&r==rr) num[nde]++;
  57. else
  58. {
  59. int mid=(l+r)>>;
  60. sum[nde]+=sum1[rr]-sum1[ll-];
  61. if(mid>=rr) son[nde][]=Insert(son[pre][],l,mid,ll,rr);
  62. else if(mid<ll) son[nde][]=Insert(son[pre][],mid+,r,ll,rr);
  63. else son[nde][]=Insert(son[pre][],l,mid,ll,mid),
  64. son[nde][]=Insert(son[pre][],mid+,r,mid+,rr);
  65. }
  66. return nde;
  67. }
  68. long long Query(int nde,int l,int r,int ll,int rr)
  69. {
  70. long long ret=(sum1[rr]-sum1[ll-])*num[nde];
  71. if(l==ll&&r==rr)
  72. return ret+sum[nde];
  73. else
  74. {
  75. int mid=(l+r)>>;
  76. if(mid>=rr) return ret+Query(son[nde][],l,mid,ll,rr);
  77. else if(mid<ll) return ret+Query(son[nde][],mid+,r,ll,rr);
  78. else return ret+Query(son[nde][],l,mid,ll,mid)+Query(son[nde][],mid+,r,mid+,rr);
  79. }
  80. }
  81.  
  82. int Change(int nde)
  83. {
  84. while(top[nde]!=rt)
  85. rot=Insert(rot,,n,dfn[top[nde]],dfn[nde]),nde=far[top[nde]];
  86. return rot=Insert(rot,,n,,dfn[nde]);
  87. }
  88. long long Ask(int trt,int nde)
  89. {
  90. long long ret=;
  91. while(top[nde]!=rt)
  92. ret+=Query(trt,,n,dfn[top[nde]],dfn[nde]),nde=far[top[nde]];
  93. return ret+Query(trt,,n,,dfn[nde]);
  94. }
  95.  
  96. int main()
  97. {
  98. scanf("%d%d%d",&n,&m,&nm),rt=;
  99. for(int i=;i<=n;i++)
  100. scanf("%d",&t1),mon[i]=(a){t1,i};
  101. sort(mon+,mon++n);
  102. for(int i=;i<n;i++)
  103. scanf("%d%d%d",&t1,&t2,&t3),Link(t1,t2,t3);
  104. DFS(,),Mark(,);
  105. for(int i=;i<=n;i++)
  106. sum1[i]+=sum1[i-],sum2[i]=sum2[i-]+dis[mon[i].idx];
  107. for(int i=;i<=n;i++)
  108. root[i]=Change(mon[i].idx);
  109. for(int i=;i<=m;i++)
  110. {
  111. scanf("%d%d%d",&t1,&t2,&t3);
  112. t2=(ans+t2)%nm,t3=(ans+t3)%nm;
  113. if(t2>t3) swap(t2,t3);
  114. int ll=lower_bound(mon+,mon++n,(a){t2,})-mon;
  115. int rr=upper_bound(mon+,mon++n,(a){t3,inf})-mon-;
  116. // printf("%d==%d==%d==%d==%d==",ll,rr,dis[t1]*(rr-ll+1),sum2[rr]-sum2[ll-1],2*(Ask(root[rr],t1)-Ask(root[ll-1],t1)));
  117. printf("%lld\n",ans=dis[t1]*(rr-ll+)+sum2[rr]-sum2[ll-]-*(Ask(root[rr],t1)-Ask(root[ll-],t1)));
  118. }
  119. return ;
  120. }

解题:HNOI 2015 开店的更多相关文章

  1. [HNOI 2015]开店

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

  2. [HNOI 2015]实验比较

    Description 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 N 张图片,编号为 1 到 N.实验分若干轮进行,在每轮实验中,小 D会被要求观看某两张随机选 ...

  3. [HNOI 2015]亚瑟王

    Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...

  4. [HNOI 2015]接水果

    Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The big black,  她觉得这个游戏太简单了,于是发明了一个更 ...

  5. [HNOI 2015]菜肴制作

    Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号 ...

  6. [HNOI 2015]落忆枫音

    Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题.  「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们 ...

  7. 【题解】亚瑟王 HNOI 2015 BZOJ 4008 概率 期望 动态规划

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4008 一道不简单的概率和期望dp题 根据期望的线性性质,容易想到,可以算出每张卡的期望伤害, ...

  8. 「HNOI 2015」实验比较

    \(Description\) 有\(n\)个元素,对于每个元素\(x_i\)最多知道一个形如\(x_j < x_i\)或\(x_j=x_i\)的条件,问有多少合法的序列.合法的序列满足每个元素 ...

  9. [BZOJ 4010][HNOI 2015] 菜肴制作

    4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 1776  Solved: 889[Submit][Status ...

随机推荐

  1. kettle学习笔记(七)——kettle流程步骤与应用步骤

    一.概述 流程主要用来控制数据流程与数据流向 应用则是提供一些工具类 二.流程步骤 1.ETL元数据注入 类似Java中的反射,在设计时不知道文件名.文件位置等,在真正执行时才知道具体的一些配置等信息 ...

  2. 20155338课程设计个人报告——基于ARM实验箱的Android交友软件的设计与实现

    课程设计个人报告--基于ARM实验箱的Android交友软件的设计与实现 个人贡献 实验环境的搭建 代码调试 在电脑上成功运行 研究程序代码撰写小组报告 一.实验环境 1.Eclipse软件开发环境: ...

  3. 原生 JS 实现手机验证码倒计时

    可以使用 pointer-events 来阻止元素成为鼠标事件的 target.html5 新增操作元素 class 类名的方式 classList. classList 方法 add(value): ...

  4. Java使用Redis学习笔记

    如果我们使用Java操作Redis, 需要确保已经安装了 redis 服务及 Java redis 驱动. Maven项目可以直接在pom.xml中加入jedis包驱动: <dependency ...

  5. Asp.Net_Mvc3.5语法_<%%>的用法

    一. <%%>这种格式实际上就是和asp的用法一样的,只是asp中里面是vbscript或 者javascript代码,而在asp.net中用的是.net平台下支持的语言.特别 注意:服务 ...

  6. CentOS 6.8 安装Tomcat7

    一.下载Tomcat到服务器上 将Tomcat包下载到devleoper(没有此目录创建一个)目录下: 二.解压安装包 下载好之后,直接解压,使用命令: .tar.gz # 是否使用sudo权限执行根 ...

  7. Unity光照与渲染设置学习笔记

    学习了一下unity中有关光照和渲染的一些设置,现在才明白之前遇到的一些问题只是没有正确设置而已. unity不同版本的光照设置会有一些差异,而且可以调节的参数非常多,这里只记录一些重要的参数和使用方 ...

  8. CEPH FILESYSTEM

    参考文档: CEPH FILESYSTEM:http://docs.ceph.com/docs/master/cephfs/ CephFS best practices:http://docs.cep ...

  9. 第十一周PSP&进度条

    PSP 一.表格: D日期     C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(mins) 11月24号 站立会议 分配任务&设计final方案 1 ...

  10. [转载] Activiti Tenant Id 字段释疑

    TENANT_ID_ :  这个字段表示租户ID.可以应对多租户的设计. 转载自: http://www.cnblogs.com/yg_zhang/p/4201288.html http://www. ...