#274. 【清华集训2016】温暖会指引我们前行

题意比较巧妙

裸lct维护最大生成树

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. typedef long long ll;
  7. #define lc t[x].ch[0]
  8. #define rc t[x].ch[1]
  9. #define pa t[x].fa
  10. const int N = 4e5+5, INF = 1e9+5;
  11. inline int read(){
  12. char c=getchar(); int x=0,f=1;
  13. while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
  14. while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
  15. return x*f;
  16. }
  17. int n, m, val[N], id, u, v, tem, w;
  18. struct edge{int u, v;} e[N];
  19. char s[10];
  20. namespace lct {
  21. struct meow{ int ch[2], fa, rev, sum, w, p; } t[N];
  22. inline int wh(int x) {return t[pa].ch[1] == x;}
  23. inline bool isr(int x) {return t[pa].ch[0] != x && t[pa].ch[1] != x;}
  24. inline void rever(int x) {t[x].rev ^= 1; swap(lc, rc);}
  25. inline void pushdn(int x) {
  26. if(t[x].rev) {
  27. if(lc) rever(lc);
  28. if(rc) rever(rc);
  29. t[x].rev = 0;
  30. }
  31. }
  32. inline void pd(int x) {if(!isr(x)) pd(pa); pushdn(x);}
  33. inline void update(int x) {
  34. t[x].sum = t[lc].sum + t[rc].sum + t[x].w;
  35. t[x].p = x;
  36. if(lc && val[ t[lc].p ] < val[ t[x].p ]) t[x].p = t[lc].p;
  37. if(rc && val[ t[rc].p ] < val[ t[x].p ]) t[x].p = t[rc].p;
  38. }
  39. inline void rotate(int x) {
  40. int f = t[x].fa, g = t[f].fa, c = wh(x);
  41. if(!isr(f)) t[g].ch[wh(f)] = x; t[x].fa = g;
  42. t[f].ch[c] = t[x].ch[c^1]; t[ t[f].ch[c] ].fa = f;
  43. t[x].ch[c^1] = f; t[f].fa = x;
  44. update(f); update(x);
  45. }
  46. inline void splay(int x) {
  47. pd(x);
  48. for(; !isr(x); rotate(x))
  49. if(!isr(pa)) rotate(wh(x) == wh(pa) ? pa : x);
  50. }
  51. inline void access(int x) {
  52. for(int y=0; x; y=x, x=pa)
  53. splay(x), rc=y, update(x);
  54. }
  55. inline void maker(int x) { access(x); splay(x); rever(x);}
  56. inline void link(int x, int y) { maker(x); t[x].fa = y; }
  57. inline void cut(int x, int y) {
  58. maker(x); access(y); splay(y);
  59. t[x].fa = t[y].ch[0] = 0; update(y);
  60. }
  61. inline void split(int x, int y) { maker(x), access(y); splay(y); }
  62. } using namespace lct;
  63. int fa[N];
  64. inline int find(int x) {return x == fa[x] ? x : fa[x] = find(fa[x]);}
  65. inline void add() {
  66. id=read()+1+n, u=read()+1, v=read()+1, tem=read(), w=read(); //printf("\nadd %d %d--%d %d %d\n", id, u, v, tem, w);
  67. e[id] = (edge){u, v};
  68. val[id] = tem;
  69. t[id].sum = t[id].w = w; t[id].p = id;
  70. if(find(u) != find(v)) {
  71. fa[find(u)] = find(v);
  72. link(id, u); link(id, v);
  73. } else {
  74. split(u, v);
  75. int a = t[v].p; //printf("aaa %d\n", a);
  76. if(val[a] < val[id]) {
  77. cut(a, e[a].u); cut(a, e[a].v);
  78. link(id, u); link(id, v);
  79. }
  80. }
  81. }
  82. inline void que(int u, int v) {
  83. if(find(u) != find(v)) puts("-1");
  84. else split(u, v), printf("%d\n", t[v].sum);
  85. }
  86. inline void cha(int id, int w) { //printf("\ncha %d %d\n", id, w);
  87. t[id].w = w; splay(id);
  88. }
  89. int main() {
  90. freopen("in", "r", stdin);
  91. n=read(); m=read();
  92. for(int i=1; i<=n; i++) fa[i] = i, val[i] = INF;
  93. for(int i=1; i<=m; i++) { //printf("\nQ %d\n", i);
  94. scanf("%s", s);
  95. if(s[0] == 'f') add();
  96. if(s[0] == 'm') u=read()+1, v=read()+1, que(u, v);
  97. if(s[0] == 'c') id=read()+1+n, w=read(), cha(id, w);
  98. }
  99. }

UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]的更多相关文章

  1. [UOJ#274][清华集训2016]温暖会指引我们前行

    [UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...

  2. [清华集训2016]温暖会指引我们前行——LCT+最大生成树

    题目链接: [清华集训2016]温暖会指引我们前行 题目大意:有$n$个点$m$次操作,每次操作分为三种:1.在$u,v$两点之间连接一条编号为$id$,长度为$l$,温度为$t$的边.2.查询从$u ...

  3. UOJ_274_[清华集训2016]温暖会指引我们前行_LCT

    UOJ_274_[清华集训2016]温暖会指引我们前行_LCT 任务描述:http://uoj.ac/problem/274 本题中的字典序不同在于空串的字典序最大. 并且题中要求排序后字典序最大. ...

  4. 【bzoj4736/uoj#274】[清华集训2016]温暖会指引我们前行 语文题+LCT

    题目描述 http://uoj.ac/problem/274 题解 语文题+LCT 对于这种语文题建议还是自己读题好一些... 读懂题后发现:由于温度互不相同,最大生成树上的路径必须走(不走的话温度大 ...

  5. UOJ274 [清华集训2016] 温暖会指引我们前行 【LCT】【最大生成树】

    题目分析: 差评,最大生成树裸题.hack数据还卡常. 代码: #include<bits/stdc++.h> using namespace std; ; struct LCT{ ],d ...

  6. 【UOJ274】【清华集训2016】温暖会指引我们前行 LCT

    [UOJ274][清华集训2016]温暖会指引我们前行 任务描述 虽然小R住的宿舍楼早已来了暖气,但是由于某些原因,宿舍楼中的某些窗户仍然开着(例如厕所的窗户),这就使得宿舍楼中有一些路上的温度还是很 ...

  7. bzoj 4736 /uoj274【清华集训2016】温暖会指引我们前行 lct

    [清华集训2016]温暖会指引我们前行 统计 描述 提交 自定义测试 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了 ...

  8. Uoj #274. 【清华集训2016】温暖会指引我们前行 LCT维护边权_动态最小生成树

    Code: 行#include<bits/stdc++.h> #define ll long long #define maxn 1000000 #define inf 100000000 ...

  9. BZOJ 4732 UOJ #268 [清华集训2016]数据交互 (树链剖分、线段树)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4732 (UOJ) http://uoj.ac/problem/268 题解 ...

随机推荐

  1. ARM的GPIO配置

  2. 利用脚本将EXCEl表倒入PowerDesigner中

    1.Excel表格样式 2.脚本代码 '****************************************************************************** O ...

  3. js时间戳与时间日期间相互转换

    今天在工作中要将获取到的时间转换为时间戳,一时间竟不知道怎么用,于是不得不去查询资料,这里特地做个笔记. 1.将日期转换为时间戳. 要将日期转换为时间戳,首先得先获取到日期,这里可以直接指定日期,或者 ...

  4. 从零开始学习前端开发 — 12、CSS3弹性布局

    一.分栏布局 1.设置栏数column-count:数值; 2.设置每栏的宽度column-width:数值+单位; 注:当设置了column-width,column-count会失效,二者设置其一 ...

  5. 在Android studio模拟器中运行apk文件

    菜鸟级玩家比看文. win平台下下载的apk文件,怎么能模拟运行出来. 首先得安装Android SDK,不会的自行百度一下. 接下来,打开AVD模拟器,自己创建一个模拟器(过程自己实践) 然后,将你 ...

  6. yourphp常用标签

    方法/步骤 1 引入页面: 首页链接:{$site_url}  英文首页{$site_url}/en 面包屑导航: {:L(catpos)} {:L(home_font)} >       幻灯 ...

  7. phpstudy本地搭建域名访问

    http://blog.csdn.net/camillezj/article/details/54694554 步骤如下: 一.hosts配置: 1.用编辑器打开hosts文件,位置:C:\Windo ...

  8. 一.初识java

    1.框架结构 2.main方法 3.转义符 public class Dome01 { public static void main(String[] args) {       //main方法, ...

  9. PHP正则式PCRE

    PHP正则式PCRE的总结差不多就下边这些了.参考 PCRE与perl的差异 .   锚(^.$.\A.\Z/\z):^.$在多行模式下是非紧固的,在单行模式下是紧固的:而\A.\Z / \z在任何模 ...

  10. JavaScript常见封装方法

    1.最简单的,使用变量,然后用匿名函数包裹,不封装 2.对象字面量简单封装(不完整的模块模式,因为无法达到变量.方法私有效果.不过确实有分离和组织代码的能力,也就算一种简略的模块模式的实现方式) va ...