「UR#5」怎样更有力气
「UR#5」怎样更有力气
解题思路
- 考虑没有限制的情况,一定是把操作离线下来,按照边权从小到达做。可以发现,如果没有限制,完全图是多余的,直接拿树边进行合并就可以了。我们要做这么一件事情,把每个点属于的图上联通块看做颜色,每次合并链上相邻两块颜色不一样的,那么我们再额外使用一个并查集,把树上相邻的颜色相同的点合并在一个集合里,每次跳到集合中最浅的点做图上的合并操作即可,复杂度 \(\mathcal O(n\alpha(n))\) 。
 - 考虑一个操作的限制数量 \(cnt\) ,如果 \(cnt \geq\) 链上的点数,那么这些点仍然是联通的,所以可以直接当做没有限制的情况来做。于是发现,有限制的情况的链的点数不超过 \(p_i\) ,考虑暴力把这条链上的点拿出来。问题转化为有一个点集 \(S\) ,并且给出这个点集的补图,要合并联通块信息。涉及到补图可以试图用一个小技巧解决,拿出补图中度数最小的点 \(x\) ,有 \(\deg[x]\leq \min(|S|,\sqrt{p_i})\) 。划分成与 \(x\) 相连的点集和与 \(x\) 不相邻的点集两个问题考虑。所有不与 \(x\) 相连的点可以直接与 \(x\) 合并,所有与 \(x\) 相邻的点不超过 \(\sqrt{p_i}\) 个,可以直接枚举两个点合并。对于两个集合直接的连边,考虑与 \(x\) 相邻的集合的每一条对 \(x\) 不相邻集合的出边,如果出边数量 \(=\) 集合大小则无法连边,否则一定可以和 \(x\) 不相邻集合连边,直接连向 \(x\) 即可。总复杂度 \(\mathcal O(n \alpha(n))\) 。
 
code
/*program by mangoyang*/
#include<bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
    int ch = 0, f = 0; x = 0;
    for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
    for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
    if(f) x = -x;
}
const int N = 300005;
ll ans;
bitset<N> B, C;
vector<int> e[N];
vector<pair<int, int> > g[N];
int f[N][21], dep[N], ax[N], ay[N], aw[N], id[N], n, m, p, tot;
namespace Rose{
	vector<int> g[N];
	inline void dfs(int u, int fa){
		dep[u] = dep[fa] + 1, f[u][0] = fa;
		for(int i = 1; i <= 20; i++)
			f[u][i] = f[f[u][i-1]][i-1];
		for(auto v : g[u])
			if(v != fa) dfs(v, u);
	}
	inline int lca(int x, int y){
		if(dep[x] < dep[y]) swap(x, y);
		for(int i = 20; ~i; i--)
			if(dep[f[x][i]] >= dep[y]) x = f[x][i];
		if(x == y) return x;
		for(int i = 20; ~i; i--)
			if(f[x][i] != f[y][i])
				x = f[x][i], y = f[y][i];
		return f[x][0];
	}
}
struct Camlia{
	int fa[N];
	inline void init(){
		for(int i = 1; i <= n; i++) fa[i] = i;
	}
	inline int ask(int x){
		return x == fa[x] ? x : fa[x] = ask(fa[x]);
	}
	inline void merge(int x, int y, int z){
		int p = ask(x), q = ask(y);
		if(p == q) return;
		tot++, fa[p] = q, ans += z;
	}
}X1, X2;
inline bool cmp(int x, int y){ return aw[x] < aw[y]; }
int main(){
	read(n), read(m), read(p);
	for(int i = 2, x; i <= n; i++)
		read(x), Rose::g[x].push_back(i);
	for(int i = 1; i <= m; i++){
		id[i] = i;
		read(ax[i]), read(ay[i]), read(aw[i]);
	}
	for(int i = 1, x, y, z; i <= p; i++){
		read(x), read(y), read(z);
		g[x].push_back(make_pair(y, z));
	}
	sort(id + 1, id + m + 1, cmp);
	Rose::dfs(1, 0);
	X1.init(), X2.init();
	for(int i = 1; i <= m; i++){
		int x = id[i], u = ax[x], v = ay[x];
		int lca = Rose::lca(u, v);
		int dis = dep[u] + dep[v] - 2 * dep[lca] + 1;
		if((int) g[x].size() < dis - 1){
			u = X2.ask(u), v = X2.ask(v);
			while(u != v){
				if(dep[u] < dep[v]) swap(u, v);
				X1.merge(u, f[u][0], aw[x]);
				X2.fa[u] = X2.ask(f[u][0]), u = X2.ask(u);
			}
		}
		else{
			vector<int> A; A.push_back(lca);
			int now = u;
			while(now != lca)
				A.push_back(now), now = f[now][0];
			now = v;
			while(now != lca)
				A.push_back(now), now = f[now][0];
			for(auto ed : g[x]){
				e[ed.first].push_back(ed.second);
				e[ed.second].push_back(ed.first);
			}
			int mndeg = (int) A.size(), pos = 0;
			for(auto k : A)
				if((int) e[k].size() < mndeg)
					mndeg = (int) e[k].size(), pos = k;
			int size = (int) A.size() - (int) e[pos].size();
			for(auto k : e[pos]) B[k] = 1;
			for(auto k : A) if(!B[k]) X1.merge(pos, k, aw[x]);
			for(auto k1 : e[pos]){
				for(auto k2 : e[k1]) C[k2] = 1;
				for(auto k2 : e[pos])
					if(!C[k2]) X1.merge(k1, k2, aw[x]);
				for(auto k2 : e[k1]) C[k2] = 0;
			}
			for(auto k1 : e[pos]){
				int tmp = 0;
				for(auto k2 : e[k1]) if(!B[k2]) tmp++;
				if(tmp < size) X1.merge(k1, pos, aw[x]);
			}
			for(auto k : e[pos]) B[k] = 0;
			for(auto k : A) e[k].clear();
		}
	}
	cout << ans << endl;
	return 0;
}
												
											「UR#5」怎样更有力气的更多相关文章
- 「UR#5」怎样跑得更快
		
「UR#5」怎样跑得更快 膜这个您就会了 下面是复读机mangoyang 我们要求 \[ \sum_{j=1}^n \gcd(i,j)^{c-d} j^d x_j=\frac{b_i}{i^d} \] ...
 - 【UOJ#61】【UR #5】怎样更有力气(最小生成树)
		
[UOJ#61][UR #5]怎样更有力气(最小生成树) 题面 UOJ 题解 最最最暴力的想法是把所有边给处理出来然后跑\(MST\). 考虑边权的情况,显然离线考虑,把么一天按照\(w_i\)进行排 ...
 - 「UR#6」懒癌
		
「UR#6」懒癌 妈妈我居然看了六个小时题解,快救救乌干达的可怜儿童吧. 接下来开始膜官方题解:  其实就算有上面两个结论也不是很好想到任意复杂度的做法,关键在于要想到一个人是怎么推断自己的狗是不是 ...
 - UOJ#61. 【UR #5】怎样更有力气
		
大力水手问禅师:“大师,很多事情都需要用很大力气才能完成,而我在吃了菠菜之后力气很大,于是就导致我现在非常依赖菠菜.我很讨厌我的现状,有没有办法少吃点菠菜甚至不吃菠菜却仍很有力气?” 禅师浅笑,答:“ ...
 - 【UR #5】怎样更有力气
		
Problem Description 大力水手问禅师:"大师,很多事情都需要用很大力气才能完成,而我在吃了菠菜之后力气很大,于是就导致我现在非常依赖菠菜.我很讨厌我的现状,有没有办法少吃点 ...
 - UOJ61. 【UR #5】怎样更有力气
		
题目链接 Statement 给定一棵 \(n\) 点树 \(T\) 和 \(m\) 个操作 v u w : 在 \(T\) 中 \(u,v\) 的最短路上所有点里面选出若干对(可以不选,可以重复), ...
 - Solution -「UR #21」「UOJ #632」挑战最大团
		
\(\mathcal{Description}\) Link. 对于简单无向图 \(G=(V,E)\),定义它是"优美"的,当且仅当 \[\forall\{a,b,c,d\ ...
 - Solution -「UR #2」「UOJ #32」跳蚤公路
		
\(\mathcal{Description}\) Link. 给定一个 \(n\) 个点 \(m\) 条边的带权有向图,每条边还有属性 \(s\in\{-1,0,1\}\).对于每个 \(u ...
 - 「知乎」对中国用户而言,Pure Android 是否比 MIUI 或 Flyme 体验更好? - Donnie的博客
		
这篇文章转载自我在知乎上的回答 哎呀-不要站队嘛.其实这是一个很有意思的题目,让我们一点点来看 哦对,谢妖-.本人是Nexus 5用户,系统当然是Pure Android KitKat啦(臭谷粉!点D ...
 
随机推荐
- K8s configMap原理介绍
			
给容器内应用程序传递参数的实现方式: 1. 将配置文件直接打包到镜像中,但这种方式不推荐使用,因为修改配置不够灵活. 2. 通过定义Pod清单时,指定自定义命令行参数,即设定 args:[" ...
 - 在微信小程序页面间传递数据总结
			
在微信小程序页面间传递数据 原文链接:https://www.jianshu.com/p/dae1bac5fc75 在开发微信小程序过程之中,遇到这么一些需要在微信小程序页面之间进行数据的传递的情况, ...
 - nginx 配置ssl
			
单向SSL配置实例: server{ listen ssl; server_name www..com; root /data/wwwroot/www..com/ ; index index.html ...
 - 如何去掉word中英文单词下的红色波浪线
			
文件 ->选项 ->校对 在 只隐藏此文档中的拼写错误(S) 选项前打钩,点击确定即可
 - 一个半吊子PM的反思
			
故事之源 2019年3月,也就是2016级计算机学院的大三时,软件工程这门课程由选修转为专业必修课,而七个葫芦娃共聚罗杰老师的课堂,组成葫芦娃不想写代码小分队.面临着继承往届项目.完成指定项目和自选项 ...
 - Cesium原理篇:GroundPrimitive【转】
			
今天来看看GroundPrimitive,选择GroundPrimitive有三个目的:1 了解GroundPrimitive和Primitive的区别和关系 2 createGeometry的特殊处 ...
 - 搭建基于 Anaconda 管理的多用户 JupyterHub 平台
			
搭建基于 Anaconda 管理的多用户 JupyterHub 平台 情况:计算工作站放在实验室,多个同学需要接入使用,且需要各自独立的环境,并使用 Jupyter notebook 平台以方便协作. ...
 - sharding jdbc(sphere) 3.1.0 spring boot配置
			
sharding jdbc 2.x系列详解参见https://www.cnblogs.com/zhjh256/p/9221634.html. 最近将sharding jdbc的配置从xml切换到了sp ...
 - Oracle 11g R2手动配置EM(转)
			
转自:http://blog.itpub.net/9034054/viewspace-1973418/ Oracle 11g R2手动配置EM Oracle 作者:luashin 时间:2016-01 ...
 - svn 清除用户名和密码