首页 > 其他分享 >【CF1797F】Li Hua and Path

【CF1797F】Li Hua and Path

时间:2023-07-02 15:25:54浏览次数:29  
标签:Hua int find pb dep CF1797F Path 考虑 节点

于 2023.5.10 更新 : 更正了两处笔误。

考虑如下定义:

\(A\) 表示满足第一种路径的 \((u,v)\) 集合。

\(B\) 表示满足第二种路径的 \((u,v)\) 集合。

\(C\) 表示满足前两种路径的 \((u,v)\) 集合。

然后答案显然就是 \(|A| + |B| - 2|C|\)。先求出这一类的答案,再解决动态挂叶子的问题。

考虑建出重构树大根小根各两颗。这样就可以解决关于两类限制的计数。

$A,B $:直接是子树内多少个点,这是显然的。

\(C\):考虑在大根子树里数有多少个有多少个小根树上的父亲,这样构成一条直上直下的链。

但是直接这样做是大约两只 \(\log\) 的,很劣。不如转换计数的主体,考虑枚举子树内的儿子,然后数根节点到自己路径上有多少个自己小根树上的儿子,这个是简单的,单点插入 dfs 序,区间查询,这个可以用树状数组解决。

最后考虑动态挂叶子。由于 \(u'\) 编号的性质,显然的是,加入一个叶子,他就会成为一个大根树的根节点,成为一个小根树的叶子节点,然后直接考虑计算。

  • \(A'\):显然是没有的。

  • \(B'\):除了 \(u'\) 的所有节点 \(v\) 都可以产生一对 \((u, v)\) 的贡献.

  • \(C'\):数一下自己重构树上有多少个祖先就好了。

那么增加的答案就是 \(|B'| - |C'|\) 就好了。

综上该问题被我们用 \(O(n\log n)\) 的时间解决。

注释暂且不写了。

#include <bits/stdc++.h>
#define pb push_back
#define int long long

using namespace std;

const int N = 4e5 + 5, MOD = 998244353;

int n, m, ans, dfc;
int dep[N], fa[N], sz[N], st[N], ed[N];
int v[N];

vector <int> mx[N], mn[N], e[N];

void add (int u, int k) { for ( ; u <= n; u += u & -u) v[u] += k; }
int query (int u) {
	int res = 0;
	for ( ; u; u -= u & -u) res += v[u];
	return res;
}
void init () { for (int i = 1; i <= n; i ++) fa[i] = i; }
int find (int u) { if (u != fa[u]) return fa[u] = find(fa[u]); else return u; }
void merge (int u, int v) {
	u = find(u), v = find(v);
	if (u == v) return ;
	fa[v] = fa[u]; 
}
void dfs1 (int u) {
	sz[u] = 1, st[u] = ++ dfc;
	for (int v : mx[u]) dfs1(v), sz[u] += sz[v];
	ans += sz[u] - 1, ed[u] = dfc;
}
void dfs2 (int u) {
	sz[u] = 1;
	for (int v : mn[u]) dep[v] = dep[u] + 1, dfs2(v), sz[u] += sz[v];
	ans += sz[u] - 1;
}
void dfs3 (int u) { 
	ans -= 2 * (query(ed[u]) - query(st[u] - 1));
	add(st[u], 1);
	for (int v : mn[u]) dfs3(v);
	add(st[u], -1);
}	// 考虑算多少个祖先在自己的 max子树里, 1 ~ v 
signed main () {
	// freopen(".in", "r", stdin);
	// freopen(".out", "w", stdout);
	ios :: sync_with_stdio(0);
	cin >> n, init();
	for (int i = 1, u, v; i < n; i ++) cin >> u >> v, e[u].pb(v), e[v].pb(u);
	for (int u = 1; u <= n; u ++) 
		for (int v : e[u]) if (v < u && find(u) != find(v)) 
			mx[u].pb(find(v)), merge(u, v); // 此时 v 属于的祖先一定是严格劣于 u 的, fv -> u 
	init(), dfs1(n);
	for (int u = n; u; u --) 
		for (int v : e[u]) if (v > u && find(u) != find(v)) 
			mn[u].pb(find(v)), merge(u, v);	
	dfs2(1), dfs3(1);
	cout << ans << endl, cin >> m;
	for (int i = 1, u; i <= m; i ++) {
		cin >> u, dep[n + i] = dep[u] + 1;
//		cout << u << endl;
		ans += n + i - dep[n + i] - 1;
		cout << ans << endl;
	}
	return 0;
}

标签:Hua,int,find,pb,dep,CF1797F,Path,考虑,节点
From: https://www.cnblogs.com/Custlo/p/17520812.html

相关文章

  • maxscript pathConfig.appendPath 的 bug
    pathConfig.appendPath可以很方便的把2个路径Combine在一起不管你后面带不带斜杠pathConfig.appendPath@"C:\try"@"kle.jpg""C:\try\kle.jpg"pathConfig.appendPath@"C:\try"@"kle.jpg""C:\try\kle.jpg"很酷,然后path......
  • xpath的学习
    代码来源,以及学习来源:xpath教程|Spbeen,w3school在线教程xpath的使用方式导包:fromlxmlimportetree设置的一个基本的结构xpath结点简单的例子,还有输出结果xpath简单标签检索 xpath使用id和class进行检索基本使用方式xpath的contains语句妙用xpath的与或非......
  • gdb.exe: warning: Couldn't determine a path for the index cache directory.
    GDB调试中出现的警告D:\\gitee\\luatos-soc-2022\\out\\example_copy>arm-none-eabi-gdbexample.elfC:\\SysGCC\\bin\\arm-none-eabi-gdb.exe:warning:**Couldn'tdetermineapathfortheindexcachedirectory.......
  • React学习时,outlet配置(token判定,页面path监听)
    尽管写过outlet路由的配置。考虑到token判定和路由页变更,我不了解v6是不是有更详解的做法。决定调一下配置,期望在任何页面异步更新时,token都可以在跳转前被检测到,防止无token跳转发生。为src文件配置v6版本:路由子组件App.jsimport{HashRouter,Routes,Ro......
  • 快上车,搭乘HUAWEI HiCar驶向未来
    HUAWEIHiCar(以下简称HiCar)是华为提供的人-车-家全场景智慧互联解决方案,连接手机与车辆,充分发挥各自的优势属性,将手机的应用/服务生态延伸进车辆,实现以手机为核心的全场景体验。消费者通过HiCar可以感受应用/服务在手机和车辆间无缝流转、智慧语音发起导航/播放音乐/车辆控制如车......
  • Dual Path Network(DPN)
    论文地址:https://arxiv.org/pdf/1707.01629.pdf模型及代码:github.com/cypw/DPNs本文认为:1)ResNet通过这种跨层参数共享和保留中间特征的方式,特征re-use,ResNet将输出与输入相加,形成一个残差结构,可以有效的降低特征上冗余度,重复利用已有特征,但缺点在于难以利用高层信息再发掘底层特......
  • Python | os.path库的用法
    os.path是Python标准库中的一个模块,提供了一些用于处理文件路径的函数和变量。它可以跨平台地处理不同操作系统下的路径问题,包括Windows、Linux、Unix等。os.path模块中的函数和变量可以用于处理路径字符串,并返回路径的各种组成部分,如文件名、目录名、扩展名等。同时,它也提供了一......
  • Hugging News #0626: 音频课程更新、在线体验 baichuan-7B 模型、ChatGLM2-6B 重磅发
    每一周,我们的同事都会向社区的成员们发布一些关于HuggingFace相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「HuggingNews」,本期HuggingNews有哪些有趣的消息,快来看看吧!重要更新最新音频课程现已发布近期,我们......
  • 11. 配置ContextPath【从零开始学Spring Boot】
    Springboot默认是/,这样直接通过http://ip:port/就可以访问到index页面,如果要修改为http://ip:port/path/访问的话,那么需要在Application.properties文件中加入server.context-path=/你的path,比如:spring-boot,那么访问地址就是http://ip:port/spring-boot路径。server.context-......
  • Invalid character found in the request target [/api/hsFile/download?filePath=E:
    java.lang.IllegalArgumentException:Invalidcharacterfoundintherequesttarget[/api/hsFile/download?filePath=E:\\%E4%B8%B4%E6%97%B6%E6%96%87%E4%BB%B6&fileName=N230508A0002.xlsx].ThevalidcharactersaredefinedinRFC7230andRFC39861、原因:/a......