Description

Input

Output

Sample Input

Sample Output

Solution

写了$6k$有点自闭……

一操作加边断边,二操作路径覆盖,三操作路径加,四操作求路径次大值和次大值个数。

记得讨论好覆盖标记和加标记的关系……再维护下最大值,最大值个数,次大值和次大值个数就好了。

码农题也没什么好说的……

Code

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #define N (100009)
  5 #define INF (2000000000)
  6 using namespace std;
  7
  8 int T,n,m,a,b,x,y,opt;
  9 int Max1[N],Max2[N],Cnt1[N],Cnt2[N],Rev[N],Val[N];
 10 int Father[N],Son[N][2],Add[N],Cov[N],Size[N];
 11
 12 inline int read()
 13 {
 14     int x=0,w=1; char c=getchar();
 15     while (c<'0' || c>'9') {if (c=='-') w=-1; c=getchar();}
 16     while (c>='0' && c<='9') x=x*10+c-'0', c=getchar();
 17     return x*w;
 18 }
 19
 20 int Get(int x)
 21 {
 22     return Son[Father[x]][1]==x;
 23 }
 24
 25 int Is_root(int x)
 26 {
 27     return Son[Father[x]][0]!=x && Son[Father[x]][1]!=x;
 28 }
 29
 30 void Pushup(int x)
 31 {
 32     Size[x]=Size[Son[x][0]]+Size[Son[x][1]]+1;
 33     if (!Son[x][0] && !Son[x][1])
 34     {
 35         Max1[x]=Val[x]; Max2[x]=-INF;
 36         Cnt1[x]=1; Cnt2[x]=0;
 37         return;
 38     }
 39     if (!Son[x][1])
 40     {
 41         Max1[x]=Max1[Son[x][0]]; Max2[x]=Max2[Son[x][0]];
 42         Cnt1[x]=Cnt1[Son[x][0]]; Cnt2[x]=Cnt2[Son[x][0]];
 43     }
 44     else if (!Son[x][0])
 45     {
 46         Max1[x]=Max1[Son[x][1]]; Max2[x]=Max2[Son[x][1]];
 47         Cnt1[x]=Cnt1[Son[x][1]]; Cnt2[x]=Cnt2[Son[x][1]];
 48     }
 49     else if (Max1[Son[x][0]]==Max1[Son[x][1]])
 50     {
 51         Max1[x]=Max1[Son[x][0]];
 52         Cnt1[x]=Cnt1[Son[x][0]]+Cnt1[Son[x][1]];
 53         if (Max2[Son[x][0]]==Max2[Son[x][1]])
 54             Max2[x]=Max2[Son[x][0]], Cnt2[x]=Cnt2[Son[x][0]]+Cnt2[Son[x][1]];
 55         else if (Max2[Son[x][0]]>Max2[Son[x][1]])
 56             Max2[x]=Max2[Son[x][0]], Cnt2[x]=Cnt2[Son[x][0]];
 57         else Max2[x]=Max2[Son[x][1]], Cnt2[x]=Cnt2[Son[x][1]];
 58     }
 59     else if (Max1[Son[x][0]]>Max1[Son[x][1]])
 60     {
 61         Max1[x]=Max1[Son[x][0]];
 62         Cnt1[x]=Cnt1[Son[x][0]];
 63         if (Max2[Son[x][0]]==Max1[Son[x][1]])
 64             Max2[x]=Max2[Son[x][0]], Cnt2[x]=Cnt2[Son[x][0]]+Cnt1[Son[x][1]];
 65         else if (Max2[Son[x][0]]>Max1[Son[x][1]])
 66             Max2[x]=Max2[Son[x][0]], Cnt2[x]=Cnt2[Son[x][0]];
 67         else Max2[x]=Max1[Son[x][1]], Cnt2[x]=Cnt1[Son[x][1]];
 68     }
 69     else
 70     {
 71         Max1[x]=Max1[Son[x][1]];
 72         Cnt1[x]=Cnt1[Son[x][1]];
 73         if (Max1[Son[x][0]]==Max2[Son[x][1]])
 74             Max2[x]=Max1[Son[x][0]], Cnt2[x]=Cnt1[Son[x][0]]+Cnt2[Son[x][1]];
 75         else if (Max1[Son[x][0]]>Max2[Son[x][1]])
 76             Max2[x]=Max1[Son[x][0]], Cnt2[x]=Cnt1[Son[x][0]];
 77         else Max2[x]=Max2[Son[x][1]], Cnt2[x]=Cnt2[Son[x][1]];
 78     }
 79     if (Val[x]>Max1[x])
 80     {
 81         Cnt2[x]=Cnt1[x]; Max2[x]=Max1[x];
 82         Cnt1[x]=1; Max1[x]=Val[x];
 83     }
 84     else if (Val[x]==Max1[x]) Cnt1[x]++;
 85     else if (Val[x]>Max2[x]) Max2[x]=Val[x], Cnt2[x]=1;
 86     else if (Val[x]==Max2[x]) Cnt2[x]++;
 87 }
 88
 89 void Pushdown(int x)
 90 {
 91     if (Rev[x])
 92     {
 93         if (Son[x][0]) Rev[Son[x][0]]^=1;
 94         if (Son[x][1]) Rev[Son[x][1]]^=1;
 95         swap(Son[x][0],Son[x][1]);
 96         Rev[x]=0;
 97     }
 98     if (Add[x])
 99     {
100         if (Son[x][0])
101         {
102             Val[Son[x][0]]+=Add[x];
103             Add[Son[x][0]]+=Add[x];
104             Max1[Son[x][0]]+=Add[x];
105             if (Cov[Son[x][0]]!=INF) Cov[Son[x][0]]+=Add[x];
106             if (Max2[Son[x][0]]!=-INF) Max2[Son[x][0]]+=Add[x];
107         }
108         if (Son[x][1])
109         {
110             Val[Son[x][1]]+=Add[x];
111             Add[Son[x][1]]+=Add[x];
112             Max1[Son[x][1]]+=Add[x];
113             if (Cov[Son[x][1]]!=INF) Cov[Son[x][1]]+=Add[x];
114             if (Max2[Son[x][1]]!=-INF) Max2[Son[x][1]]+=Add[x];
115         }
116         Add[x]=0;
117     }
118     if (Cov[x]!=INF)
119     {
120         if (Son[x][0])
121         {
122             Val[Son[x][0]]=Cov[x];
123             Add[Son[x][0]]=0;
124             Cov[Son[x][0]]=Cov[x];
125             Max1[Son[x][0]]=Cov[x];
126             Max2[Son[x][0]]=-INF;
127             Cnt1[Son[x][0]]=Size[Son[x][0]];
128             Cnt2[Son[x][0]]=0;
129         }
130         if (Son[x][1])
131         {
132             Val[Son[x][1]]=Cov[x];
133             Add[Son[x][1]]=0;
134             Cov[Son[x][1]]=Cov[x];
135             Max1[Son[x][1]]=Cov[x];
136             Max2[Son[x][1]]=-INF;
137             Cnt1[Son[x][1]]=Size[Son[x][1]];
138             Cnt2[Son[x][1]]=0;
139         }
140         Cov[x]=INF;
141     }
142 }
143
144 void Rotate(int x)
145 {
146     int wh=Get(x);
147     int fa=Father[x],fafa=Father[fa];
148     if (!Is_root(fa)) Son[fafa][Son[fafa][1]==fa]=x;
149     Father[fa]=x; Son[fa][wh]=Son[x][wh^1];
150     if (Son[fa][wh]) Father[Son[fa][wh]]=fa;
151     Father[x]=fafa; Son[x][wh^1]=fa;
152     Pushup(fa); Pushup(x);
153 }
154
155 void Push(int x)
156 {
157     if (!Is_root(x)) Push(Father[x]);
158     Pushdown(x);
159 }
160
161 void Splay(int x)
162 {
163     Push(x);
164     for (int fa; !Is_root(x); Rotate(x))
165         if (!Is_root(fa=Father[x]))
166             Rotate(Get(fa)==Get(x)?fa:x);
167 }
168
169 void Access(int x)
170 {
171     for (int y=0; x; y=x,x=Father[x])
172         Splay(x), Son[x][1]=y, Pushup(x);
173 }
174
175 void Make_root(int x)
176 {
177     Access(x); Splay(x);
178     Rev[x]^=1;
179 }
180
181 int Find_root(int x)
182 {
183     Access(x); Splay(x);
184     while (Son[x][0]) x=Son[x][0];
185     return x;
186 }
187
188 void Link(int x,int y)
189 {
190     Make_root(x);
191     Father[x]=y;
192 }
193
194 void Cut(int x,int y)
195 {
196     Make_root(x);
197     Access(y); Splay(y);
198     Father[x]=Son[y][0]=0;
199     Pushup(y);
200 }
201
202 void Clear()
203 {
204     memset(Max1,0,sizeof(Max1));
205     memset(Max2,0,sizeof(Max2));
206     memset(Cnt1,0,sizeof(Cnt1));
207     memset(Cnt2,0,sizeof(Cnt2));
208     memset(Father,0,sizeof(Father));
209     memset(Son,0,sizeof(Son));
210     memset(Cov,0,sizeof(Cov));
211     memset(Add,0,sizeof(Add));
212     memset(Size,0,sizeof(Size));
213 }
214
215 int main()
216 {
217     T=read();
218     for (int t=1; t<=T; ++t)
219     {
220         Clear();
221         n=read(); m=read();
222         for (int i=1; i<=n; ++i)
223         {
224             Val[i]=read();
225             Max1[i]=Val[i]; Cnt1[i]=1; Size[i]=1;
226             Cov[i]=INF; Max2[i]=-INF;
227         }
228         for (int i=1; i<=n-1; ++i)
229             x=read(), y=read(), Link(x,y);
230         printf("Case #%d:\n",t);
231         for (int i=1; i<=m; ++i)
232         {
233             opt=read();
234             if (opt==1)
235             {
236                 x=read(); y=read(); a=read(); b=read();
237                 Cut(x,y); Link(a,b);
238             }
239             if (opt==2)
240             {
241                 a=read(); b=read(); x=read();
242                 Make_root(a); Access(b); Splay(b);
243                 Cov[b]=x; Add[b]=0; Val[b]=x;
244                 Max2[b]=-INF; Cnt2[b]=0;
245                 Max1[b]=x; Cnt1[b]=Size[b];
246             }
247             if (opt==3)
248             {
249                 a=read(); b=read(); x=read();
250                 Make_root(a);
251                 Access(b);
252                 Splay(b);
253                 Add[b]+=x; Val[b]+=x; Max1[b]+=x;
254                 if (Cov[b]!=INF) Cov[b]+=x;
255                 if (Max2[b]!=-INF) Max2[b]+=x;
256             }
257             if (opt==4)
258             {
259                 a=read(); b=read();
260                 Make_root(a);
261                 Access(b);
262                 Splay(b);
263                 if (!Cnt2[b]) puts("ALL SAME");
264                 else printf("%d %d\n",Max2[b],Cnt2[b]);
265             }
266         }
267     }
268 }

转载于:https://www.cnblogs.com/refun/p/10298622.html

HDU5002:Tree(LCT)相关推荐

  1. BZOJ 3282 Link Cut Tree (LCT)

    题目大意:维护一个森林,支持边的断,连,修改某个点的权值,求树链所有点点权的异或和 洛谷P3690传送门 搞了一个下午终于明白了LCT的原理 1 #include <cstdio> 2 # ...

  2. BZOJ3282: Tree (LCT模板)

    Description 给定N个点以及每个点的权值,要你处理接下来的M个操作. 操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和 ...

  3. [省选前题目整理][清橙A1303]tree(LCT)

    题目链接 http://www.tsinsen.com/A1303 思路 非常好的LCT模板题... 乘法和加法lazy tag是可以叠加的,这个做法和线段树的lazy tag叠加是完全一样的... ...

  4. 洛谷P2486 lct做法

    题意: 给出一颗nnn个结点的无根树,处理mmm个操作,每个操作只会是如下两种之一: (1)将结点aaa到bbb的路径上的所有点染成颜色kkk (2)询问结点aaa到结点bbb的简单路径的颜色段数量 ...

  5. 2013_chengdu_visit

    4716 A Computer Graphics Problem 签到题目,模拟. 4717 The Moving Points 求n个点的最大距离最小值,三分时间即可 4718 The LCIS o ...

  6. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

  7. 模板:Link Cut Tree(LCT)

    文章目录 前言 解析 原理 rotate(x) splay(x) access(x) findroot(x) makeroot(x) split(x,y) link(x,y) cut(x,y) pus ...

  8. 【LCT】Tree II(luogu 1501)

    Tree II luogu 1501 题目大意 给出一棵树,让你进行若干操作,操作如下: 1.把两个点路径上的所有点权值加k 2.把两个点路径上的所有点权值乘k 3.把一条边断开,连上另一条边 4.查 ...

  9. Query on a tree(LCT版)

    文章目录 题目 分析 代码 题目 Query on a tree 分析 动态树(LCT)初探 代码 #include<cstdio> #include<vector> #inc ...

最新文章

  1. 34 个火爆全网的Python开源框架
  2. android获取地址api,如果在Android中使用位置API给出纬度和经度,如何获取地址
  3. WordPress在nginx下的URL重写规则
  4. 关于QVariant 的学习一点分享
  5. 关于CTeX的几个大坑
  6. Java InputStreamReader getEncoding()方法及示例
  7. Java Class 文件结构
  8. Objective-C 一些很基础的总结
  9. 【Java】Exception in thread main java.lang.Error: Unresolved compilation problem
  10. “玲珑杯”郑州轻工业学院第八届ACM程序设计大赛Problem G: 蛤玮点菜
  11. c# asp.net页面传值方法总结
  12. delphi mysql 8.0_Delphi 8免费版
  13. 【Bandit Algorithms学习笔记】EXP3算法理论证明
  14. python数据分析房价预测_Kaggle入门级赛题:房价预测——数据分析篇
  15. Linux和Windows双系统下,找回丢失Windows启动项
  16. 小程序怎么接入第三方客服工具?
  17. easyui datagrid 可编辑单元格 显示 clear icon 和 放大镜图标
  18. Love6 五一无忧无虑假期后的一些随笔和感想
  19. 第一次学游泳技巧_第一次学游泳怎么浮起来
  20. SpringBoot 腾讯企业邮箱

热门文章

  1. Js实现文字水平滚动
  2. mysql clomn_mysql 命令总结
  3. android 360相机,相机360app安卓版
  4. java工具类_非常实用的Java工具类,拿走不谢(一)
  5. spark算子_Spark算子总结
  6. 中给函数赋读权限_sql动态传参在springData中的应用(补充)
  7. ※部分VB文章汇总A※
  8. VB6监视/操作剪贴板示例(VB6.0代码)
  9. 影视光盘制作专家 6.3简体中文免费版
  10. 机器狗vs警犬!在波士顿动力面前,真狗只能“战术撤退”