ZROI #365. 【2018普转提day18专题】嘤嘤嘤嘤
ZROI #365. 【2018普转提day18专题】嘤嘤嘤嘤
直接放代码
具体做法见注释
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<cmath>
#include<iostream>
#include<queue>
#include<string>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<long long,long long> pll;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define rep(i,j,k) for(register int i=(int)(j);i<=(int)(k);i++)
#define rrep(i,j,k) for(register int i=(int)(j);i>=(int)(k);i--)
ll read(){
ll x=0,f=1;char c=getchar();
while(c<'0' || c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0' && c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int maxn=5050,maxm=1000100;
int n,m,T;
int ok[maxm],v[maxn],rk[maxm],tv[maxn];
double ans,base,f[maxn][2];
int head[maxn],to[maxn*2],nxt[maxn*2],tot;
void addedge(int x,int y){
to[++tot]=y;nxt[tot]=head[x];head[x]=tot;
to[++tot]=x;nxt[tot]=head[y];head[y]=tot;
}
//f[u][0]表示以u为根的子树内部最大收益
//f[u][1]表示以u为根的子树内部并且有一条链以u为一个端点的最大收益
void dfs(int u,int pa){
f[u][0]=0;f[u][1]=tv[u]-base;
double nw=0;
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(v==pa) continue;
dfs(v,u);
f[u][0]=max(f[u][0]+f[v][0],f[u][1]+f[v][1]+base);
//后一个表示u连向v,并且因为上面减了一次base,v里面减了一次 所以我们得加回来
//这时候经过u的链对于u而言有两条出边
f[u][1]=max(f[u][1]+f[v][0],nw+f[v][1]+tv[u]);
//后一个表示u连向v的收益,即v前面的儿子全都不连向u
//这时候经过u的链对于u而言有一条出边
nw+=f[v][0];
}
f[u][0]=max(nw,max(f[u][0],f[u][1]));
}
bool pd(double x){
base=x;dfs(1,0);
return f[1][0]>=x;
}
int main(){
n=read(),m=read();
rep(i,1,n) v[i]=read(),ok[m-v[i]-1]=1;
rep(i,1,n-1){
int x=read(),y=read();
addedge(x,y);
}
T=read();ok[T]=1;
rep(i,0,T) rk[i]=i;
random_shuffle(rk,rk+1+T);
rep(i,0,T){
int &nw=rk[i];
if(!ok[nw]) continue;
rep(k,1,n){
tv[k]=v[k]+nw;
if(tv[k]>=m) tv[k]-=m;
}
if(!pd(ans)) continue;
double l=ans,r=n*m*1.0/2;
while(r-l>1e-7){
double md=(l+r)/2;
if(pd(md)) l=md,ans=md; else r=md;
}
}
printf("%.7lf\n",ans);
return 0;
}
Review
为什么这么想?
首先是二分答案分数规划,这很显然
关键在于把\(\frac {S} {K+1} \ge Ans\)变成\(S-K \cdot Ans \ge Ans\)
然后就是每选一条链的代价为Ans,并且最终收益大于等于Ans
这样就可以树形dp了
ZROI #365. 【2018普转提day18专题】嘤嘤嘤嘤的更多相关文章
- ZROI #364. 【2018普转提day18专题】嘤嘤嘤
ZROI #364. [2018普转提day18专题]嘤嘤嘤 直接贴代码 具体见注释 #include<stdio.h> #include<cstring> #include& ...
- ZR普转提2
ZR普转提2 A 谢谢刁神教我A题 刚开始读错题了,以为是一个不可做的数位DP,然后就暴力滚粗 直到问了问刁神,发现自己题意是错的 然后成了比较简单的题目 直接暴力枚举每一位填什么,剩下的位数的数字都 ...
- ZR9.8普转提
ZR9.8普转提 A,B 打过的CF原题,不管了 C 确认过眼神,是我不会写的DP, 发现这个题目要求的过程类似与一个所有括号都不一样的括号匹配的过程 但是限制条件非常多,有点无从下手的感觉 我们设\ ...
- 普转提——有趣的数,欢乐ABC,打游戏
有趣的数——构造符合条件的数 给你一个区间,问有多少个数符合每一位中,只有一个数字和其他数字不同,也就是其他数字都相同,有且只有一个异类: 数据范围是1e16: 因为只考虑数量而不用管大小: 只要0到 ...
- ZROI2018普转提day6t1
传送门 分析 记录区间最大值,线段树上二分找比这个点大的最靠前位置即可 代码 #include<iostream> #include<cstdio> #include<c ...
- ZROI2018普转提day6t3
传送门 分析 居然卡哈希数,万恶的出题人...... 感觉我这个方法似乎比较呆,我的代码成功成为了全网最慢的代码qwq 应该是可以直接哈希的 但由于我哈希学的不好又想练练线段树维护哈希,于是就写了个线 ...
- ZROI2018普转提day7t1
传送门 分析 一道有意思的小题... 我们发现如果$(1,1)$为白色,则将其变为白色需要偶数次操作,而如果为黑色则需要奇数次操作 我们知道要让A赢需要奇数次操作,所以我们只需要判断$(1,1)$的颜 ...
- ZROI2018普转提day7t2
传送门 分析 首先我们不难想到我们一定可以将每一个点分开算,然后看这个点被几个矩形包含 于是对于位置为$(i,j)$的点它被包含的次数为$i * (n-i+1) * j * (m-j+1)$ 这个式子 ...
- ZROI2018普转提day1t4
传送门 分析 就是飞飞侠这道题...... 我们可以将这张图建成好几层,每一层可以向下一层的上下左右无代价移动,而对于每个点如果付b[i][j]的代价就可以走到比它高a[i][j]的层上.我们用这种方 ...
随机推荐
- 操作系统:Bochs 2.6.8的配置文件bochsrc.bxrc修改
由于现在Bochs 2.6.8相比之前有些改动,之前的配置文件不能直接运行,针对配置文件需要有些修改. 1. 配置文件 ######################################## ...
- Swing项目编译成exe,并且打包成安装文件(一)
我们一般用java做Swing项目的时候一般都是只能在Myeclipse里面运行,那么怎么把我们的项目打包成exe可以直接双击运行呢? 初始工作:为了不让用户安装java环境,所以我们先新建一个文件夹 ...
- Duplicate files copied in APK META-INF/DEPENDENCIES
在app的目录下找到build.gradle 这个文件,在android标签的最后面加入以下信息: packagingOptions { exclude 'META-INF/DEPENDENCIES' ...
- java.lang.Exception: Socket bind failed: [730048] 端口被占用
错误提示如下: org.apache.coyote.http11.Http11AprProtocol init 严重: Error initializing endpoint java.lang.Ex ...
- 使用diskpart命令修复U盘分区
前段时间在论坛上讨论封装PE到u盘里热闹的,就想自己也封装一个,随便下载了一个WIN7的PE封装后发现还不错,本来就是做测试用的,测试完了就想把u盘在恢复成以前的样子,可是发现恢复并不是这么容易 如下 ...
- June 25,2014---->Binder(IPC),Dalvik ,DEX/ODEX
1.Binder(IPC) Linux进程之间要能够互相通信,从而共享资源和信息.所以,操作系统内核必须提供进程间的通信机制(IPC,Inter-Process Communication). IPC ...
- BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞
BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞 Description 给出一个N个顶点.M条边的无向图,边(u,v)有权值w(u,v),顶点i也有 ...
- SSH框架中hibernate 出现 user is not mapped 问题
SSH框架中hibernate 出现 user is not mapped 问题 在做SSH框架整合时,在进行DAO操作时.这里就只调用了chekUser()方法.运行时报 user is ...
- Windows Vista for Developers——第四部分:用户帐号控制(User Account Control,UAC)
作者:Kenny Kerr 翻译:Dflying Chen 原文:http://weblogs.asp.net/kennykerr/archive/2006/09/29/Windows-Vista-f ...
- 如何给容器服务的Docker增加数据盘
如何给容器服务的Docker增加数据盘 摘要: 我们知道Docker的数据是通过联合文件系统的方式存储到磁盘上,当需要在机器上运行的容器或者镜像的数量不断增加时,有可能磁盘的大小不再满足需求,这个时候 ...