\(\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禁止摄像头自动曝光(手动调节曝光)

    前言 很多摄像头具有自动曝光的功能,例如在较暗的调节下,提高曝光率,在较亮的调节下降低曝光.下面简单介绍在linux平台俩种方式来修改自动曝光. 软件调节(图形化界面) 安装qv4l2 sudo ap ...

  2. Java开发学习(四十四)----MyBatisPlus查询语句之查询条件

    1.查询条件 前面我们只使用了lt()和gt(),除了这两个方法外,MybatisPlus还封装了很多条件对应的方法. MybatisPlus的查询条件有很多: 范围匹配(> . = .betw ...

  3. labuladong算法笔记总结

    动态规划解题套路框架 学习计划: 最长回文子序列 〇.必读文章 1.数据结构和算法学习指南(学习算法和刷题的框架思维) 了解数据结构的操作和遍历(迭代or递归) 从树刷起,结合框架思维,有利于理解(回 ...

  4. 手摸手,使用Dart语言开发后端应用,来吧!

    前言 这几天连续发了几篇关于 Dart 开发后端应用的文章,主要是介绍了 Dart 的一些优点,比如异步任务,并发处理,编译部署等等. 俗话说,光说不练假把式,今天我们来真正开始一个 Dart 后端应 ...

  5. React报错之Function components cannot have string refs

    总览 当我们在一个函数组件中使用一个字符串作为ref时,会产生"Function components cannot have string refs"错误.为了解决该错误,使用u ...

  6. CGI、WSGI、uWSGI、ASGI……

    在学习 Python Web 开发时候,可能会遇到诸如 uwsgi.wsgi 等名词,下面通过梳理总结,探究它们之间的关系. CGI CGI(Common Gateway Interface)通用网关 ...

  7. Redis的数据复制

    介绍 Redis 的复制 Redis 的复制功能分为同步(sync)和命令传播(command propagate)这两个操作 同步操作用于,将从服务器的数据库状态更新至主服务器当前所处的数据库状态: ...

  8. 时间老去,Ruby不死,Ruby语言基础入门教程之Ruby3全平台开发环境搭建EP00

    如果说电子游戏是第九艺术,那么,编程技术则配得上第十艺术的雅称.艺术发展的普遍规律就是要给与人们对于艺术作品的更高层感受,而Matz的Ruby语言则正是这样一件艺术品. 无论是语法还是理念,都让Rub ...

  9. vue elementui弹框内 富文本编辑器的使用,及踩坑

    最近vue项目中遇到弹框内使用富文本编辑器,遇到最大的问题是,在打开弹框后才能创建富文本编辑器,并且只能创建一次,多次点击弹框,报错: Error in v-on handler: "Err ...

  10. js的基本数据类型和引用数据类型及深拷贝浅拷贝

    1.栈(stack)和堆(heap) stack为自动分配的内存空间,它由系统自动释放:而heap则是动态分配的内存,大小也不一定会自动释放 2.js数据类型分两种 (1)基本数据类型(值类型):Nu ...