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专题】嘤嘤嘤嘤的更多相关文章

  1. ZROI #364. 【2018普转提day18专题】嘤嘤嘤

    ZROI #364. [2018普转提day18专题]嘤嘤嘤 直接贴代码 具体见注释 #include<stdio.h> #include<cstring> #include& ...

  2. ZR普转提2

    ZR普转提2 A 谢谢刁神教我A题 刚开始读错题了,以为是一个不可做的数位DP,然后就暴力滚粗 直到问了问刁神,发现自己题意是错的 然后成了比较简单的题目 直接暴力枚举每一位填什么,剩下的位数的数字都 ...

  3. ZR9.8普转提

    ZR9.8普转提 A,B 打过的CF原题,不管了 C 确认过眼神,是我不会写的DP, 发现这个题目要求的过程类似与一个所有括号都不一样的括号匹配的过程 但是限制条件非常多,有点无从下手的感觉 我们设\ ...

  4. 普转提——有趣的数,欢乐ABC,打游戏

    有趣的数——构造符合条件的数 给你一个区间,问有多少个数符合每一位中,只有一个数字和其他数字不同,也就是其他数字都相同,有且只有一个异类: 数据范围是1e16: 因为只考虑数量而不用管大小: 只要0到 ...

  5. ZROI2018普转提day6t1

    传送门 分析 记录区间最大值,线段树上二分找比这个点大的最靠前位置即可 代码 #include<iostream> #include<cstdio> #include<c ...

  6. ZROI2018普转提day6t3

    传送门 分析 居然卡哈希数,万恶的出题人...... 感觉我这个方法似乎比较呆,我的代码成功成为了全网最慢的代码qwq 应该是可以直接哈希的 但由于我哈希学的不好又想练练线段树维护哈希,于是就写了个线 ...

  7. ZROI2018普转提day7t1

    传送门 分析 一道有意思的小题... 我们发现如果$(1,1)$为白色,则将其变为白色需要偶数次操作,而如果为黑色则需要奇数次操作 我们知道要让A赢需要奇数次操作,所以我们只需要判断$(1,1)$的颜 ...

  8. ZROI2018普转提day7t2

    传送门 分析 首先我们不难想到我们一定可以将每一个点分开算,然后看这个点被几个矩形包含 于是对于位置为$(i,j)$的点它被包含的次数为$i * (n-i+1) * j * (m-j+1)$ 这个式子 ...

  9. ZROI2018普转提day1t4

    传送门 分析 就是飞飞侠这道题...... 我们可以将这张图建成好几层,每一层可以向下一层的上下左右无代价移动,而对于每个点如果付b[i][j]的代价就可以走到比它高a[i][j]的层上.我们用这种方 ...

随机推荐

  1. Looksery Cup 2015 C. The Game Of Parity —— 博弈

    题目链接:http://codeforces.com/problemset/problem/549/C C. The Game Of Parity time limit per test 1 seco ...

  2. Ansible 动态获取主机列表

    参考文献: http://www.linuxidc.com/Linux/2016-12/138111.htm 附加 这个 include_vars 变量,可以 动态分别环境或者其他条件- hosts: ...

  3. linux系统配置之网络配置(centos)

    CentOS---网络配置详解 一.配置文件详解在RHEL或者CentOS等Redhat系的Linux系统里,跟网络有关的主要设置文件如下: /etc/host.conf         配置域名服务 ...

  4. hdu5530

    分治ntt 考虑从添加i,放在j位置,那么1->j是一个连通块,j+1->i和1->j不连通,那么我们可以列出式子dp[i]=∑j=1->i dp[i-j]*A(i-1,j-1 ...

  5. Asset Catalog Help (十)---Specifying a Resizable Area of an Image

    Specifying a Resizable Area of an Image Use the Xcode Slicing feature to specify the dimensions of a ...

  6. SSE2 Intrinsics各函数介绍

    http://blog.csdn.net/fengbingchun/article/details/18460199

  7. OGNL和类型转换

    转载 JavaWeb -- Struts 数据传输:OGNL和类型转换 1. 数据传输:OGNL和类型转换 OGNL和struts2 OGNL:Object-Graph Navigation Lang ...

  8. Validtion

    今天在使用Validation框架实现验证时,出现以上的错误.查询资料后发现“validation-config.dtd”这个文件没有导入自己的工程,才会出现这样的错误. 将从文件导入后果然解决了问题 ...

  9. UVa 658 It's not a Bug, it's a Feature! (状态压缩+Dijstra)

    题意:首先给出n和m,表示有n个bug和m个补丁.一开始存在n个bug,用1表示一个bug存在0表示不存在,所以一开始就是n个1,我们的目的是要消除所有的bug, 所以目标状态就是n个0.对于每个补丁 ...

  10. python-codecs.open()使用举例

    代码: import codecs from unidecode import unidecode def main(): fullFilename="123.txt" inFID ...