「codeforces - 1486F」Pairs of Paths
还算萌,但是代码有些难写……
你首先会想要
int n, m, fa[20][300100], pa[300100], dep[300100], cnt[900100];
int ldf[300100], rdf[300100], dfc, qwq;
vi<int> G[300100];
struct path {
int x, y, sx, sy, lca;
};
void dfs(int x, int pre) {
fa[0][x] = pa[x] = pre;
dep[x] = dep[pre]+1;
ldf[x] = ++dfc;
for (int i=1; i<20; ++i) {
fa[i][x] = fa[i-1][fa[i-1][x]];
}
for (auto y : G[x]) {
if (y != pre) {
dfs(y, x);
}
}
rdf[x] = dfc;
}
int lca(int x, int y) {
if (dep[x] < dep[y]) {
swap(x, y);
}
for (int i=19; i>=0; --i) {
if (dep[fa[i][x]] >= dep[y]) {
x = fa[i][x];
}
}
if (x == y) {
return x;
}
for (int i=19; i>=0; --i) {
if (fa[i][x] != fa[i][y]) {
x = fa[i][x], y = fa[i][y];
}
}
return pa[x];
}
int jump(int x, int d) {
if (d < 0) {
return n+(++qwq);
}
for (int i=19; i>=0; --i) {
if ((d>>i)&1) {
x = fa[i][x];
}
}
return x;
}
int bit[300100];
void add(int x, int y) {
for (; x<=n; x+=x&-x) {
bit[x] += y;
}
}
int qry(int x) {
int res = 0;
for (; x; x-=x&-x) {
res += bit[x];
}
return res;
}
int qry(int l, int r) {
return qry(r)-qry(l-1);
}
void executer() {
cin >> n;
for (int i=1,x,y; i<n; ++i) {
cin >> x >> y;
G[x].push_back(y);
G[y].push_back(x);
}
dfs(1, 0);
cin >> m;
vi<path> paths(m);
for (auto& it : paths) {
cin >> it.x >> it.y;
it.lca = lca(it.x, it.y);
it.sx = jump(it.x, dep[it.x]-dep[it.lca]-1);
it.sy = jump(it.y, dep[it.y]-dep[it.lca]-1);
if (it.sx > it.sy) {
swap(it.sx, it.sy), swap(it.x, it.y);
}
}
sort(paths.begin(), paths.end(), [&](const path& lhs, const path& rhs) {
return dep[lhs.lca] < dep[rhs.lca]
|| (dep[lhs.lca] == dep[rhs.lca] && lhs.lca < rhs.lca)
|| (lhs.lca == rhs.lca && lhs.sx > rhs.sx)
|| (lhs.sx == rhs.sx && lhs.sy > rhs.sy);
});
LL ans = 0;
for (int i=0; i<m;) {
int j = i;
while (j < m-1 && paths[j+1].lca == paths[j].lca) {
j++;
}
LL now = 0;
for (int l=i; l<=j;) {
int r = l;
while (r < j && paths[r+1].sx == paths[r].sx) {
r++;
}
for (int k=l; k<=r; ++k) {
ans += now-cnt[paths[k].sy];
}
for (int k=l; k<=r; ++k) {
cnt[paths[k].sx]++, cnt[paths[k].sy]++;
}
now += r-l+1, l = r+1;
}
for (int k=i; k<=j; ++k) {
cnt[paths[k].sx] = cnt[paths[k].sy] = 0;
}
for (int k=i; k<=j; ++k) {
ans += qry(ldf[paths[k].lca], rdf[paths[k].lca]);
if (paths[k].sx <= n) {
ans -= qry(ldf[paths[k].sx], rdf[paths[k].sx]);
}
if (paths[k].sy <= n) {
ans -= qry(ldf[paths[k].sy], rdf[paths[k].sy]);
}
}
for (int k=i; k<=j; ++k) {
add(ldf[paths[k].x], 1), add(ldf[paths[k].y], 1);
}
i = j+1;
}
cout << ans << "\n";
}
「codeforces - 1486F」Pairs of Paths的更多相关文章
- Solution -「CF 1391E」Pairs of Pairs
\(\mathcal{Description}\) Link. 给定一个 \(n\) 个点 \(m\) 条边的无向图,在其上找到一条包括不少于 \(\lceil\frac{n}2\rceil\ ...
- 「CodeForces 581D」Three Logos
BUPT 2017 Summer Training (for 16) #3A 题意 给你三个矩形,需要不重叠不留空地组成一个正方形.不存在输出-1,否则输出边长和这个正方形(A,B,C表示三个不同矩形 ...
- 「CodeForces - 50C 」Happy Farm 5 (几何)
BUPT 2017 summer training (16) #2B 题意 有一些二维直角坐标系上的整数坐标的点,找出严格包含这些点的只能八个方向走出来步数最少的路径,输出最少步数. 题解 这题要求严 ...
- 「CodeForces - 598B」Queries on a String
BUPT 2017 summer training (for 16) #1I 题意 字符串s(1 ≤ |s| ≤ 10 000),有m(1 ≤ m ≤ 300)次操作,每次给l,r,k,代表将r位置插 ...
- 「CodeForces - 717E」Paint it really, really dark gray (dfs)
BUPT 2017 summer training (for 16) #1H 题意 每个节点是黑色or白色,经过一个节点就会改变它的颜色,一开始在1节点.求一条路径使得所有点变成黑色. 题解 dfs时 ...
- 「CodeForces 476A」Dreamoon and Stairs
Dreamoon and Stairs 题意翻译 题面 DM小朋友想要上一个有 \(n\) 级台阶的楼梯.他每一步可以上 \(1\) 或 \(2\) 级台阶.假设他走上这个台阶一共用了 \(x\) 步 ...
- 「CodeForces 546B」Soldier and Badges 解题报告
CF546B Soldier and Badges 题意翻译 给 n 个数,每次操作可以将一个数 +1,要使这 n 个数都不相同, 求最少要加多少? \(1 \le n \le 3000\) 感谢@凉 ...
- 「Codeforces 79D」Password
Description 有一个 01 序列 \(a_1,a_2,\cdots,a_n\),初始时全为 \(0\). 给定 \(m\) 个长度,分别为 \(l_1\sim l_m\). 每次可以选择一个 ...
- 「Codeforces 468C」Hack it!
Description 定义 \(f(x)\) 表示 \(x\) 的各个数位之和.现在要求 \(\sum_{i=l}^rf(i)\bmod a\). 显然 ans=solve(l,r)%a; if(a ...
- 「Codeforces 724F」Uniformly Branched Trees
题目大意 如果两棵树可以通过重标号后变为完全相同,那么它们就是同构的. 将中间节点定义为度数大于 \(1\) 的节点.计算由 \(n\) 个节点,其中所有的中间节点度数都为 \(d\) 的互不同构的树 ...
随机推荐
- 生物信息学 Python 入门之源码安装
编程,作为生物信息学的一个基础性技能,是任何一个生信工程师都无法绕开话题.也许有些人还在纠结 Perl 和 Python 到底应该学习哪一个,但作为目前最火最流行的编程语言 Python 还是非常值得 ...
- Dapr在Java中的实践 之 状态管理
状态管理 状态管理(State Management)使用键值对作为存储机制,可以轻松的使长时运行.高可用的有状态服务和无状态服务共同运行在我们的服务中. 我们的服务可以利用Dapr的状态管理API在 ...
- 聊聊Cola-StateMachine轻量级状态机的实现
背景 在分析Seata的saga模式实现时,实在是被其复杂的 json 状态语言定义文件劝退,我是有点没想明白为啥要用这么来实现状态机:盲猜可能是基于可视化的状态机设计器来定制化流程,更方便快捷且上手 ...
- 【QCustomPlot】配置帮助文档
说明 使用 QCustomPlot 绘图库辅助开发时整理的学习笔记.同系列文章目录可见 <绘图库 QCustomPlot 学习笔记>目录.本篇介绍 QCustomPlot 帮助文档的配置. ...
- Sa-Token 多账号认证:同时为系统的 Admin 账号和 User 账号提供鉴权操作
Sa-Token 是一个轻量级 java 权限认证框架,主要解决登录认证.权限认证.单点登录.OAuth2.微服务网关鉴权 等一系列权限相关问题. Gitee 开源地址:https://gitee.c ...
- IDEA:使用Test注解,控制台无法输入
解决方案 步骤一: 点击help ===> Edit Custom VM Options... 步骤二: 添加文件末尾添加如下内容 -Deditable.java.test.console=tr ...
- 论文解读(MCD)《Maximum Classifier Discrepancy for Unsupervised Domain Adaptation》
Note:[ wechat:Y466551 | 付费咨询,非诚勿扰 ] 论文信息 论文标题:Maximum Classifier Discrepancy for Unsupervised Domain ...
- 无linux基础也能熟练掌握git的基本操作
git是一个用来管理项目的工具,它的远程仓库有github.gitee.gitlab代码托管中心,既可以用于个人共享代码,又可以用于团队进行项目的协作与发布,那么我们一起来了解一下git该如何使用~ ...
- [golang]gin框架接收websocket通信
前言 WebSocket是一种在单个TCP连接上进行全双工通信的协议.WebSocket让客户端和服务端之间的数据交换变得非常简单,且允许服务器主动向客户端推送数据,并且之后客户端和服务端所有的通信都 ...
- nginx配置gzip压缩
前言 为提高用户获取响应数据的速度,Nginx服务器可以将响应数据进行gzip压缩,在减小响应数据的大小后再发送给用户端浏览器. 要想启用gzip压缩,需要浏览器支持gzip压缩功能,目前大多数浏览器 ...