Description

  某校开展了同学们喜闻乐见的阳光长跑活动。为了能“为祖国健康工作五十年”,同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑运动。一时间操场上熙熙攘攘,摩肩接踵,盛况空前。
  为了让同学们更好地监督自己,学校推行了刷卡机制。
  学校中有n个地点,用1到n的整数表示,每个地点设有若干个刷卡机。
  有以下三类事件:
  1、修建了一条连接A地点和B地点的跑道。
  2、A点的刷卡机台数变为了B。
  3、进行了一次长跑。问一个同学从A出发,最后到达B最多可以刷卡多少次。具体的要求如下:
  当同学到达一个地点时,他可以在这里的每一台刷卡机上都刷卡。但每台刷卡机只能刷卡一次,即使多次到达同一地点也不能多次刷卡。
  为了安全起见,每条跑道都需要设定一个方向,这条跑道只能按照这个方向单向通行。最多的刷卡次数即为在任意设定跑道方向,按照任意路径从A地点到B地点能刷卡的最多次数。


Solution

考虑用LCT维护,如果出现了环,那么我们用并查集将它们缩起来即可。


Code

/************************************************* Au: Hany01* Date: Aug 10th, 2018* Prob: BZOJ2959 长跑* Email: hany01@foxmail.com* Inst: Yali High School
************************************************/#include<bits/stdc++.h>using namespace std;typedef long long LL;
typedef long double LD;
typedef pair<int, int> PII;
#define rep(i, j) for (register int i = 0, i##_end_ = (j); i < i##_end_; ++ i)
#define For(i, j, k) for (register int i = (j), i##_end_ = (k); i <= i##_end_; ++ i)
#define Fordown(i, j, k) for (register int i = (j), i##_end_ = (k); i >= i##_end_; -- i)
#define Set(a, b) memset(a, b, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define x first
#define y second
#define pb(a) push_back(a)
#define mp(a, b) make_pair(a, b)
#define SZ(a) ((int)(a).size())
#define INF (0x3f3f3f3f)
#define INF1 (2139062143)
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define y1 wozenmezhemecaiatemplate <typename T> inline bool chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; }
template <typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }inline int read() {static int _, __; static char c_;for (_ = 0, __ = 1, c_ = getchar(); c_ < '0' || c_ > '9'; c_ = getchar()) if (c_ == '-') __ = -1;for ( ; c_ >= '0' && c_ <= '9'; c_ = getchar()) _ = (_ << 1) + (_ << 3) + (c_ ^ 48);return _ * __;
}const int maxn = 150005;int n, pa[maxn], val[maxn];struct LCT {int val[maxn], rev[maxn], ch[maxn][2], fa[maxn], pa[maxn], sum[maxn];#define dir(t) (ch[find(fa[t])][1] == t)
#define isrt(t) (ch[find(fa[t])][0] != t && ch[find(fa[t])][1] != t)inline int find(int t) { return pa[t] == t ? t : pa[t] = find(pa[t]); }inline void reverse(int t) { swap(ch[t][0], ch[t][1]), rev[t] ^= 1; }inline void pushdown(int t) {if (rev[t]) {rev[t] = 0;if (ch[t][0]) reverse(ch[t][0]);if (ch[t][1]) reverse(ch[t][1]);}}inline void maintain(int t) { sum[t] = sum[ch[t][0]] + sum[ch[t][1]] + val[t]; }inline void rotate(int u) {static int f, gf, d; f = find(fa[u]), gf = find(fa[f]), d = dir(u);if (!isrt(f)) ch[gf][dir(f)] = u;fa[u] = gf;fa[ch[f][d] = ch[u][d ^ 1]] = f;fa[ch[u][d ^ 1] = f] = u;maintain(f), maintain(u);}inline void splay(int u) {static int stk[maxn], top;stk[top = 1] = u;for (register int t = u; !isrt(t); t = find(fa[t])) stk[++ top] = find(fa[t]);while (top) pushdown(stk[top --]);for (register int t = find(fa[u]); !isrt(u); rotate(u), t = find(fa[u]))if (!isrt(t)) rotate(dir(u) == dir(t) ? t : u);maintain(u);}inline void access(int u) {for (register int t = 0; u; u = find(fa[t = u])) splay(u), ch[u][1] = t, maintain(u);}inline void makert(int u) { access(u), splay(u), reverse(u); }inline void split(int u, int v) { makert(u), access(v), splay(v); }inline void link(int u, int v) { makert(u), fa[u] = v; }void shrink(int u, int rt) {if (ch[u][0]) shrink(ch[u][0], rt);if (ch[u][1]) shrink(ch[u][1], rt);pa[u] = rt, val[rt] += val[u];}inline void addval(int u, int dt) {u = find(u), access(u), splay(u), val[u] += dt, maintain(u);}}lct;int find(int x) { return x == pa[x] ? x : pa[x] = find(pa[x]); }inline void addedge(int u, int v) {u = lct.find(u), v = lct.find(v);if (u == v) return;static int fu, fv; fu = find(u), fv = find(v);if (fu != fv) pa[fu] = fv, lct.link(u, v);else lct.split(u, v), lct.shrink(lct.ch[v][0], v);
}int main()
{
#ifndef ONLINE_JUDGEfreopen("graph.in", "r", stdin);freopen("graph.out", "w", stdout);
#endifstatic int m, op, x, y;n = read(), m = read();For(i, 1, n) lct.val[i] = val[i] = read(), pa[i] = lct.pa[i] = i;while (m --) {op = read(), x = read(), y = read();if (op == 1) addedge(x, y);else if (op == 2) lct.addval(x, y - val[x]), val[x] = y;else {if (find(x) != find(y)) puts("-1");else {x = lct.find(x), y = lct.find(y);lct.split(x, y), printf("%d\n", lct.sum[y]);}}}return 0;
}

【BZOJ2959】长跑(LCT,双连通分量,并查集)相关推荐

  1. BZOJ 2959: 长跑 [lct 双连通分量 并查集]

    2959: 长跑 题意:字词加入边,修改点权,询问两点间走一条路径的最大点权和.不一定是树 不是树? 把边双连通分量缩为一点! 怎么缩? 用一个并查集维护连通性,另一个并查集维护每个点所在边双的编号, ...

  2. POJ 3694 Network ★(边双连通分量+并查集缩点+LCA)

    [题意]一个无向图可以有重边,下面q个操作,每次在两个点间连接一条有向边,每次连接后整个无向图还剩下多少桥(每次回答是在上一次连边的基础之上) [分析]好题,做完后涨了很多姿势~ 普通做法当然就是每加 ...

  3. 【POJ - 3694】Network(对dfn求lca 或 缩点+lca 或 边双连通+并查集)

    题干: 网络管理员管理大型网络.该网络由N台计算机和成对计算机之间的M链路组成.任何一对计算机都通过连续的链接直接或间接连接,因此可以在任何两台计算机之间转换数据.管理员发现某些链接对网络至关重要,因 ...

  4. BZOJ 2959 长跑 (LCT、并查集)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2959 题解 真是被这题搞得心态大崩--调了7个小时--然而并查集都能写成\(O(n^2) ...

  5. bzoj 2959: 长跑(LCT+并查集)

    2959: 长跑 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 315  Solved: 178 [Submit][Status][Discuss] ...

  6. BZOJ 2959 长跑 LCT+动态边双

    题意: 支持加入边,修改点权,询问两点间走一条路径的最大点权和.不一定是树. 分析: 这个题我们需要知道,假如两点间有环,那么无论如何,这个环上所有的价值都可以被我们获得. 有环,还有这个性质,我们可 ...

  7. POJ 3694Network(Tarjan边双联通分量 + 缩点 + LCA并查集维护)

    [题意]: 有N个结点M条边的图,有Q次操作,每次操作在点x, y之间加一条边,加完E(x, y)后还有几个桥(割边),每次操作会累积,影响下一次操作. [思路]: 先用Tarjan求出一开始总的桥的 ...

  8. HYSBZ - 2959 长跑(动态树+并查集)

    某校开展了同学们喜闻乐见的阳光长跑活动.为了能"为祖国健康工作五十年",同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑运动.一时间操场上熙熙攘攘,摩肩接踵,盛况 ...

  9. [bzoj4998][LCT][并查集]星球联盟

    Description 在遥远的S星系中一共有N个星球,编号为1-N.其中的一些星球决定组成联盟,以方便相互间的交流.但是,组成 联盟的首要条件就是交通条件.初始时,在这N个星球间有M条太空隧道.每条 ...

  10. 【9.22校内测试】【可持久化并查集(主席树实现)】【DP】【点双联通分量/割点】...

    1 build 1.1 Description 从前有一个王国,里面有n 座城市,一开始两两不连通.现在国王将进行m 次命令,命令可 能有两种,一种是在u 和v 之间修建道路,另一种是询问在第u 次命 ...

最新文章

  1. android跑分和ios,安卓评分再高也没用吗 安卓与ios的区别
  2. 计算机英语 动态,计算机英语高级词汇精选
  3. (转)DevExpress 汉化(简单、实用、快速)
  4. 简单说说:JavaSE、JavaEE、JavaME这三大体系
  5. __getattr__在python2.x与python3.x中的区别及其对属性截取与代理类的影响
  6. 分享php中四种webservice实现的简单架构方法及实例(转)
  7. InterruptedException的学习
  8. FG60B SSL ××× V3.0配置
  9. html文档head,HTML的head标签
  10. 1024程序员节再次引爆星城!千万程序员线上线下互动,共迎新程序员时代
  11. 不要运行explorer_在Internet Explorer浏览器上运行测试
  12. 客户的价值源于客户的流程
  13. Python使用matplotlib可视化模拟商场促销价格关系折线图
  14. 学习笔记-大数据之路-数据模型篇-建模综述
  15. IDEA 热部署插件 JRebel 激活
  16. 联想g510拆键盘的简单方法_联想G510重点笔记本拆机教程.doc
  17. Android 11.0 12.0默认开启开发者模式和开启usb调试模式
  18. 人工智能“乐高模式”,人工智能进入变革时代
  19. Angular4中使用PrimeNG calendar
  20. 利用grub引导多系统debian8.0+win7+ubuntu16.04

热门文章

  1. uni-app自动定位当前位置
  2. python基础-craps赌牌游戏
  3. 在线搭建自己的网课答案公众号题库系统
  4. Chrome应用商店打不开问题
  5. c语言pow函 新闻,c语言pow函数(C语言pow函数)
  6. 名词用作动词举例_动词+名词-动词加名词-名词作动词
  7. nRF52832 ble_app_blinky 例程
  8. python 中 websocket实现消息定时推送
  9. C# 获取文件名和扩展名(后缀名)
  10. 订阅号与服务号的区别