BZOJ 1758: [Wc2010]重建计划 [暂时放弃]
今天晚上思维比较乱,以后再写写吧
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+,INF=1e9+;
double eps=1e-;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,L,U,a,b;
double w,maxVal,ans;
struct edge{
int v,ne;
double w;
}e[N<<];
int h[N],cnt;
inline void ins(int u,int v,double w){
cnt++;
e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;
cnt++;
e[cnt].v=u;e[cnt].w=w;e[cnt].ne=h[v];h[v]=cnt;
} int f[N],size[N],all,vis[N],root;
void dfsRt(int u,int fa){
size[u]=;f[u]=;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v;
if(vis[v]||v==fa) continue;
dfsRt(v,u);
size[u]+=size[v];
f[u]=max(f[u],size[v]);
}
f[u]=max(f[u],all-size[u]);
if(f[u]<f[root]) root=u;
} int q[N],head,tail,deep[N];
double val[N],mx[N];
bool visit[N];
void bfs(double g){
while(head<=tail){
int u=q[head++];
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v;
if(vis[v]) continue;
if(!visit[v]){
visit[v]=;
q[++tail]=v;
deep[v]=deep[u]+;
val[v]=val[u]+e[i].w-g;
}
}
}
}
double c[N];
int m;
bool dp(int n){//printf("dp %d %d\n",n,n+m);
if(m+n<L) return false;
head=;tail=;
int l=max(L-n,),r=U-n;
for(int i=l;i<=r&&i<=m;i++){//printf("ins %d\n",i);
while(head<=tail&&c[q[tail]]<c[i]) tail--;
q[++tail]=i;
}
for(int i=n;i>=;i--){//printf("i %d %lf\n",i,mx[i]);
int l=L-i,r=U-i;//printf("lala %d %d\n",l,r);
while(head<=tail&&q[head]<l) head++;
while(head<=tail&&c[r]>c[q[tail]]) tail--;
q[++tail]=r;
//printf("qqq %d %d %lf\n",head,tail,c[q[head]]);
if(head<=tail&&c[q[head]]+mx[i]>=) return true;
}
return false;
} bool check(int u,double g){//printf("\ncheck %d %lf\n",u,g);
for(int i=;i<=m;i++) c[i]=-INF;m=;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v;
if(vis[v]) continue; //printf("\nv %d\n",v);
head=;tail=;
q[++tail]=v;
deep[v]=;val[v]=e[i].w-g;
bfs(g);
//for(int i=1;i<tail;i++) //printf("%lf ",val[i]);puts(""); for(int i=;i<=deep[q[tail]];i++) mx[i]=-INF;
int id;
for(int i=;i<=tail;i++)
id=q[i],mx[deep[id]]=max(mx[deep[id]],val[id]),visit[id]=;
//for(int i=1;i<=maxDeep;i++) printf("mx %d %lf \n",i,mx[i]); if(dp(deep[q[tail]])) return true;
m=max(m,deep[q[tail]]);
for(int i=;i<=deep[q[tail]];i++) c[i]=max(c[i],mx[i]);
}
return false;
} void dfsSol(int u){//printf("dfsSol %d\n",u);if(u!=1) return;
vis[u]=;
double l=ans,r=maxVal;//printf("lr %lf %lf\n\n",l,r);
while(r-l>eps){
double mid=(l+r)/;
if(check(u,mid)) l=mid;
else r=mid;
}
ans=max(ans,l); for(int i=h[u];i;i=e[i].ne)
if(!vis[e[i].v]){
root=;all=size[e[i].v];
if(size[e[i].v]<L) continue;
dfsRt(e[i].v,);
dfsSol(root);
}
}
int main(){
freopen("in","r",stdin);
//freopen("out","w",stdout);
n=read();L=read();U=read();
for(int i=;i<n;i++)
a=read(),b=read(),w=read(),ins(a,b,w),maxVal=max(maxVal,w);
root=;f[]=INF;all=n;
dfsRt(,);
dfsSol(root);
printf("%.3lf",ans);
}
BZOJ 1758: [Wc2010]重建计划 [暂时放弃]的更多相关文章
- bzoj 1758 [Wc2010]重建计划 分数规划+树分治单调队列check
[Wc2010]重建计划 Time Limit: 40 Sec Memory Limit: 162 MBSubmit: 4345 Solved: 1054[Submit][Status][Disc ...
- bzoj 1758: [Wc2010]重建计划
Description Input 第 一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案 ...
- BZOJ.1758.[WC2010]重建计划(分数规划 点分治 单调队列/长链剖分 线段树)
题目链接 BZOJ 洛谷 点分治 单调队列: 二分答案,然后判断是否存在一条长度在\([L,R]\)的路径满足权值和非负.可以点分治. 对于(距当前根节点)深度为\(d\)的一条路径,可以用其它子树深 ...
- BZOJ 1758: [Wc2010]重建计划 01分数规划+点分治+单调队列
code: #include <bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in", ...
- BZOJ1758: [Wc2010]重建计划
题解: 这题我居然做了一星期?... 平均值的极值其实也可以算是一种分数规划,只不过分母上b[i]=1 然后我们就可以二分这个值.类似与 HNOI最小圈 如果没有 链的长度的限制的话,我们直接两遍df ...
- 洛谷 P4292 [WC2010]重建计划 解题报告
P4292 [WC2010]重建计划 题目描述 \(X\)国遭受了地震的重创, 导致全国的交通近乎瘫痪,重建家园的计划迫在眉睫.\(X\)国由\(N\)个城市组成, 重建小组提出,仅需建立\(N-1\ ...
- [WC2010]重建计划 长链剖分
[WC2010]重建计划 LG传送门 又一道长链剖分好题. 这题写点分治的人应该比较多吧,但是我太菜了,只会长链剖分. 如果你还不会长链剖分的基本操作,可以看看我的长链剖分总结. 首先一看求平均值最大 ...
- BZOJ 1758 / Luogu P4292 [WC2010]重建计划 (分数规划(二分/迭代) + 长链剖分/点分治)
题意 自己看. 分析 求这个平均值的最大值就是分数规划,二分一下就变成了求一条长度在[L,R]内路径的权值和最大.有淀粉质的做法但是我没写,感觉常数会很大.这道题可以用长链剖分做. 先对树长链剖分. ...
- 【bzoj1758】[Wc2010]重建计划
Description Input 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案, ...
随机推荐
- Zabbix安装客户端agent(windows和Centos7)
上一篇简单的介绍了怎么搭建Zabbix监控服务端,接下来给大家介绍怎么在windows和Centos7上安装zabbix_agent客户端. Zabbix是一个基于WEB界面的提供分布式系统监视以及网 ...
- Linux shell编程命令-Linux基础环境命令学习笔记
1.正则表达式 1)^开始 *前一个字符重复0次以上 + 1次以上 ? 0次或者1次 . 一个任意字符(.*连用) {m,n} m到n次 [0-9][a-z] 任意数字或字母 $结束字符 2)sed和 ...
- input框type=file设置cursor:pointer的问题
为了让美化上传文件框,设置了cursor:pointer;,然而不起作用,然后百度找到了解决方法,设置font-size:0,这样就可以了.
- ASP.NET没有魔法——ASP.NET OAuth、jwt、OpenID Connect
上一篇文章介绍了OAuth2.0以及如何使用.Net来实现基于OAuth的身份验证,本文是对上一篇文章的补充,主要是介绍OAuth与Jwt以及OpenID Connect之间的关系与区别. 本文主要内 ...
- PHP网站从Apache转移到Nginx后产生404错误的原因和解决办法
原案例分析: 1.原来的网站在wamp环境下搭建完成,一切正常,上传到虚拟主机环境为lnmp,结果访问时可以打开主页,然后点其他页面全部报404错误: 2.经分析得出原因:原网站环境为wamp使用了伪 ...
- nginx版本如何选择?
生产环境使用Stable version:最新稳定版,现在最新的版本是nginx-1.8.1 注意各版本的区别:Nginx官网提供了三个类型的版本 1.Mainline version:Mainlin ...
- DedeCMS实现自定义表单提交后发送指定QQ邮箱法
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=monline_3_dg&wd=dedecms 邮箱&oq=d ...
- CCF系列之模板生成系统( 201509-3 )
试题名称: 模板生成系统 试题编号: 201509-3 时间限制: 1.0s 内存限制: 256.0MB 问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的 ...
- Diffie-Hellman密钥交换
Diffie-Hellman密钥交换(DHKE)是由Whitfield Diffie和Martin Hellman在1976年提出的.密钥交换方案提供了实际中密钥分配问题的解决方案,即允许双方通过不安 ...
- centos下配置sftp且限制用户访问目录[转]
第一步:创建sftp服务用户组,创建sftp服务根目录 groupadd sftp #此目录及上级目录的所有者(owner)必须为root,权限不高于755,此目录的组最好设定为sftp mkdir ...