\(\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 server设置开机自动连接WIFI

    1.前言 之前买了一个工控机,装过几个OS(linux 发行版),但是一直没有细研究过流程,只是停留在能用就不管了,工控机自带无线网卡(和俩个有线网口),所以这篇文章好好介绍如何开机自动连接WIFI( ...

  2. 解决sox报错sox FAIL formats: no handler for given file type `mp3

    sudo apt-get install libsox-fmt-mp3

  3. day14 I/O流——序列化与反序列化 & 计算机网络五层架构 & TCP的建立连接与断开连接

    day 14 序列化与反序列化 序列化 将对象转化成特定格式的字符串文件(字节文件)叫做序列化 1.一个类要想实现序列化,必须实现serializable接口 2.序列化用途 ​ 1)把对象的字节序列 ...

  4. 【Java SE进阶】Day04 Map、Debug

    一.Map集合 1.概述 映射 /双列集合 集合分为Collection(存储一个元素 )和Map(存储一对元素) 键不能重复,值可以重复 2.常用子类 HashMap 哈希表存储数据 元素存取数据不 ...

  5. 24V转5V降压芯片,24V转3.3V的稳压芯片,中文规格书

    一般说明PW2312 是一个高频,同步,整流,降压,开关模式转换器内部功率 MOSFET.它提供了一个非常紧凑的解决方案,以实现 1.5A 的峰值输出电流在广泛的输入电源范围内,具有优良的负载和线路调 ...

  6. Flutter异常监控 - 壹 | 从Zone说起

    开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情 如果你正需要处理Flutter异常捕获,那么恭喜你,找对地了,这里从根源上给你准备了Flutter异常捕获 ...

  7. [OpenCV实战]41 嵌入式计算机视觉设备选择

    文章目录 1 简介 1.1 深度学习与传统计算机视觉 1.2 性能考量 1.3 社区支持 2 结论 3 参考 在计算机视觉领域中,不同的场景不同的应用程序需要不同的解决方案.在本文中,我们将快速回顾可 ...

  8. Spark框架下均值漂移算法对舆情聚类的分析

    知网链接 原文链接 张京坤,  王怡怡 软件导刊   2022年21卷第6期 页码:141-146 DOI:10.11907/rjdk.211889    中图分类号:TP274 纸质出版日期:202 ...

  9. requests模块已经安装,vs code下无法导入requests模块

    MacOS 11.2.3 确定自己确实已经安装requests cmd下输入pip list   看下python版本   看下visual studio code中python解释器的版本   cm ...

  10. windows11 彻底修改c盘中文用户名

    windows11 彻底修改c盘用户名 由于一开始注册的时候没有注意使用了中文名导致后来再使用一些应用的时候出现问题浪费了大量的时间找不出原因(例如:安装cuda 的时候在使用nvcc编译.cu文件的 ...