CF757G Can Bash Save the Day?

  1. #include<bits/stdc++.h>
  2. #define RG register
  3. #define IL inline
  4. #define _ 200100
  5. #define ycb (1<<30)
  6. #define ll long long
  7. using namespace std;
  8. IL int gi(){
  9. RG int data = 0 , m = 1; RG char ch = 0;
  10. while(ch != '-' && (ch<'0' || ch > '9')) ch = getchar();
  11. if(ch == '-'){m = 0; ch = getchar();}
  12. while(ch>='0' && ch<='9'){data = (data<<1) + (data<<3) + ch - '0' ; ch = getchar();}
  13. return (m) ? data : -data ;
  14. }
  15. int fa[_],son[_],sz[_],dep[_],dfn[_],top[_];
  16. struct YCB{int ls,rs; ll tag,sum;} t[120*_] ; int n,Q,a[_],rt[_],tot;
  17. struct Road{int to,next,w;}edg[2*_] ; int head[_],cnt; ll dis[_],bit[_],ans,predist[_];
  18. IL void add(int u,int v,int w){
  19. edg[++cnt] = (Road){v , head[u] , w} ; head[u] = cnt ;
  20. }
  21. void dfs1(int u,int fth,ll dist){
  22. fa[u] = fth; dis[u] = dist;
  23. son[u] = 0; sz[u] = 1;
  24. for(int i = head[u]; i; i = edg[i].next){
  25. int v = edg[i].to;
  26. if(v == fth)continue;
  27. dfs1(v,u,dist + edg[i].w);
  28. if(!son[u] || sz[son[u]] < sz[v])son[u] = v;
  29. sz[u] = sz[u] + sz[v];
  30. }
  31. }
  32. void dfs2(RG int u,RG int upp){
  33. top[u] = upp; dfn[u] = ++cnt;
  34. predist[cnt] = predist[cnt-1] + dis[u] - dis[fa[u]] ;
  35. if(son[u]) dfs2(son[u] ,upp) ; else return ;
  36. for(RG int i = head[u] ; i ; i = edg[i].next){
  37. RG int v = edg[i].to;
  38. if(v == fa[u] || v == son[u]) continue;
  39. if(v != son[u]) dfs2(v , v) ;
  40. }return ;
  41. }
  42. IL void Pre(){
  43. n = gi(); Q = gi();
  44. for(RG int i = 1; i <= n; i ++) a[i] = gi() ;
  45. for(RG int i = 1,u,v,w; i <= n-1; i ++)
  46. u = gi() , v = gi() , w = gi() , add(u,v,w) , add(v,u,w) ;
  47. dfs1(1,0,0); cnt = 0; dfs2(1,1);
  48. }
  49. IL void Ins(int x,ll d){while(x<=n)bit[x] += d , x += (x&-x); }
  50. IL ll get(int x){RG ll ret = 0; while(x)ret += bit[x] , x -= (x&-x); return ret ; }
  51. void Build(int &o,int l,int r){
  52. o = ++ tot;
  53. t[o].tag = t[o].sum =0; if(l == r)return ;
  54. RG int mid = (l + r) >> 1;
  55. Build(t[o].ls , l , mid) ; Build(t[o].rs , mid + 1 , r) ;
  56. }
  57. void Update(int &o,int l,int r,int ql,int qr){
  58. t[++tot] = t[o]; o = tot;
  59. if(ql == l && r == qr){t[o].tag++; return ; }
  60. t[o].sum += predist[qr] - predist[ql-1] ;
  61. RG int mid = (l + r) >> 1;
  62. if(qr <= mid) Update(t[o].ls , l , mid , ql , qr) ;
  63. else if(ql > mid) Update(t[o].rs , mid + 1, r , ql , qr) ;
  64. else Update(t[o].ls,l,mid,ql,mid) , Update(t[o].rs,mid+1,r,mid+1,qr) ;
  65. }
  66. ll Query(int o,int l,int r,int ql,int qr){
  67. RG ll dt = 1ll * t[o].tag * (predist[qr]-predist[ql-1]) ;
  68. if(ql == l && r == qr) return t[o].sum + dt;
  69. RG int mid = (l + r) >> 1;
  70. if(qr <= mid) return dt + Query(t[o].ls , l , mid , ql , qr) ;
  71. if(ql > mid) return dt + Query(t[o].rs , mid + 1 , r , ql , qr) ;
  72. return dt + Query(t[o].ls , l , mid , ql , mid) + Query(t[o].rs , mid + 1, r , mid + 1, qr);
  73. }
  74. IL void Modify_Pre(int P,int p){
  75. while(top[p] ^ 1)
  76. Update(rt[P] , 1 , n , dfn[top[p]] , dfn[p]) ,
  77. p = fa[top[p]] ;
  78. if(p ^ 1) Update(rt[P] , 1 , n , dfn[son[1]] , dfn[p]) ;
  79. }
  80. IL ll Calc_Pre(int root,int p){
  81. RG ll ret = 0;
  82. while(top[p] ^ 1)
  83. ret = ret + Query(root , 1 , n , dfn[top[p]] , dfn[p]) ,
  84. p = fa[top[p]] ;
  85. if(p ^ 1) ret += Query(root , 1 , n , dfn[son[1]] , dfn[p]) ;
  86. return ret ;
  87. }
  88. int main(){
  89. Pre();
  90. Build(rt[0] , 1 , n) ;
  91. for(RG int i = 1; i <= n; i ++)
  92. rt[i] = rt[i-1] , Modify_Pre(i , a[i]) ;
  93. for(RG int i = 1; i <= n; i ++) Ins(i , dis[a[i]]) ;
  94. RG int opt,l,r,x;
  95. ans = 0;
  96. while(Q--){
  97. opt = gi();
  98. if(opt == 2) x = gi() ;
  99. else l = gi() , r = gi() , x = gi() ;
  100. l = (ans % ycb) ^ l ;
  101. r = (ans % ycb) ^ r ;
  102. x = (ans % ycb) ^ x ;
  103. if(l > r) swap(l , r) ;
  104. if(opt == 1){
  105. ans = 0;
  106. ans += 1ll * (r-l+1) * dis[x] ;
  107. ans += get(r) - get(l-1) ;
  108. ans -= 1ll * 2 * (Calc_Pre(rt[r] , x) - Calc_Pre(rt[l-1] , x));
  109. printf("%lld\n" , ans) ;
  110. }
  111. else if(opt == 2){
  112. rt[x] = rt[x-1] ;
  113. Modify_Pre(x , a[x+1]) ;
  114. Ins(x , -dis[a[x]]); Ins(x+1 , -dis[a[x+1]]);
  115. swap(a[x] , a[x+1]) ;
  116. Ins(x , dis[a[x]]) ; Ins(x+1 , dis[a[x+1]]) ;
  117. }
  118. }return 0;
  119. }

CF757G Can Bash Save the Day?的更多相关文章

  1. 【CF757G】Can Bash Save the Day? 可持久化点分树

    [CF757G]Can Bash Save the Day? 题意:给你一棵n个点的树和一个排列${p_i}$,边有边权.有q个操作: 1 l r x:询问$\sum\limits_{i=l}^r d ...

  2. [Codeforces757G]Can Bash Save the Day?——动态点分治(可持久化点分树)

    题目链接: Codeforces757G 题目大意:给出一棵n个点的树及一个1~n的排列pi,边有边权,有q次操作: 1 l r x 求 $\sum\limits_{i=l}^{r}dis(p_{i} ...

  3. alfresco install in linux, and integrated with tesseract ocr

    本文描述在Linux系统上安装Alfresco的步骤: 1. 下载安装文件:alfresco-community-5.0.d-installer-linux-x64.bin 2. 增加执行权限并执行: ...

  4. Docker详解(上)

    Docker 学习 Docker概述 Docker安装 Docker命令 镜像命令 容器命令 操作命令 ... Docker镜像 容器数据卷 DockerFile Docker网络原理 IDEA整合D ...

  5. cmder git bash 使用

    cmder 是一款 windows 下的命令集合软件,它可以集合各种系统下的命令,并且操作非常快速方便. 安装有两个版本,一个是简化版(4.27M),一个是完全版(75.7M),它们的唯一区别:完全版 ...

  6. read name 和 read 在 Bash 中的区别

    read 带一个参数和不带参数的区别是什么,我本以为仅仅是被赋值的变量的名字不同而已: $ read name 1 $ echo "$name" 1 $ read 1 $ echo ...

  7. How can i use iptables save on centos 7?

    I installed CentOS 7 with minimal configuration (os + dev tools). I am trying to open 80 port for ht ...

  8. Git bash 配置ssh key

    问题描述 昨天为了配置Qt create中的Git,把我一直在使用的Github删除了,今本以为,这样git的一些配置还在,可是,今天上传一些提交的时候,提示我,git没有密钥.梳理一下,这个简单的配 ...

  9. 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!

    今年微软Build 2016大会最让开发人员兴奋的消息之一,就是在Windows上可以原生运行Linux bash,对开发人员来说,这是一个喜闻乐见的消息. 1 安装 你必须安装开发者预览版本,才能使 ...

随机推荐

  1. 2038: [2009国家集训队]小Z的袜子(hose)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 9472  Solved: 4344 Desc ...

  2. Ubuntu adb 报错:no permissions (user in plugdev group; are your udev rules wrong?);

    Ubuntu 下 adb 报错: caoxinyu@caoxinyu-ThinkPad-T470p:~/Android/Sdk/platform-tools$ ./adb devices List o ...

  3. VINS(三)IMU预积分

    IMU的数据频率一般远高于视觉,在视觉两帧k,k+1之间通常会有>10组IMU数据.IMU的数据通过积分,可以获取当前位姿(p位置,q四元数表达的姿态).瞬时速度等参数. 在VIO中,如果参考世 ...

  4. letsencrypt证书-使用certbot申请wildcard证书

    目录 1. certbot安装 2. 认证方式 3. 运行命令 4. 更新 1:下载 2:配置 3:申请证书 4:续期证书 1. certbot安装 cd /usr/local/src wget ht ...

  5. DirectX11与DirectX12在古墓丽影暗影中的表现

    最近在关注这两个图形API,因为感兴趣,也算是初学者. 以下内容仅供参考. 使用古墓丽影暗影游戏,分别对这两个进行比较,得出的结论如下图(此笔记本散热很差,更改散热应该比下图结果好些): 首先看可以很 ...

  6. Unity Lighting - The Precompute Process 预计算过程(二)

      The Precompute Process 预计算过程 In Unity, precomputed lighting is calculated in the background - eith ...

  7. 博客更换至 www.zhaoch.top

    博客更换至 www.zhaoch.top 随手拷了一些链接 http://www.zhaoch.top/操作系统/linux/常用命令备忘.html http://www.zhaoch.top/操作系 ...

  8. VMware实现控制台功能(VMware Remote Console)

    说明: 刚开始一脸懵逼,google了一些资料,发现基本没有能快速落地的,自己做完后梳理了一下发上来供大家参考. 如果帮到你了,请点赞评论关注,以资鼓励,多谢~ 实现VMware控制台功能主要有两种方 ...

  9. [转载]启动tomcat时,一直卡在Deploying web application directory这块的解决方案

    转载:https://www.cnblogs.com/mycifeng/p/6972446.html 本来今天正常往服务器上扔一个tomcat 部署一个项目的, 最后再启动tomcat 的时候 发现项 ...

  10. poj 2155 (二维树状数组 区间修改 求某点值)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 33682   Accepted: 12194 Descript ...