OVOO
题目描述:
$zhx$有一个棵$n$个点的树,每条边有个权值。
定义一个连通块为一个点集与使这些点连通的所有边(这些点必须连通)。
定义一个连通块的权值为这个连通块的边权和(如果一个连通块只包含一个点,那么它的权值为$0$)。
$zhx$想找一个包含$1$号点的连通块送给他的妹子,所以他希望你求出包含$1$号点的所有连通块中权值第$k$小的连通块的权值。
题解:
非常裸的可持久化可并堆。
经典的$k$短路要求维护绕多远+终点,而它维护总边权+可选边集。
维护边集时需要可持久化可并堆。
还是经典操作,要么扔掉上一条边换上次优,要么在边集中找一个最优然后更新边集。
代码:
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = ;
const int MOD = ;
const int M = *N;
typedef long long ll;
template<typename T>
inline void read(T&x)
{
T f = ,c = ;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){c=c*+ch-'';ch=getchar();}
x = f*c;
}
int n,k,rt[N],wy[M];
ll ww[M];
struct edc
{
int x;
ll d;
edc(){}
edc(int x,ll d):x(x),d(d){}
friend bool operator < (edc a,edc b)
{
return a.d>b.d;
}
}tp;
int tot,tw;
struct node
{
int ls,rs,dis,tl;
ll v;
}p[M];
int merge1(int x,int y)
{
if(!x||!y)return x+y;
if(p[x].v>p[y].v)swap(x,y);
p[x].rs = merge1(p[x].rs,y);
if(p[p[x].ls].dis<p[p[x].rs].dis)swap(p[x].ls,p[x].rs);
p[x].dis=p[p[x].rs].dis+;
return x;
}
int merge(int x,int y)
{
if(!x||!y)return x+y;
if(p[x].v>p[y].v)swap(x,y);
int u = ++tot;
p[u] = p[x],p[u].rs = merge(p[u].rs,y);
if(p[p[u].ls].dis<p[p[u].rs].dis)swap(p[u].ls,p[u].rs);
p[u].dis = p[p[u].rs].dis+;
return u;
}
priority_queue<edc>q;
ll ans;
int main()
{
freopen("tt.in","r",stdin);
read(n),read(k);
for(int f,w,i=;i<n;i++)
{
read(f),read(w);
p[++tot].dis=,p[tot].tl=i+,p[tot].v=w;
rt[f] = merge1(rt[f],tot);
}
k--;
tw=;
ww[tw] = p[rt[]].v;
wy[tw] = rt[];
q.push(edc(,ww[]));
while(k&&!q.empty())
{
tp = q.top();
q.pop();
k--;
int u = tp.x;
ans = ww[u];
if(!k)break;
int ls = p[wy[u]].ls,rs = p[wy[u]].rs;
int tmp = merge(ls,rs);
if(tmp)
{
tw++;
ww[tw] = ww[u]-p[wy[u]].v+p[tmp].v;
wy[tw] = tmp;
q.push(edc(tw,ww[tw]));
}
tw++;
wy[tw] = merge(tmp,rt[p[wy[u]].tl]);
ww[tw] = ww[u]+p[wy[tw]].v;
if(wy[tw])q.push(edc(tw,ww[tw]));
}
printf("%lld\n",ans%MOD);
return ;
}
OVOO的更多相关文章
- 【CH 弱省互测 Round #1 】OVOO(可持久化可并堆)
Description 给定一颗 \(n\) 个点的树,带边权. 你可以选出一个包含 \(1\) 顶点的连通块,连通块的权值为连接块内这些点的边权和. 求一种选法,使得这个选法的权值是所有选法中第 \ ...
- IntelliJ IDEA sass环境配置及常见报错处理
1.下载安装ruby,网上教程很多的,安装完之后在命令行输入ruby -v检查一下是否安装成功了.(注意安装的时候要勾选第二项).
- GitHub创建个人主页
在GitHub,一个项目对应唯一的Git版本库,创建一个新的版本库就是创建一个新的项目.访问仪表板(Dashboard)页面,如图3-1,可以看 到关注的版本库中已经有一个,但自己的版本库为零.在显示 ...
- 面向初学者的指南:创建时间序列预测 (使用Python)
https://blog.csdn.net/orDream/article/details/100013682 上面这一篇是对 https://www.analyticsvidhya.com/blog ...
随机推荐
- Swift异常处理的try?与try!
首先要明白抛出异常后异常的运动:异常被抛出后,中断整个处理,异常不断向外层(范围)传递,直到遇到catch代码块群,会与catch代码块的条件进行匹配,匹配符合则进入此代码块处理.如果遇到没有条件的c ...
- Mac下Apache服务器和webDav服务器快速配置
当自己在家敲代码需要发请求时,就可以配置本地Apache,Mac电脑自带的服务器.这个比windows上的本地服务器还要好用,下面写下最快速配置方案. 0.在开始之前需要给自己的电脑设置下开机密码,想 ...
- bzoj 4530: [Bjoi2014]大融合【LCT】
新姿势,一般来讲LCT只能维护splay重边里的数据,而这里要求维护整颗子树的size 多维护一个sq表示当前点轻儿子的size和,si表示包括轻重边的整颗子树的大小 然后需要改sq的地方是link和 ...
- 笔记:JavaScript闭包
闭包 闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰.直观的说就是形成一个不销毁的栈环境. 对于闭包,当外部函数返回之后,内部函数依然可以访问外部函数的变量 ...
- CentOS服务器下安装配置SSL
https是一个安全的访问方式,数据在传输过程中是加密的,https基于SSL. 一.安装apache和ssl模块 1.安装apache #yum install httpd 2.安装ssl模块 #y ...
- 严格次小生成树(lca + 倍增)
题目描述 小C最近学了很多最小生成树的算法,Prim算法.Kurskal算法.消圈算法等等.正当小C洋洋得意之时,小P又来泼小C冷水了.小P说,让小C求出一个无向图的次小生成树,而且这个次小生成树还得 ...
- Codeforces Round #418 (Div. 2) A
Description A few years ago, Hitagi encountered a giant crab, who stole the whole of her body weight ...
- eclipse 当安装jad仍然不能反编译,提示attach source的时候
当安装jad仍然不能反编译,提示attach source的时候,其实是当前workspace有问题了: 所使用的workspace目录下.metadata\.mylyn会出现一个.tasks.xml ...
- python_10(模块与包)
第1章 模块 1.1 模块的种类 1.2 定义 1.3 作用 1.4 导入及使用 1.4.1 import 1.4.2 测试一: 1.4.3 测试二: 1.4.4 测试三: 1.4.5 小结 1.4. ...
- Vue checkbox默认值改变
<label><input v-bind:true-value="1" v-bind:false-value="0" type=" ...