考完了可以发题解了。

做法是link-cut tree维护子树信息,并不需要维护黑树白树那些的。

下面是一条重链:

如果4是根的话,那么在splay上是这样的:

在splay中,子树的信息都已经计算完毕,那么需要计算这个子树的答案。

这个子树有4个部分:

4:树根。

1,2,3:树根上面的点。

5,6:树根下面的点。

other:树根的虚子树。

那么简化一下:

显然是需要记录答案的,还要记录什么?

  • 3,4会受到1,2的影响,所以答案要加上3,4中黑点数×1,2中权值和
  • 1会受到2的影响,所以答案要加上1中黑点数×2中权值和
  • 没了。剩下的都在原来就计算好了。

所以还要记子树黑点数和权值和。

然后就做完了。

注意一下,splay有reverse操作,所以还要记一个反的答案(丧心病狂,,,),不过虚子树答案不用反过来。

  1. // It is made by XZZ
  2. #include<cstdio>
  3. #include<algorithm>
  4. #define il inline
  5. #define rg register
  6. #define vd void
  7. #define sta static
  8. typedef long long ll;
  9. il int gi(){
  10. rg int x=0,f=1;rg char ch=getchar();
  11. while(ch<'0'||ch>'9')f=ch=='-'?-1:f,ch=getchar();
  12. while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
  13. return x*f;
  14. }
  15. const int maxn=4e5+1;
  16. int ch[maxn][2],fa[maxn],w[maxn];
  17. ll lans[maxn],rans[maxn],_ans[maxn],tot[maxn],_tot[maxn],W[maxn];
  18. bool col[maxn];
  19. bool rev[maxn];
  20. typedef const int& ci;
  21. il vd Rev(ci x){if(x)rev[x]^=1,std::swap(ch[x][0],ch[x][1]),std::swap(lans[x],rans[x]);}
  22. il bool isrt(ci x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
  23. il vd down(ci x){
  24. if(!x)return;
  25. if(!isrt(x))down(fa[x]);
  26. if(rev[x])Rev(ch[x][0]),Rev(ch[x][1]),rev[x]=0;
  27. }
  28. il vd upd(ci x){
  29. if(!x)return;
  30. W[x]=W[ch[x][0]]+W[ch[x][1]]+w[x];
  31. tot[x]=_tot[x]+tot[ch[x][0]]+tot[ch[x][1]]+col[x];
  32. lans[x]=_ans[x]+lans[ch[x][0]]+lans[ch[x][1]]+(_tot[x]+tot[ch[x][1]]+col[x])*(w[x]+W[ch[x][0]]);
  33. rans[x]=_ans[x]+rans[ch[x][1]]+rans[ch[x][0]]+(_tot[x]+tot[ch[x][0]]+col[x])*(w[x]+W[ch[x][1]]);
  34. }
  35. il vd rotate(ci x){
  36. rg int y=fa[x],z=fa[fa[x]],o=x==ch[y][1];
  37. if(!isrt(y))ch[z][y==ch[z][1]]=x;fa[x]=z;
  38. ch[y][o]=ch[x][!o];fa[ch[x][!o]]=y;
  39. fa[y]=x;ch[x][!o]=y;
  40. upd(y);
  41. }
  42. il vd splay(ci x){
  43. down(x);
  44. rg int y,z;
  45. for(y=fa[x],z=fa[y];!isrt(x);rotate(x),y=fa[x],z=fa[y])
  46. if(!isrt(y))rotate(((x==ch[y][1])==(y==ch[z][1]))?y:x);
  47. upd(x);
  48. }
  49. il vd access(int x){
  50. for(rg int y=0;x;x=fa[y=x]){
  51. splay(x);
  52. _tot[x]+=tot[ch[x][1]]-tot[y];
  53. _ans[x]+=lans[ch[x][1]]-lans[y];
  54. ch[x][1]=y;
  55. upd(x);
  56. }
  57. }
  58. il vd makert(ci x){access(x),splay(x);Rev(x);}
  59. il vd link(ci x,ci y){
  60. makert(x),makert(y);
  61. _tot[x]+=tot[y];
  62. _ans[x]+=lans[y];
  63. fa[y]=x;upd(x);
  64. }
  65. il vd cut(ci x,ci y){
  66. makert(x),access(y),splay(y);
  67. int z=ch[y][0];
  68. ch[z][0]=fa[y]=ch[x][0]=fa[z]=0;
  69. upd(y);
  70. }
  71. int main(){
  72. int n=gi(),m=gi(),k=gi(),cnt=n,u,v,_w;
  73. while(m--){
  74. u=gi(),v=gi(),_w=gi();
  75. ++cnt;w[cnt]=W[cnt]=_w;link(u,cnt),link(v,cnt);
  76. }
  77. char opt[2];
  78. while(k--){
  79. scanf("%s",opt);
  80. if(opt[0]=='L'){
  81. u=gi(),v=gi(),_w=gi();
  82. w[++cnt]=_w;link(u,cnt),link(v,cnt);
  83. }else if(opt[0]=='C'){
  84. u=gi(),v=gi();
  85. makert(u),access(v),splay(v);
  86. int z=ch[v][0];
  87. if(ch[z][1])z=ch[z][1];
  88. cut(u,z),cut(v,z);
  89. }
  90. else if(opt[0]=='F')u=gi(),makert(u),col[u]^=1,upd(u);
  91. else if(opt[0]=='Q')u=gi(),makert(u),printf("%lld\n",lans[u]);
  92. }
  93. return 0;
  94. }

2.4KB

loj558 「Antileaf's Round」我们的CPU遭到攻击的更多相关文章

  1. LOJ #556. 「Antileaf's Round」咱们去烧菜吧

    好久没更博了 咕咕咕 现在多项式板子的常数巨大...周末好好卡波常吧.... LOJ #556 题意 给定$ m$种物品的出现次数$ B_i$以及大小$ A_i$ 求装满大小为$[1..n]$的背包的 ...

  2. 【刷题】LOJ 556 「Antileaf's Round」咱们去烧菜吧

    题目描述 你有 \(m\) 种物品,第 \(i\) 种物品的大小为 \(a_i\) ​,数量为 \(b_i\)​( \(b_i=0\) 表示有无限个). 你还有 \(n\) 个背包,体积分别为 \(1 ...

  3. LOJ#557. 「Antileaf's Round」你这衣服租来的吗(FHQ Treap+珂朵莉树)

    题面 传送门 题解 好吧我是不太会复杂度分析-- 我们对于每种颜色用一个数据结构维护(比方说线段树或者平衡树,代码里写的平衡树),那么区间询问很容易就可以解决了 所以现在的问题是区间修改,如果区间颜色 ...

  4. 「LOJ 556 Antileaf's Round」咱们去烧菜吧

    「LOJ 556 Antileaf's Round」咱们去烧菜吧 最近在看 jcvb 的生成函数课件,顺便切一切上面讲到的内容的板子题,这个题和课件上举例的背包计数基本一样. 解题思路 首先列出答案的 ...

  5. 「LibreOJ NOI Round #2」不等关系

    「LibreOJ NOI Round #2」不等关系 解题思路 令 \(F(k)\) 为恰好有 \(k\) 个大于号不满足的答案,\(G(k)\) 表示钦点了 \(k\) 个大于号不满足,剩下随便填的 ...

  6. LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿

    二次联通门 : LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 /* LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 dp 记录一下前驱 ...

  7. 对于前端,「微信小程序」其实不美好

    微信小程序开放公测了,9月底我曾经写过一篇 「微信小程序」来了,其中最后一句:"谢天谢地,我居然还是个前端". 这种火爆的新事物总是令人激动,感谢这个时代. 但是,当我真作为开发者 ...

  8. macOS安装「oh my zsh」

    目前常用的 Linux 系统和 OS X 系统的默认 Shell 都是 bash,但是真正强大的 Shell 是深藏不露的 zsh, 这货绝对是马车中的跑车,跑车中的飞行车,史称『终极 Shell』, ...

  9. 报名|「OneAPM x DaoCloud」技术公开课:Docker性能监控!

    如今,越来越多的公司开始 Docker 了,「三分之二的公司在尝试了 Docker 后最终使用了它」,也就是说 Docker 的转化率达到了 67%,同时转化时长也控制在 60 天内. 既然 Dock ...

随机推荐

  1. lsync目录文件实时同步工具

    参考文档:https://vastxiao.github.io/article/2017/09/02/Linux/lsyncd_usage/ 防止连接丢失,已保存至百度网络-郑州-XXXXX 建议首先 ...

  2. September 26th 2017 Week 39th Tuesday

    I have to protect the one thing I can't live without. 我必须为我一生挚爱遮风挡雨. A man is a success if he gets u ...

  3. 【2017-01-08】QTimer与QThread的调度时间精度

    在最近的项目开发中,我发现有的人喜欢用QThread来实现需要循环执行的工作流,而有的人又喜欢用QTimer来实现. 在表面上,两种实现方式似乎都可以,但我觉得QTimer的精度可能会有问题,首先看一 ...

  4. python SQLAlchemy复习

    下面的代码主要使用SQLAlchemy的ORM思想实现查询单词的功能: 实现输入一个单词,查询出与输入单词接近的单词以及单词的意思. 主要有以下三步: 1.创建数据表 2.插入数据 3.查询数据 1. ...

  5. MySQL半同步主从.md

    MySQL Semisynchronous Replication 复制架构衍生史 1.普通的replication,异步同步. 搭建简单,使用非常广泛,从mysql诞生之初,就产生了这种架构,性能非 ...

  6. struts2中的文件上传和下载

    天下大事,必做于细.天下难事,必作于易. 以前见过某些人,基础的知识还不扎实就去学习更难的事,这样必定在学习新的知识会非常迷惑结果 再回来又一次学习一下没有搞懂的知识,这必定会导致学习效率的下降!我写 ...

  7. UVa 1412 - Fund Management(状压DP + 预处理)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. 约束,索引,rownum&rownum

    --constraint --not null 非空约束 --unique 唯一键 --非空&唯一 --自定义检查约束 --创建约束时,为约束起名 --在添加完列后,还可以添加约束 --除了n ...

  9. 豆瓣电影top250爬取并保存在MongoDB里

    首先回顾一下MongoDB的基本操作: 数据库,集合,文档 db,show dbs,use 数据库名,drop 数据库 db.集合名.insert({}) db.集合名.update({条件},{$s ...

  10. ICC Scenario Definition

    现代先进工艺下的后端设计都是在 MCMM 情况下设计的,所谓 MCMM 就是 muti-corner  muti-mode,用于芯片的不同工作模式和工作条件. 后端设计过程中,需要保证芯片在所有工作模 ...