虽然是O(Qn)的算法可过水题,但是既然是练手的话,就不得不维护一下动态MST了。

还是倒着做,删边改为加边,利用环切性质直接找出切点,再将其切开、反向、连边就成了

但是反向是这题最蛋疼的一个操作,标记维护限于水平木有在splay中维护(反正我调不出来),直接在外维护了。
做了一天半啊,中途怒删6KB的代码重打,终于。。。。。内牛满面。

裸代码题,无需多说50 1000 2000

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
typedef int arr[100005];
int n=0,m=0,task=0,e=0,top=0;
arr w,px,py,next,head,poin,foll,con,maxw,othm,ww,dsf,x,y,nw,k,f,index,posw,poso,sta,ans;
bool vis[1005],revese[1005];
int poi[1005][1005];
int son[1005][2];
inline void swap(int &u,int &v)
{int tmp=u;u=v;v=tmp;
}
inline void init()
{scanf("%d%d%d",&n,&m,&task);int i=0;memset(w,65,sizeof(w));for (i=1;i<=m;i++){scanf("%d%d%d",&x[i],&y[i],&w[i]);poi[x[i]][y[i]]=i;poi[y[i]][x[i]]=i;}for (i=1;i<=task;i++){scanf("%d%d%d",&k[i],&px[i],&py[i]);if (k[i]==2){nw[i]=w[poi[px[i]][py[i]]];w[poi[px[i]][py[i]]]=w[0]+1;}}
}
inline int find(int x)
{if (dsf[x]==x) return x;dsf[x]=find(dsf[x]);return dsf[x];
}
inline int cmp(const void *p,const void *q)
{return w[*(int*)p]-w[*(int*)q];
}
inline void kruskal()
{int i=0;for (i=1;i<=n;i++) dsf[i]=i;for (i=1;i<=m;i++) index[i]=i;qsort(index+1,m,sizeof(index[0]),cmp);int sum=0,u=0,v=0;for (i=1;i<=m;i++)if (find(x[index[i]])!=find(y[index[i]])){u=x[index[i]];v=y[index[i]];dsf[dsf[u]]=dsf[v];next[++e]=head[u];head[u]=e;poin[e]=v;ww[e]=w[index[i]];next[++e]=head[v];head[v]=e;poin[e]=u;ww[e]=w[index[i]];++sum;if (sum>=n-1) break;}
}
inline void dfs(int s)
{vis[s]=1;int ne=head[s],y=0;while (ne){if (!vis[poin[ne]]){y=poin[ne];dfs(y);f[y]=s;con[y]=ww[ne];}ne=next[ne];}
}
inline void mark(int s)
{revese[s]^=1;swap(con[s],foll[s]);swap(maxw[s],othm[s]);swap(son[s][0],son[s][1]);swap(posw[s],poso[s]);
}
inline void collectmark(int s)
{sta[top=1]=s;while (f[s] &&(son[f[s]][0]==s || son[f[s]][1]==s)){sta[++top]=f[s];s=f[s];}while (top){if (revese[sta[top]]) revese[sta[top]]=0,mark(son[sta[top]][0]),mark(son[sta[top]][1]);top--;}
}
inline void update(int s)
{maxw[s]=con[s],posw[s]=s;if (maxw[s]<maxw[son[s][0]]) maxw[s]=maxw[son[s][0]],posw[s]=posw[son[s][0]];if (maxw[s]<maxw[son[s][1]]) maxw[s]=maxw[son[s][1]],posw[s]=posw[son[s][1]];othm[s]=foll[s],poso[s]=s;if (othm[s]<othm[son[s][0]]) othm[s]=othm[son[s][0]],poso[s]=poso[son[s][0]];if (othm[s]<othm[son[s][1]]) othm[s]=othm[son[s][1]],poso[s]=poso[son[s][1]];
}
inline void rotate(int s,int t)
{int fs=f[s],ffs=f[fs],ch=son[s][t^1];if (son[ffs][0]==fs) son[ffs][0]=s; else if (son[ffs][1]==fs) son[ffs][1]=s;f[s]=ffs;son[s][t^1]=fs;f[fs]=s;son[fs][t]=ch;if (ch) f[ch]=fs;update(fs);
}
inline void splay(int s)
{collectmark(s);int fs=0,ffs=0,p=0,q=0;while (f[s] &&(son[f[s]][0]==s || son[f[s]][1]==s)){fs=f[s],ffs=f[fs];if (ffs &&(son[ffs][0]==fs || son[ffs][1]==fs)){if (son[ffs][0]==fs) p=0; else p=1;if (son[fs][0]==s) q=0; else q=1;if (p==q) rotate(fs,p),rotate(s,q);else rotate(s,q),rotate(s,p);}elseif (son[fs][0]==s) rotate(s,0); else rotate(s,1);}update(s);
}
inline int flast(int s)
{if (revese[s]) revese[s]=0,mark(son[s][0]),mark(son[s][1]);s=son[s][1];if (revese[s]) revese[s]=0,mark(son[s][0]),mark(son[s][1]);while (son[s][0]){s=son[s][0];if (revese[s]) revese[s]=0,mark(son[s][0]),mark(son[s][1]);}return s;
}
inline int froot(int s)
{if (revese[s]) revese[s]=0,mark(son[s][0]),mark(son[s][1]);while (son[s][0]){s=son[s][0];if (revese[s]) revese[s]=0,mark(son[s][0]),mark(son[s][1]);}return s;
}
inline int access(int s)
{int last=0;for (;s;s=f[s]){splay(s);son[s][1]=last;foll[s]=con[froot(last)];last=s;update(s);}return last;
}
inline void cut(int s)
{access(s);splay(s);con[s]=0;foll[flast(s)]=0;f[son[s][0]]=0;update(son[s][0]);son[s][0]=0;f[s]=0;update(s);
}
inline void evert(int s)
{access(s);splay(s);mark(s);
}
int main()
{freopen("tube.in","r",stdin);freopen("tube.out","w",stdout);init();kruskal();dfs(1);int i=0,u=0,v=0,now=0,lca=0;for (i=task;i>=1;i--){u=px[i],v=py[i];if (k[i]==1){access(u);lca=access(v);ans[i]=maxw[son[lca][1]];if (u!=lca){splay(u);ans[i]=ans[i]>maxw[u]?ans[i]:maxw[u];}}else{access(u);lca=access(v);ans[i]=maxw[son[lca][1]],now=posw[son[lca][1]];if (u!=lca){splay(u);if (ans[i]<maxw[u]){ans[i]=maxw[u];now=posw[u];}}if (ans[i]<=nw[i]) continue;cut(now);evert(v);f[v]=u;con[v]=nw[i];}}for (i=1;i<=task;i++)if (k[i]==1)printf("%d\n",ans[i]);return 0;
}

至于范浩强的那题,其实也是比较裸的,首先一颗仙人掌只有一个环,并查集预处理找环,之后change时分类讨论是否从环上切下,是否连接时又新成了一个环,同时维护root的“父亲”,也就是范浩强所说的基点,求答案时就直接求基点的解,access(expose)时用迭代的方法维护一个sk,sb。link cut tree其实并不难实现,倒是还未学树块剖分

代码就不放了,去fhq博客就可以了

一道动态树好题 - fanhq666的日志 - 网易博客

动态树专题 WC 2006 Tube 还有范浩强的“动态树好题”相关推荐

  1. 线段树专题-等差子序列 BZOJ-2124

    线段树专题-等差子序列 感谢 感谢孙耀峰的线段树PPT,使我获益匪浅. 题目来源 BZOJ−2124BZOJ-2124BZOJ−2124 题意 给出长度为nnn的1−n1-n1−n的排列AAA 问是否 ...

  2. linux系统下的“静态库和动态库”专题之二:库的创建和使用

    接上文[linux系统下的"静态库和动态库"专题之一:库的概念和规则]所述,我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种. – 静态库在程序编译 ...

  3. linux系统下的“静态库和动态库”专题之一:库的概念和规则

    什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的本质不同,因此二者的库也是不兼 ...

  4. 线段树专题-黑白棋盘 BZOJ-1453

    线段树专题-黑白棋盘 题目来源 BZOJ−1453BZOJ-1453BZOJ−1453 题意 QQQ次操作 每次操作给出(x,y)(x,y)(x,y),将(x,y)(x,y)(x,y)个格子颜色取反 ...

  5. 安卓(android)6.0高通平台下设备树专题视频讲解【全国独家+设备树视频教程】

    安卓(android)6.0高通平台下设备树专题视频讲解[全国独家+设备树视频教程]                                                      独家拥有 ...

  6. 【用学校抄作业带你走进可持久化线段树(主席树)】可持久化线段树概念+全套模板+例题入门:[福利]可持久化线段树)

    我似乎很少写这种算法博客 可持久化线段树概念 概念介绍(类比帮助理解) 简单分析一下时间和空间复杂度(内容池) 模板 结构体变量 建树模板 单点修改模板 单点查询模板 区间修改模板(pushup) 区 ...

  7. 课堂笔记:树、森林与二叉树的转换、哈夫曼树

    树.森林与二叉树的转换 树转换为二叉树: 1.兄弟加线: 2.保留双亲与第一孩子连线,删去与其他孩子的连线: 3.顺时针转动,使之层次分明. 树的前序遍历等价于二叉树的前序遍历,树的后序遍历等价于二叉 ...

  8. 树形DP+并查集+左偏树, HDU-5575,Discover Water Tank,2015上海现场赛D题

    只是ACM/IICPC 2015 上海区域赛的一道题.原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=5575 题目描述 N-1个木板把一个水箱划分成了N ...

  9. R语言ggplot2可视化:为层次聚类树状图dendrogram中的簇进行着色、在树状图dendrogram中为不同的层次聚类簇配置不同的色彩

    R语言ggplot2可视化:为层次聚类树状图dendrogram中的簇进行着色.在树状图dendrogram中为不同的层次聚类簇配置不同的色彩 #层次聚类树状图dendrogram labs = pa ...

  10. b树与b+树的区别_一文详解 B-树,B+树,B*树

    B-树 B-树是一种多路搜索树(并不一定是二叉的) 1970年,R.Bayer和E.mccreight提出了一种适用于外查找的树,它是一种平衡的多叉树,称为B树(或B-树.B_树). 一棵m阶B树(b ...

最新文章

  1. YOLO、SSD、FPN、Mask-RCNN检测模型对比
  2. Mysql高级调优篇——第三章:Sql实战调优场景剖析(上)
  3. 【分布式事务系列九】聊聊分布式事务
  4. 吴恩达 coursera ML 第十二课总结+作业答案
  5. php项目实战流程_一个完整的php流程管理实例代码分享
  6. android学习日记15--WebView(网络视图)
  7. 透明色的rgb值是多少_一文掌握PPT主题色原理及使用技巧
  8. BZOJ 4034 树上操作
  9. vue从入门到进阶:Class 与 Style 绑定(四)
  10. [最后几天]蓝桥杯如何优雅控分
  11. 哥尼斯堡的“七桥问题” (25 分)(DFS)
  12. linux一个进程打印10次,如何发现linux中引起高io等待的进程
  13. 根据url链接来下载资源
  14. 鼠标测试软件m,罗技M525鼠标使用测试_罗技 M525鼠标_键鼠评测-中关村在线
  15. Kubernetes 节点弹性伸缩开源组件 Amazon Karpenter 实践:部署GPU推理应用
  16. 谈谈keep-alive的理解
  17. Spring实训 个人博客二 详情页
  18. 江南爱软装十大品牌 提升格调的软装种类
  19. bms中soh计算方式_原创丨BMS算法中关于健康状态(SOH)的模型设计
  20. 耳机不分主从是什么意思_不疯魔不成活!红魔TWS蓝牙耳机告诉你什么是“低延怪兽”...

热门文章

  1. 用数字万用表测量电阻-2/4/6线制测量
  2. 共享充电宝APP小程序开发
  3. 中芯国际换帅,事情并不简单
  4. 小程序解析富文本(支持视频,支持微信编辑器,支持135编辑器富文本样式)
  5. 硬件编程-----根据时序图写C语言驱动
  6. Squid代理权限的设置
  7. noi linux 比赛使用哪个编译器,noi linux简介.pdf
  8. bootstrap 可编辑列表,实现某个单元格动态控制是否可编辑状态
  9. Xiaojie雷达之路---脉冲压缩
  10. 计算不可压缩流体 -- 数学基础