JZOJ 100019.A
\(\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的更多相关文章
- (jzoj snow的追寻)线段树维护树的直径
jzoj snow的追寻 DFS序上搞 合并暴力和,记录最长链和当前最远点,距离跑LCA # include <stdio.h> # include <stdlib.h> # ...
- [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)
Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...
- [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)
Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...
- [jzoj]5478.【NOIP2017提高组正式赛】列队
Link https://jzoj.net/senior/#main/show/5478 Description Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校 ...
- [jzoj]1115.【HNOI2008】GT考试
Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...
- [jzoj]2538.【NOIP2009TG】Hankson 的趣味题
Link https://jzoj.net/senior/#main/show/2538 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫H ...
- [jzoj]4216.【NOIP2015模拟9.12】平方和
Link https://jzoj.net/senior/#main/show/4216 Description 给出一个N个整数构成的序列,有M次操作,每次操作有一下三种: ①Insert Y X, ...
- [jzoj]2938.【NOIP2012模拟8.9】分割田地
Link https://jzoj.net/senior/#main/show/2938 Description 地主某君有一块由2×n个栅格组成的土地,有k个儿子,现在地主快要终老了,要把这些土地分 ...
- [jzoj]2505.【NOIP2011模拟7.29】藤原妹红
Link https://jzoj.net/senior/#main/show/2505 Description 在幻想乡,藤原妹红是拥有不老不死能力的人类.虽然不喜欢与人们交流,妹红仍然保护着误入迷 ...
- [jzoj]3875.【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)
Link https://jzoj.net/senior/#main/show/3875 Problem 在遥远的S星系中一共有N个星球,编号为1…N.其中的一些星球决定组成联盟,以方便相互间的交流. ...
随机推荐
- Linux禁止摄像头自动曝光(手动调节曝光)
前言 很多摄像头具有自动曝光的功能,例如在较暗的调节下,提高曝光率,在较亮的调节下降低曝光.下面简单介绍在linux平台俩种方式来修改自动曝光. 软件调节(图形化界面) 安装qv4l2 sudo ap ...
- Java开发学习(四十四)----MyBatisPlus查询语句之查询条件
1.查询条件 前面我们只使用了lt()和gt(),除了这两个方法外,MybatisPlus还封装了很多条件对应的方法. MybatisPlus的查询条件有很多: 范围匹配(> . = .betw ...
- labuladong算法笔记总结
动态规划解题套路框架 学习计划: 最长回文子序列 〇.必读文章 1.数据结构和算法学习指南(学习算法和刷题的框架思维) 了解数据结构的操作和遍历(迭代or递归) 从树刷起,结合框架思维,有利于理解(回 ...
- 手摸手,使用Dart语言开发后端应用,来吧!
前言 这几天连续发了几篇关于 Dart 开发后端应用的文章,主要是介绍了 Dart 的一些优点,比如异步任务,并发处理,编译部署等等. 俗话说,光说不练假把式,今天我们来真正开始一个 Dart 后端应 ...
- React报错之Function components cannot have string refs
总览 当我们在一个函数组件中使用一个字符串作为ref时,会产生"Function components cannot have string refs"错误.为了解决该错误,使用u ...
- CGI、WSGI、uWSGI、ASGI……
在学习 Python Web 开发时候,可能会遇到诸如 uwsgi.wsgi 等名词,下面通过梳理总结,探究它们之间的关系. CGI CGI(Common Gateway Interface)通用网关 ...
- Redis的数据复制
介绍 Redis 的复制 Redis 的复制功能分为同步(sync)和命令传播(command propagate)这两个操作 同步操作用于,将从服务器的数据库状态更新至主服务器当前所处的数据库状态: ...
- 时间老去,Ruby不死,Ruby语言基础入门教程之Ruby3全平台开发环境搭建EP00
如果说电子游戏是第九艺术,那么,编程技术则配得上第十艺术的雅称.艺术发展的普遍规律就是要给与人们对于艺术作品的更高层感受,而Matz的Ruby语言则正是这样一件艺术品. 无论是语法还是理念,都让Rub ...
- vue elementui弹框内 富文本编辑器的使用,及踩坑
最近vue项目中遇到弹框内使用富文本编辑器,遇到最大的问题是,在打开弹框后才能创建富文本编辑器,并且只能创建一次,多次点击弹框,报错: Error in v-on handler: "Err ...
- js的基本数据类型和引用数据类型及深拷贝浅拷贝
1.栈(stack)和堆(heap) stack为自动分配的内存空间,它由系统自动释放:而heap则是动态分配的内存,大小也不一定会自动释放 2.js数据类型分两种 (1)基本数据类型(值类型):Nu ...