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 ...
随机推荐
- hihocoder 1582 : Territorial Dispute(凸包)
传送门 题意 略 分析 求一个凸包即可 1.所有点在凸包上且点数>3,令凸包上第1,3点为'A',其余点为'B' 2.部分点在凸包上,令凸包上点为'A',其余点为'B' 3.无可行情况 附代码 ...
- bzoj 3811: 玛里苟斯【线性基+期望dp】
这个输出可是有点恶心啊--WA*inf,最后抄了别人的输出方法orz 还有注意会爆long long,要开unsigned long long 对于k==1,单独考虑每一位i,如果这一位为1则有0.5 ...
- 为什么使用Stylus
CSS预处理器的出现大大的提高了前端开发的效率和逼格,它让CSS可编程化.LESS和Sass/SCSS是两种最为常见的预处理器,拥有大量的用户基数,数目庞杂的第三方库.然而,还有一种预处理器并未引起足 ...
- Hexo瞎折腾系列(6) - 将博客同时部署到Github和Coding
前言 由于本人只是将Hexo博客同时部署到 Github 和 Coding.net ,所以这里只介绍怎么同时部署到这两个网站的pages. 之所以选择这两个网站,是因为国外用户可以访问 Github, ...
- 暴力 BestCoder Round #41 1001 ZCC loves straight flush
题目传送门 /* m数组记录出现的花色和数值,按照数值每5个搜索,看看有几个已满足,剩下 5 - cnt需要替换 ╰· */ #include <cstdio> #include < ...
- mongoDB内置文档定义
在最近的设计数据库时,犯了一个低级的错误,就是设置内置文档是定义了错误了,导致数据取不出,去找了很多资料都无法解决.最后看了一了一下自己设置的model文件.配置错误,所以导致数据取不出了. 数据库时 ...
- Split方法,拆分字符串后,去除返回的空值
我们在使用Split('')方法的时候,根据指定的 '字符' 对字符串进行拆分,当'字符’为最后一个,将会拆分一个空值进行返回. 这个时候我们可以使用 string.Split(new ch ...
- window服务 调试步骤
方法一: 1.编译windows服务项目工程 2.把服务注册到系统服务上 3.在visual studio 编辑器中,打断点,用 Debug 进程调试 方法二: 在Onstart 方法中,加上 De ...
- Spring的校验(Validator)
使用Spring校验的大体流程: 最首先要有配置文件xml的支持(spring_validate.xml).(当然在web.xml中要有对该xml的体现) <beans xmlns=" ...
- JDK NIO SelectionKey bug
此bug项目中使用elasticSearch中出现的,原因是,nio事件选择器,在特性内核下以及jdk6版本中,出现不hold线程,死循环获取事件的bug,导致cup使用率过高: 此bug在官网已被修 ...