感受一下这恐怖的题目长度~~~

其实题意很裸,但是作为GDOI的一道防AK题,自然有他优秀的地方。

简化题意:给出一棵树,要求支持三个操作:

1.修改点值

2.询问点$x$到$y$之间的一些东东

3.回到某个版本之前

可持久化,强制在线。

考虑拆一下询问

如果把$x$到$y$路径上的所有点值放到一个数组$a$里,那么询问式子就是:

$\sum\limits_{i=1}^{n}a[i]\times\sum\limits_{j=1}^{n-i}j$

$=\sum\limits_{i=1}^{n}a[i]\times\frac{(n-i+1)\times(n-i)}{2}$

$=\sum\limits_{i=1}^{n}a[i]\times i^{2}-a[i]\times(2n+1)+a[i]\times n\times(n+1)$

发现$a[i]$,$a[i]\times i$,$a[i]\times i^2$都是常系数,于是就可以快乐维护了~

外面的很容易想到,树链剖分+可持久化线段树,单点修改即可。

可以感觉到逐渐膨胀的代码量>_<

注意到有左右方向的区别,要写两遍

代码量起飞了>_<

5000B刷新最长代码记录

注意:记得取模,随时爆int;

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<cmath>
  5. #define mod 20160501
  6. using namespace std;
  7. typedef long long ll;
  8. struct edge{
  9. int v,next;
  10. }a[];
  11. struct data{
  12. ll s,a1,a2,s1,s2,ls,rs,lz,vv;
  13. }t[];
  14. ll n,m,u,v,w,ord,tim=,tot=,tote=,ans=,nrt=,nowrt=,last=,ans1[],ans2[],head[],rt[],num[],nmd[],dep[],top[],siz[],dfn[],son[],fa[];
  15. void add(int u,int v){
  16. a[++tote].v=v;
  17. a[tote].next=head[u];
  18. head[u]=tote;
  19. }
  20. void dfs1(int u,int f,int dpt){
  21. fa[u]=f;
  22. dep[u]=dpt;
  23. siz[u]=;
  24. for(int tmp=head[u];tmp!=-;tmp=a[tmp].next){
  25. int v=a[tmp].v;
  26. if(v==f)continue;
  27. dfs1(v,u,dpt+);
  28. siz[u]+=siz[v];
  29. if(son[u]==-||siz[v]>siz[son[u]])son[u]=v;
  30. }
  31. }
  32. void dfs2(int u,int nowtp){
  33. top[u]=nowtp;
  34. dfn[u]=++tim;
  35. nmd[tim]=u;
  36. if(son[u]==-)return;
  37. dfs2(son[u],nowtp);
  38. for(int tmp=head[u];tmp!=-;tmp=a[tmp].next){
  39. int v=a[tmp].v;
  40. if(v==son[u]||v==fa[u])continue;
  41. dfs2(v,v);
  42. }
  43. }
  44. void pushup(int u){
  45. t[u].s=(t[t[u].ls].s+t[t[u].rs].s)%mod;
  46. t[u].a1=(t[t[u].ls].a1+t[t[u].rs].a1)%mod;
  47. t[u].a2=(t[t[u].ls].a2+t[t[u].rs].a2)%mod;
  48. t[u].s1=(t[t[u].ls].s1+t[t[u].rs].s1)%mod;
  49. t[u].s2=(t[t[u].ls].s2+t[t[u].rs].s2)%mod;
  50. }
  51. void build(int l,int r,int u){
  52. if(l==r){
  53. t[u].s=num[nmd[l]];
  54. t[u].a1=dep[nmd[l]];
  55. t[u].a2=(t[u].a1*t[u].a1)%mod;
  56. t[u].s1=(t[u].s*t[u].a1)%mod;
  57. t[u].s2=(t[u].s*t[u].a2)%mod;
  58. return;
  59. }
  60. int mid=(l+r)/;
  61. build(l,mid,t[u].ls=++tot);
  62. build(mid+,r,t[u].rs=++tot);
  63. pushup(u);
  64. }
  65. void updata(int l,int r,int u,int L,int R,int lst,ll v){
  66. if(u==tot)t[u]=t[lst];
  67. if(l==L&&r==R){
  68. t[u].ls=t[lst].ls;
  69. t[u].rs=t[lst].rs;
  70. t[u].lz=(t[u].lz+v)%mod;
  71. t[u].s1=(t[u].s1+t[u].a1*v)%mod;
  72. t[u].s2=(t[u].s2+t[u].a2*v)%mod;
  73. t[u].s=(t[u].s+v*(r-l+))%mod;
  74. t[u].vv=(t[u].vv+v)%mod;
  75. return;
  76. }
  77. int mid=(l+r)/;
  78. if(R<=mid){
  79. if(t[u].rs<=last)t[u].rs=t[lst].rs;
  80. if(t[u].ls<=last)t[u].ls=++tot;
  81. updata(l,mid,t[u].ls,L,R,t[lst].ls,v);
  82. }else if(mid<L){
  83. if(t[u].ls<=last)t[u].ls=t[lst].ls;
  84. if(t[u].rs<=last)t[u].rs=++tot;
  85. updata(mid+,r,t[u].rs,L,R,t[lst].rs,v);
  86. }else{
  87. if(t[u].ls<=last)t[u].ls=++tot;
  88. updata(l,mid,t[u].ls,L,mid,t[lst].ls,v);
  89. if(t[u].rs<=last)t[u].rs=++tot;
  90. updata(mid+,r,t[u].rs,mid+,R,t[lst].rs,v);
  91. }
  92. t[u].s1=(t[t[u].ls].s1+t[t[u].rs].s1+t[u].a1*t[u].vv%mod)%mod;
  93. t[u].s2=(t[t[u].ls].s2+t[t[u].rs].s2+t[u].a2*t[u].vv%mod)%mod;
  94. t[u].s=(t[t[u].ls].s+t[t[u].rs].s+t[u].vv*(r-l+)%mod)%mod;
  95. }
  96. void getans(int u,int b,ll lz,ll v){
  97. ans=(ans+t[u].s2+lz*t[u].a2%mod)%mod;
  98. ans1[b]=(ans1[b]+t[u].s1+t[u].a1*lz%mod)%mod;
  99. ans2[b]=(ans2[b]+t[u].s+v*lz%mod)%mod;
  100. }
  101. void query(int l,int r,int u,int L,int R,int b,ll lz){
  102. if(!u)return;
  103. lz+=t[u].vv;
  104. if(l==L&&r==R){
  105. lz-=t[u].lz;
  106. getans(u,b,lz,r-l+);
  107. return;
  108. }
  109. int mid=(l+r)/;
  110. if(R<=mid)query(l,mid,t[u].ls,L,R,b,lz);
  111. else if(mid<L)query(mid+,r,t[u].rs,L,R,b,lz);
  112. else{
  113. query(l,mid,t[u].ls,L,mid,b,lz);
  114. query(mid+,r,t[u].rs,mid+,R,b,lz);
  115. }
  116. }
  117. void work(int t,int t1,int u,int v,ll w){
  118. while(top[u]!=top[v]){
  119. if(dep[top[u]]<dep[top[v]])swap(u,v);
  120. updata(,n,rt[t],dfn[top[u]],dfn[u],rt[t1],w);
  121. u=fa[top[u]];
  122. }
  123. if(dep[u]>dep[v])swap(u,v);
  124. updata(,n,rt[t],dfn[u],dfn[v],rt[t1],w);
  125. }
  126. int work1(int t,int u,int v){
  127. while(top[u]!=top[v]){
  128. if(dep[top[u]]>dep[top[v]]){
  129. query(,n,rt[t],dfn[top[u]],dfn[u],,);
  130. u=fa[top[u]];
  131. }else{
  132. query(,n,rt[t],dfn[top[v]],dfn[v],,);
  133. v=fa[top[v]];
  134. }
  135. }
  136. if(dep[u]>dep[v]){
  137. query(,n,rt[t],dfn[v],dfn[u],,);
  138. return v;
  139. }else{
  140. query(,n,rt[t],dfn[u],dfn[v],,);
  141. return u;
  142. }
  143. }
  144. int main(){
  145. memset(son,-,sizeof(son));
  146. memset(head,-,sizeof(head));
  147. scanf("%lld%lld",&n,&m);
  148. for(int i=;i<n;i++){
  149. scanf("%lld%lld",&u,&v);
  150. add(u,v);
  151. add(v,u);
  152. }
  153. for(int i=;i<=n;i++)scanf("%lld",&num[i]);
  154. dfs1(,,);
  155. dfs2(,);
  156. rt[]=tot=;
  157. build(,n,rt[]);
  158. for(int i=;i<=m;i++){
  159. scanf("%lld",&ord);
  160. if(ord==){
  161. scanf("%lld%lld%lld",&u,&v,&w);
  162. u^=ans;
  163. v^=ans;
  164. last=tot;
  165. rt[++nrt]=++tot;
  166. work(nrt,nowrt,u,v,w);
  167. nowrt=nrt;
  168. }else if(ord==){
  169. scanf("%lld%lld",&u,&v);
  170. u^=ans;
  171. v^=ans;
  172. ans=ans1[]=ans1[]=ans2[]=ans2[]=;
  173. int t=dep[v]-dep[work1(nowrt,u,v)]*;
  174. ans=(ans+ans1[]*(t*+)%mod+ans2[]*t%mod*(t+)%mod)%mod;
  175. ans=(ans-ans1[]*(dep[v]*+)%mod+ans2[]*dep[v]%mod*(dep[v]+)%mod+mod)%mod;
  176. ans=(ans*)%(ll)mod;
  177. ans=(ans+mod)%mod;
  178. printf("%lld\n",ans);
  179. }else{
  180. scanf("%lld",&u);
  181. u^=ans;
  182. nowrt=u;
  183. }
  184. }
  185. return ;
  186. }

【xsy2440】【GDOI2016】疯狂动物城的更多相关文章

  1. 《疯狂动物城》主题曲《TryEverything》中文翻译

    <疯狂动物城>主题曲<TryEverything>夏奇拉激情献唱,很多事情是需要是试试,不试试就不知道可以成功. Oh oh oh oh oooh 哦哦哦哦哦 Oh oh oh ...

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

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

  3. COGS-2049 疯狂动物城

    Description 你意外来到了一个未知的星球, 这里是一个动物乌托邦, 生活着一群拥有非凡智力的动物. 你遇到了一个叫做尼克的狐狸, 他准备给他的 GF 过生日 . 他将制作一个巨大的多层蛋糕, ...

  4. 【GDOI 2016 Day1】疯狂动物城

    题目 分析 注意注意:码农题一道,打之前做好心理准备. 对于操作1.2,修改或查询x到y的路径,显然树链剖分. 对于操作2,我们将x到y的路径分为x到lca(x,y)和lca(x,y)到y两部分. 对 ...

  5. [GDOI2016] 疯狂动物园 [树链剖分+可持久化线段树]

    题面 太长了,而且解释的不清楚,我来给个简化版的题意: 给定一棵$n$个点的数,每个点有点权,你需要实现以下$m$个操作 操作1,把$x$到$y$的路径上的所有点的权值都加上$delta$,并且更新一 ...

  6. GDOI2016酱油记(补发)

    这篇酱油记是前年发在MCHacker一个叫code-hub的博客上的(已崩),现在来补发一下... GDOI2016扯淡(爆零记) 大家好,我是巨弱DCDCBigBig,在五一期间和一群神牛去考GDO ...

  7. 【IOS】将一组包含中文的数据按照#ABC...Z✿分组

    上一篇文章[IOS]模仿windowsphone列表索引控件YFMetroListBox里面 我们一步步的实现了WindowsPhone风格的索引. 但是有没有发现,如果你要实现按照字母排序,你还得自 ...

  8. 可变数组NSMutableArray

    //创建一个空的可变数组 NSMutableArray *array = [NSMutableArray array]; //向数组里面添加对象 [array addObject:@"< ...

  9. spring笔记--依赖注入之针对不同类型变量的几种注入方式

    控制反转和依赖注入讲的都是一个概念,只不过是站在了不同的角度,所谓的依赖注入: 是指在运行期,由外部容器动态地将依赖对象注入到组件中.当spring容器启动后,spring容器初始化,创建并管理bea ...

随机推荐

  1. 第九章 Python之面向对象

    面向对象编程 面向对象编程是一种程序设计思想,它把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数 面向过程的程序设计把计算机程序视为一系列命令的集合,即一组函数的顺序执行.为了简化程序设计 ...

  2. Pyhton学习——Day8

    ###########################################max函数#################################################### ...

  3. laravel Specified key was too long; max key length is 1000 bytes

      [Illuminate\Database\QueryException]   SQLSTATE[42000]: Syntax error or access violation: 1071 Spe ...

  4. Linux下安装Solr7.5.0,并部署到Tomcat

    收藏地址:https://blog.csdn.net/qq_39135287/article/details/84260724

  5. pytorch 6 batch_train 批训练

    import torch import torch.utils.data as Data torch.manual_seed(1) # reproducible # BATCH_SIZE = 5 BA ...

  6. VUE:UI组件库(Mint UI & Elment)

    VUE:UI组件库 常用 1)Mini UI: a 主页:http://mint-ui.github.io/#!/zh-cn b 说明:饿了么开源的基于vue的移动端UI组件库 2)Elment a ...

  7. linux环境下删除包含特殊字符的文件或目录

    linux环境下删除包含特殊字符的文件或目录 ls -liUse find command as follows to delete the file if the file has inode nu ...

  8. Mybatis动态代理实现函数调用

    如果我们要使用MyBatis进行数据库操作的话,大致要做两件事情: 1. 定义DAO接口 在DAO接口中定义需要进行的数据库操作. 2. 创建映射文件 当有了DAO接口后,还需要为该接口创建映射文件. ...

  9. 学渣乱搞系列之dp斜率优化

    学渣乱搞系列之dp斜率优化 By 狂徒归来 貌似dp的斜率优化一直很难搞啊,尤其是像我这种数学很挫的学渣,压根不懂什么凸包,什么上凸下凸的,哎...说多了都是泪,跟wdd讨论了下,得出一些结论.本文很 ...

  10. C/s模式与B/S模式

    C/S模式事是client/server,即客服端/服务模式