\(\text{Problem}\)



\(\text{Solution}\)

把形如 \((a,ka)\) 的路径提出来

那么覆盖这些路径的路径为不合法路径

如果能不重不漏的找出这些路径,然后用总路径减去就是答案

为了方便计算,我们限定路径用 \(dfn\) 序表示 \((x,y)\) ,并规定 \(x < y\)

即树上两点构成的路径 \((x,y)\) 满足 \(dfn[x] < dfn[y]\)

然后如何确定那些路径 \((a,b)\) 覆盖了最先找出来的路径 \((u,v)\)

其实很好办,自己画画图就知道了

其中要分两类讨论,记 \(end_x\) 为子树 \(x\) 中 \(dfn\) 序最大的点的 \(dfn\) 序,即 \(end_x = dfn_x + siz_x - 1\)

那么

于是我们确定了不合法路径 \((a,b)\) 的范围,那怎么去掉重复路径呢?

很妙啊!

因为路径像是平面上的有序数对,于是我们把它弄到平面上,然后发现不合法路径的范围是一个又一个矩阵

那么总数就是矩阵面积的并

扫描线解决即可

\(\text{Code}\)

#include<cstdio>
#include<algorithm>
#define LL long long
#define ls (p << 1)
#define rs (ls | 1)
using namespace std; const int N = 1e5 + 5;
int n, h[N], m; struct line{
int x, y0, y1, v;
}l[4000005];
inline bool cmp(line x, line y){return x.x < y.x ? 1 :(x.x == y.x ? x.v < y.v : 0);} struct edge{int to, nxt;}e[N * 2];
inline void add(int x, int y)
{
static int tot = 0;
e[++tot] = edge{y, h[x]}, h[x] = tot;
} int dep[N], f[N][20], dfn[N], siz[N];
void dfs(int x)
{
static int dfc = 0;
dfn[x] = ++dfc, siz[x] = 1;
for(int i = 1; i <= 17; i++)
if (f[x][i - 1]) f[x][i] = f[f[x][i - 1]][i - 1];
else break;
for(int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (dep[v]) continue;
dep[v] = dep[x] + 1, f[v][0] = x, dfs(v), siz[x] += siz[v];
}
} int sum[N << 2], tag[N << 2];
inline void pushup(int l, int r, int p)
{
if (tag[p] > 0) sum[p] = r - l + 1;
else if (l == r) sum[p] = 0;
else sum[p] = sum[ls] + sum[rs];
}
void update(int l, int r, int p, int x, int y, int v)
{
if (x > r || y < l) return;
if (x <= l && r <= y)
{
tag[p] += v;
pushup(l, r, p);
return;
}
int mid = (l + r) >> 1;
if (x <= mid) update(l, mid, ls, x, y, v);
if (y > mid) update(mid + 1, r, rs, x, y, v);
pushup(l, r, p);
} int main()
{
freopen("a.in", "r", stdin), freopen("a.out", "w", stdout);
scanf("%d", &n);
for(int i = 1, x, y; i < n; i++) scanf("%d%d", &x, &y), add(x, y), add(y, x);
dep[1] = 1, dfs(1);
for(int i = 1, x, y, t; i <= n; i++)
for(int j = i + i; j <= n; j += i)
{
x = i, y = j;
if (dfn[x] > dfn[y]) swap(x, y);
if (dfn[x] + siz[x] - 1 >= dfn[y])
{
t = y;
for(int k = 17; k >= 0; k--)
if (f[t][k] && dep[f[t][k]] > dep[x]) t = f[t][k];
if (dfn[t] > 1)
{
l[++m] = line{1, dfn[y], dfn[y] + siz[y] - 1, 1};
l[++m] = line{dfn[t], dfn[y], dfn[y] + siz[y] - 1, -1};
}
if (dfn[t] + siz[t] <= n)
{
l[++m] = line{dfn[y], dfn[t] + siz[t], n, 1};
l[++m] = line{dfn[y] + siz[y], dfn[t] + siz[t], n, -1};
}
}
else{
l[++m] = line{dfn[x], dfn[y], dfn[y] + siz[y] - 1, 1};
l[++m] = line{dfn[x] + siz[x], dfn[y], dfn[y] + siz[y] - 1, -1};
}
}
sort(l + 1, l + m + 1, cmp);
LL ans = 0;
for(int i = 1, j; i <= m; i++)
{
ans += 1LL * sum[1] * (l[i].x - l[i - 1].x);
for(j = i; j <= m && l[j].x == l[i].x; j++) update(1, n, 1, l[j].y0, l[j].y1, l[j].v);
i = j - 1;
}
printf("%lld\n", 1LL * n * (n - 1) / 2 - ans);
}

JZOJ 100019.A的更多相关文章

  1. (jzoj snow的追寻)线段树维护树的直径

    jzoj snow的追寻 DFS序上搞 合并暴力和,记录最长链和当前最远点,距离跑LCA # include <stdio.h> # include <stdlib.h> # ...

  2. [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)

    Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...

  3. [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)

    Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...

  4. [jzoj]5478.【NOIP2017提高组正式赛】列队

    Link https://jzoj.net/senior/#main/show/5478 Description Sylvia 是一个热爱学习的女孩子.       前段时间,Sylvia 参加了学校 ...

  5. [jzoj]1115.【HNOI2008】GT考试

    Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...

  6. [jzoj]2538.【NOIP2009TG】Hankson 的趣味题

    Link https://jzoj.net/senior/#main/show/2538 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫H ...

  7. [jzoj]4216.【NOIP2015模拟9.12】平方和

    Link https://jzoj.net/senior/#main/show/4216 Description 给出一个N个整数构成的序列,有M次操作,每次操作有一下三种: ①Insert Y X, ...

  8. [jzoj]2938.【NOIP2012模拟8.9】分割田地

    Link https://jzoj.net/senior/#main/show/2938 Description 地主某君有一块由2×n个栅格组成的土地,有k个儿子,现在地主快要终老了,要把这些土地分 ...

  9. [jzoj]2505.【NOIP2011模拟7.29】藤原妹红

    Link https://jzoj.net/senior/#main/show/2505 Description 在幻想乡,藤原妹红是拥有不老不死能力的人类.虽然不喜欢与人们交流,妹红仍然保护着误入迷 ...

  10. [jzoj]3875.【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)

    Link https://jzoj.net/senior/#main/show/3875 Problem 在遥远的S星系中一共有N个星球,编号为1…N.其中的一些星球决定组成联盟,以方便相互间的交流. ...

随机推荐

  1. 关于Linux mint更换中文字体后全局楷体修改办法

    问题描述 linux mint 更新中文字体后,全局都变成了楷体,浏览器里面,终端里(英文字体可以在终端设置里面修改),这里指的是中文字体,而英文字体可以在 linux mint 设置 - 选择字体 ...

  2. linux 挂载 vdi 文件(virtual box虚拟机镜像文件)

    1. 下载 vdfuse 下载地址 2.解压deb文件 解压deb安装包文件,这里不使用安装命令是因为你的virtualbox 可能和vdfuse的版本不一致,导致安装失败,而我们只需要用到 vdfu ...

  3. kubernetes数据持久化PV-PVC详解(一)

    官方文档地址: https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/ 1. 什么是PV,PVC? 1.1 什么是P ...

  4. 漫谈计算机网络:网络层 ------ 重点:IP协议与互联网路由选择协议

    面试答不上?计网很枯燥? 听说你学习 计网 每次记了都会忘? 不妨抽时间和我一起多学学它 深入浅出,用你的空闲时间来探索计算机网络的硬核知识! 博主的上篇连载文章<初识图像处理技术> 图像 ...

  5. JavaEE Day02MySQL

    今日内容 数据库的基本概念 MySQL数据库软件 安装 卸载 配置 SQL语句 一.数据库的基本概念 1.数据库DataBase,简称DB 2.什么是数据库?         用于存储和管理数据的仓库 ...

  6. 【每日一题】【DFS】【BFS】【队列】2021年12月5日-199. 二叉树的右视图

    解答: /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * ...

  7. 使用python脚本传递参数:(三种方式可收藏)

    背景:使用python脚本传递参数在实际工作过程中还是比较常用,以下提供了好几种的实现方式: 一.使用sys.argv的数组传入说明:使用sys.argv必须按照先后的顺序传入对应的参数:sys.ar ...

  8. C#不提升自己程序的权限实现操作注册表

    1. 绪论 当我们编写了自己的C#程序,有程序自定义的文件类型时,通常希望它满足以下需求: 双击自定义文件打开自定义程序 自定义文件有着自己的图标 此时,在网上检索可以发现,大多数回答是使用Micro ...

  9. 强化学习调参技巧二:DDPG、TD3、SAC算法为例:

    1.训练环境如何正确编写 强化学习里的 env.reset() env.step() 就是训练环境.其编写流程如下: 1.1 初始阶段: 先写一个简化版的训练环境.把任务难度降到最低,确保一定能正常训 ...

  10. Redis网络模型究竟有多强

    如果面试官问我:Redis为什么这么快? 我肯定会说:因为Redis是内存数据库!如果不是直接把数据放在内存里,甭管怎么优化数据结构.设计怎样的网络I/O模型,都不可能达到如今这般的执行效率. 但是这 ...