当前位置: 首页 > news >正文

P10658 BZOJ2959 长跑

P10658 BZOJ2959 长跑

大意

题目要求我们在设定边方向后,使 \(A\)\(B\) 路径上的刷卡次数最多。

思路

此题的关键在于,我们道路的方向是可以自己确定的,可这有什么用呢?

如果我们碰到了一个环,那么我们直接把环上的所有道路沿着一个方向,由于我们是可以重复走的,所以我们一定可以把一个环走完。

那知道了这个之后呢?我们先把这些边双连通缩成点,由于某些点的权值是会变换,边也会变化,也就是说,我们需要维护的是一个动态的树,或者说是一个森林。

但是我们的 LCT 无法处理与环有关的问题,我们采用并查集协助维护。具体来说,我们用数组 \(f\) 来维护缩点,\(f[i]\) 就代表点 \(i\) 所属的边双连通的代表元。所有在涉及有关 LCT 操作的时候,我们的 \(fa(x)\) 都要写成 \(find(fa(x))\),这是一个易错点。

特别的,我们的连边函数发生了变化,如果不成环,那就无所谓,还是按照原来的方式,如果是成环了,那就直接提取 \(x \to y\) 的路径,通过递归暴力缩点,由于每个点只会被缩一次,所以均摊复杂度很低。

询问答案的时候,要注意连通性,如果连通就直接提取路径,查询答案即可。

代码

#include<iostream>
#include<cstdio>
using namespace std;#define uint unsigned int
#define lc(x) t[x].ch[0]
#define rc(x) t[x].ch[1]
#define fa(x) t[x].fa
const int MAXN = 150005;struct node{int ch[2], fa;uint val, sum;bool tag;node(){ch[1] = ch[0] = fa = 0;val = sum = 0;tag = false;}
}t[MAXN];int f[MAXN];
uint real[MAXN];
int find(int x){ return f[x] == x ? x : f[x] = find(f[x]); }bool isroot(int x){int faf = find(fa(x));return (lc(faf) != x) && (rc(faf) != x);
}void pushup(int x){t[x].sum = t[lc(x)].sum + t[rc(x)].sum + t[x].val;
}void update_rev(int x){if(!x) return;int tmp = lc(x); lc(x) = rc(x); rc(x) = tmp;t[x].tag ^= 1;
}void pushdown(int x){if(t[x].tag){update_rev(lc(x));update_rev(rc(x));t[x].tag = 0;}
}void rotate(int x){int y = find(fa(x)), z = find(fa(y));int k = (rc(y) == x);if(!isroot(y)){t[z].ch[rc(z) == y] = x;}fa(x) = z;t[y].ch[k] = t[x].ch[k ^ 1];if(t[x].ch[k ^ 1]){fa(t[x].ch[k ^ 1]) = y;}t[x].ch[k ^ 1] = y;fa(y) = x;pushup(y);pushup(x);
}void pushshell(int x){if(!isroot(x)){pushshell(find(fa(x)));}pushdown(x);
}void splay(int x){x = find(x);pushshell(x);while(!isroot(x)){int y = find(fa(x)), z = find(fa(y));if(!isroot(y)){(rc(z) == y) == (rc(y) == x) ? rotate(y) : rotate(x);}rotate(x);}
}void access(int x){for(int y = 0;x;y = x, x = find(fa(x))){splay(x);rc(x) = y;pushup(x);}
}void makeroot(int x){x = find(x);access(x);splay(x);update_rev(x);
}void split(int x, int y){makeroot(x);access(y);splay(y);
}int findrt(int x){access(x);splay(x);while(lc(x)){pushdown(x);x = lc(x);}splay(x);return x;
}void merge(int x, int rt){if(!x) return;f[find(x)] = find(rt);if(x != rt) t[rt].val += t[x].val;merge(lc(x), rt);merge(rc(x), rt);lc(x) = rc(x) = 0;
}void link(int x, int y){x = find(x); y = find(y);if(x == y) return;if(findrt(x) != findrt(y)){makeroot(x);fa(x) = y;}else{split(x, y);merge(lc(y), y);pushup(y);}
}int main(){int n, m;scanf("%d %d", &n, &m);for(int i = 1;i <= n;i ++){f[i] = i;scanf("%u", &real[i]);t[i].val = t[i].sum = real[i];}while(m --){int op, u, v;scanf("%d %d %d", &op, &u, &v);if(op == 1){link(u, v);}else if(op == 2){int ru = find(u);splay(ru);t[ru].val += (uint)v - real[u];real[u] = v;pushup(ru);}else if(op == 3){int ru = find(u), rv = find(v);if(findrt(ru) != findrt(rv)) printf("-1\n");else{split(ru, rv);printf("%u\n", t[rv].sum);}}}return 0;
}
http://www.jsqmd.com/news/396683/

相关文章:

  • Python基于flask框架基于高性能计算中心课题任务提交平台的高性能集群共享平台-Pycharm django
  • 武商一卡通回收注意事项:如何安全高效地处理闲置卡片? - 团团收购物卡回收
  • Python基于flask框架教务选课成绩管理系统设计与实现eq8s1x2l-Pycharm django
  • Python基于flask框架-美妆化妆品商城进货系统-Pycharm django
  • 毕业论文神器 9个降AI率平台深度测评与推荐
  • 这份榜单够用!10个AI论文工具测评:本科生毕业论文+科研写作必备神器
  • 【MyBatis Exception】@Param注解List参数。Parameter ‘tigerList‘ not found Available parameters
  • 美妆购物网站信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • 不踩雷! 降AIGC工具 千笔·专业降AIGC智能体 VS 知文AI,MBA专属利器
  • 看完就会:专科生必备的降AIGC网站 —— 千笔AI
  • 2026年北京伯爵手表维修推荐:官方售后与网点服务评测,解决维修中心选择痛点 - 十大品牌推荐
  • 开题卡住了?8个AI论文软件深度测评,本科生毕业论文写作必备工具
  • 图谱智能体记忆技术和应用综述:构建AI Agent的“大脑记忆系统“
  • 选型必看:2026年间歇式智适应动力模块厂商综合评述,射流机组/蜂窝网光触媒净化器,间歇式智适应动力模块生产厂家哪个好 - 品牌推荐师
  • qwen视觉模型grounding 定位偏左 解决办法 +示例代码
  • 盘点2026年受关注的实验室计量泵品牌与供应商,耐酸碱磁力泵/卧式单级离心泵/油田用螺杆泵,计量泵源头厂家推荐 - 品牌推荐师
  • 2026年北京伯爵手表维修推荐:多维度实测排名,涵盖售后与网点布局核心痛点 - 十大品牌推荐
  • 导师严选!千笔,专科生论文降重神器
  • 计算机毕业设计|基于springboot + vue宠物管理系统(源码+数据库+文档)
  • 2026年北京贝伦斯手表维修推荐:多中心服务能力评价,针对走时与保养痛点深度解析 - 十大品牌推荐
  • 2026年北京波尔手表维修推荐:高端腕表服务趋势排名,涵盖日常保养与复杂维修场景 - 十大品牌推荐
  • 2026年北京贝伦斯手表维修推荐:基于多场景服务评价,针对走时与保养痛点精准指南 - 十大品牌推荐
  • 如何选择可靠手表维修点?2026年北京手表维修推荐与评测,直击服务透明度痛点 - 十大品牌推荐
  • 2026年北京宝珀手表维修推荐:高端腕表保养排名,涵盖日常与复杂故障维修场景 - 十大品牌推荐
  • 哪家维修站技术更专业?2026年北京宝齐莱维修推荐与排名,应对复杂机芯维修痛点 - 十大品牌推荐
  • 【每日一题】LeetCode 761. 特殊的二进制字符串
  • 国际激光设备巨头深度测评:技术实力与行业应用全景对比
  • P1501 [国家集训队] Tree II
  • 拖延症福音!自考论文神器 —— 千笔AI
  • 专科生收藏!倍受青睐的AI论文工具 —— 千笔写作工具