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

直接放代码

具体做法见注释

  1. #include<stdio.h>
  2. #include<cstring>
  3. #include<cstdlib>
  4. #include<algorithm>
  5. #include<vector>
  6. #include<map>
  7. #include<set>
  8. #include<cmath>
  9. #include<iostream>
  10. #include<queue>
  11. #include<string>
  12. using namespace std;
  13. typedef long long ll;
  14. typedef pair<int,int> pii;
  15. typedef long double ld;
  16. typedef unsigned long long ull;
  17. typedef pair<long long,long long> pll;
  18. #define fi first
  19. #define se second
  20. #define pb push_back
  21. #define mp make_pair
  22. #define rep(i,j,k) for(register int i=(int)(j);i<=(int)(k);i++)
  23. #define rrep(i,j,k) for(register int i=(int)(j);i>=(int)(k);i--)
  24. ll read(){
  25. ll x=0,f=1;char c=getchar();
  26. while(c<'0' || c>'9'){if(c=='-')f=-1;c=getchar();}
  27. while(c>='0' && c<='9'){x=x*10+c-'0';c=getchar();}
  28. return x*f;
  29. }
  30. const int maxn=5050,maxm=1000100;
  31. int n,m,T;
  32. int ok[maxm],v[maxn],rk[maxm],tv[maxn];
  33. double ans,base,f[maxn][2];
  34. int head[maxn],to[maxn*2],nxt[maxn*2],tot;
  35. void addedge(int x,int y){
  36. to[++tot]=y;nxt[tot]=head[x];head[x]=tot;
  37. to[++tot]=x;nxt[tot]=head[y];head[y]=tot;
  38. }
  39. //f[u][0]表示以u为根的子树内部最大收益
  40. //f[u][1]表示以u为根的子树内部并且有一条链以u为一个端点的最大收益
  41. void dfs(int u,int pa){
  42. f[u][0]=0;f[u][1]=tv[u]-base;
  43. double nw=0;
  44. for(int i=head[u];i;i=nxt[i]){
  45. int v=to[i];
  46. if(v==pa) continue;
  47. dfs(v,u);
  48. f[u][0]=max(f[u][0]+f[v][0],f[u][1]+f[v][1]+base);
  49. //后一个表示u连向v,并且因为上面减了一次base,v里面减了一次 所以我们得加回来
  50. //这时候经过u的链对于u而言有两条出边
  51. f[u][1]=max(f[u][1]+f[v][0],nw+f[v][1]+tv[u]);
  52. //后一个表示u连向v的收益,即v前面的儿子全都不连向u
  53. //这时候经过u的链对于u而言有一条出边
  54. nw+=f[v][0];
  55. }
  56. f[u][0]=max(nw,max(f[u][0],f[u][1]));
  57. }
  58. bool pd(double x){
  59. base=x;dfs(1,0);
  60. return f[1][0]>=x;
  61. }
  62. int main(){
  63. n=read(),m=read();
  64. rep(i,1,n) v[i]=read(),ok[m-v[i]-1]=1;
  65. rep(i,1,n-1){
  66. int x=read(),y=read();
  67. addedge(x,y);
  68. }
  69. T=read();ok[T]=1;
  70. rep(i,0,T) rk[i]=i;
  71. random_shuffle(rk,rk+1+T);
  72. rep(i,0,T){
  73. int &nw=rk[i];
  74. if(!ok[nw]) continue;
  75. rep(k,1,n){
  76. tv[k]=v[k]+nw;
  77. if(tv[k]>=m) tv[k]-=m;
  78. }
  79. if(!pd(ans)) continue;
  80. double l=ans,r=n*m*1.0/2;
  81. while(r-l>1e-7){
  82. double md=(l+r)/2;
  83. if(pd(md)) l=md,ans=md; else r=md;
  84. }
  85. }
  86. printf("%.7lf\n",ans);
  87. return 0;
  88. }

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. poj 1363 Rails (【栈的应用】 刘汝佳的写法 *学习)

    Rails Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25964   Accepted: 10199 Descripti ...

  2. ckplayer 中的style.swf 中的 style.xml 中的修改方法

    style.swf ---- > style.zip ---- > 解压成文件夹 ---- > 打开style.xml ---- > 修改 最重要的是修改保存style.xml ...

  3. phpcms v9中的$CATEGORYS栏目数组

    首先 如果不能用$CATEGORYS这个数组或掉不出来内容应加入 $CATEGORYS = getcache('category_content_1','commons'); 1.用途 $CATEGO ...

  4. 网页上传FLV视频文件

    上传 flv格式文件一致提示文件类型不允许,是因为CI中的配置文件没有支持这个格式 在 application/config/mimes.php中加入 'flv' => array('video ...

  5. hdu-5728 PowMod(数论)

    题目链接: PowMod Time Limit: 3000/1500 MS (Java/Others)     Memory Limit: 262144/262144 K (Java/Others) ...

  6. python中通过xlwt、xlrd和xlutils操作xls

    xlwt模块用于在内存中生成一个xls/xlsx对象,增加表格数据,并把内存中的xls对象保存为本地磁盘xls文件; xlrd模块用于把本地xls文件加载到内存中,可以读取xls文件的表格数据,查询x ...

  7. SQL Server中查询CPU占用高的SQL语句

    SQL Server中查询CPU占用高的情况,会用到sys.sysprocesses ,dm_exec_sessions ,dm_exec_requests 一.查看当前的数据库用户连接有多少 USE ...

  8. HTML5/jQuery雷达动画图表 图表配置十分简单

    1.HTML5/jQuery雷达动画图表 图表配置十分简单 之前我们介绍过不少形形色色的HTML5图表了,像这款HTML5折线图表Aristochart是一款很不错的折线图表,这款HTML5 Canv ...

  9. 基于IOS下的支付宝SDK的学习与使用——实现产品支付(二)

    首先本篇为作者原创,仅供学习使用,以后会不断完善,精炼.阅读之前请参考  上一篇 上一篇 中详细说明了结合官方支付宝SDK,对工程环境进行的一些配置,实现了支付,本篇重点说明一下,注意事项和原理,主要 ...

  10. Sudo环境变量继承

    sudo中默认配置会重置环境变量,所以使用sudo的时候需要小心这点.如何让sudo继承我们需要的环境变量?有如下两种方法: #sudo visudo 或者 #vi  /etc/sudoers     ...