link

题意:

有 n 道题,每个题可以做很多次但只能领悟一次,一开没有领悟任何题。

对于第 i 个题,正确率为 $p_i$ 。领悟之前,做对这个题可以提升 $a_i$ 的能力值;领悟之后,做对这个题可以提升 $b_i$ 的能力值。(保证 $a_i<b_i$ )

做对一个题,还可以领悟任意一个题(任选)。做错题后,什么都不会发生。

现在可以做 t 次题(同一题算多次),问最大能力值? $n\leq 10^5,t\leq 10^{10}$

题解:

【一些吐槽】 由于考试数据水现场各种水过。大家都猜了一个错误的结论:领悟之前和之后都各只做一道题。

事实上领悟之后确实是只做一道题,选的一定是 $b_ip_i$ 最大的那个题,记这个值为 $mx$ ,但领悟之前就不是了,需要 dp 。

设 $f_t$ 表示 t 时刻的最大能力值,方程$$\begin{aligned}f_{t+1}&=\max \{p_i\times (a_i+mx\times t)+(1-p_i)\times f_t\}\\f_{t+1}&=\max \{p_ia_i+p_i\times(mx\times t-f_t)\}+f_t\end{aligned}$$

这里有个性质:由于一轮的贡献不会超过 mx ,所以有$$\begin{aligned}f_{t+1}-f_t &\leq mx \\ \Longleftrightarrow t\times mx-f_t &\leq (t+1)\times mx-f_{t+1}\end{aligned}$$

即 $mx\times t-f_t$ 是单调不减的。

那么把 $p_ia_i$ 看成截距, $p_i$ 看成斜率, $f$ 的转移就相当于取若干一次函数的最大值,求下凸壳即可。 dp 的时候从左往右扫每条直线,用矩阵乘法和倍增优化转移。复杂度 $\mathcal{O}(n\log T)$ 。

code:

  1. #include<bits/stdc++.h>
  2. #define rep(i,x,y) for (int i=(x);i<=(y);i++)
  3. #define ll long long
  4. #define db double
  5.  
  6. using namespace std;
  7.  
  8. const int N=1e5+;
  9. int n,m; db mx,ans; ll t,cnt;
  10.  
  11. const db eps=1e-;
  12. const int dcmp(db x){return fabs(x)<eps?:x<-eps?-:;}
  13.  
  14. struct line{
  15. db k,b;
  16. line(db k=,db b=):k(k),b(b){}
  17. friend bool operator < (line x,line y){
  18. return dcmp(x.k-y.k)==?dcmp(x.b-y.b)>:dcmp(x.k-y.k)<;
  19. }
  20. }p[N],q[N];
  21.  
  22. struct mat{
  23. int n,m; db a[][];
  24. mat(int n=,int m=):n(n),m(m){memset(a,,sizeof(a));}
  25. friend mat operator * (mat x,mat y){
  26. mat z(x.n,y.m);
  27. rep (i,,z.n-)
  28. rep (j,,z.m-)
  29. rep (k,,x.m-) z.a[i][j]+=x.a[i][k]*y.a[k][j];
  30. return z;
  31. }
  32. }A,B,trs[];
  33.  
  34. db inter_x(line x,line y){return (y.b-x.b)/(x.k-y.k);}
  35.  
  36. int main(){
  37. scanf("%d%lld",&n,&t);
  38. rep (i,,n){
  39. int a,b; db c;
  40. scanf("%d%d%lf",&a,&b,&c);
  41. mx=max(mx,b*c),p[i]=line(c,a*c);
  42. }
  43. sort(p+,p++n);
  44. rep (i,,n) if (i==||dcmp(p[i].k-p[i-].k)!=) q[++m]=p[i];
  45. n=;
  46. rep (i,,m){
  47. while (n>=&&dcmp(inter_x(q[i],p[n])-inter_x(p[n],p[n-]))<=) n--;
  48. p[++n]=q[i];
  49. }
  50. cnt=;
  51. A=mat(,); A.a[][]=;
  52. for (int i=;i<=n&&cnt<t;i++){
  53. db R=mx*cnt-A.a[][];
  54. while (i<n&&dcmp(inter_x(p[i],p[i+])-R)<=) i++;
  55. if (i<n) R=inter_x(p[i],p[i+]);
  56. trs[]=mat(,);
  57. trs[].a[][]=-p[i].k,trs[].a[][]=p[i].k*mx,trs[].a[][]=p[i].b;
  58. trs[].a[][]=trs[].a[][]=trs[].a[][]=;
  59. rep (j,,) trs[j]=trs[j-]*trs[j-];
  60. for (int j=;~j;j--)
  61. if (cnt+(1ll<<j)<t){
  62. B=trs[j]*A;
  63. if (i==n||dcmp((cnt+(1ll<<j))*mx-B.a[][]-R)<=) A=B,cnt+=1ll<<j;
  64. }
  65. cnt++,A=trs[]*A;
  66. }
  67. printf("%.10lf\n",A.a[][]);
  68. return ;
  69. }

CF1067D Computer Game的更多相关文章

  1. [CF1067D]Computer Game[凸包/斜率优化+倍增+矩阵乘法]

    题意 你有 \(n\) 个任务,初始收益为 \(a\) ,共 \(t\) 轮游戏,每轮可以选择完成一个任务(可以做多次),完成之后可以给任意任务升级,升级之后的任务收益为 \(b\) ,每个任务还有完 ...

  2. CF1067D. Computer Game(斜率优化+倍增+矩阵乘法)

    题目链接 https://codeforces.com/contest/1067/problem/D 题解 首先,如果我们获得了一次升级机会,我们一定希望升级 \(b_i \times p_i\) 最 ...

  3. 共享文件夹:The user has not been granted the requested logon type at this computer

    场景重现 今天做一个项目测试,要用到虚拟机,于是在虚拟机(XP 32)上新建了一个共享的文件夹.然后我在Win7 机器上访问它得到如下的error 消息:

  4. Computer assisted surgery

    Computer assisted surgery (CAS) represents a surgical concept and set of methods, that use computer ...

  5. Computer vision labs

    积累记录一些视觉实验室,方便查找 1.  多伦多大学计算机科学系 2.  普林斯顿大学计算机视觉和机器人实验室 3.  牛津大学Torr Vision Group 4.  伯克利视觉和学习中心 Pro ...

  6. Computer Vision: OpenCV, Feature Tracking, and Beyond--From <<Make Things See>> by Greg

    In the 1960s, the legendary Stanford artificial intelligence pioneer, John McCarthy, famously gave a ...

  7. 数论 - Vanya and Computer Game

    Vanya and his friend Vova play a computer game where they need to destroy n monsters to pass a level ...

  8. A Taxonomy of Computer Organizations

    COMPUTER OR GANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION

  9. [转载]Three Trending Computer Vision Research Areas, 从CVPR看接下来几年的CV的发展趋势

    As I walked through the large poster-filled hall at CVPR 2013, I asked myself, “Quo vadis Computer V ...

随机推荐

  1. Linux通过ssh登录其他服务器,不用输入密码

    有A(192.168.10.163)和B(192.168.10.164)两台服务器,为了使A服务器通过SSH连接B服务器时,免密登录,做以下操作. 1. 登录A(192.168.10.163)服务器( ...

  2. Docker CE的安装 与镜像加速

    Docker CE 的安装与镜像加速 Docker CE是docker的开源版本 CENTOS 安装Docker CE 系统要求: 操作系统需要使用centos7() centos-extras库 必 ...

  3. Struts2_day03

    一.上节回顾 1 在action获取表单提交数据 (1)使用ActionContext类获取 (2)使用ServletActionContext类获取 (3)接口注入 2 结果配置 (1)全局结果页面 ...

  4. html5 canvas高级贝塞尔曲线运动动画(好吧这一篇被批的体无完肤!都说看不懂了!没办法加注释了!当然数学不好的我也没办法了,当然这还涉及到一门叫做计算机图形学的学科)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. iOS 6 & iOS 7 的适配笔记

    iOS 6 & iOS 7 的适配 场景1: 没有NavigationController,同时根视图是UIView- (void)viewWillLayoutSubviews{ if ([[ ...

  6. Android利用LocalSocket实现Java端进程与C端进程之间的IPC

    Android是建立在Linux之上的OS,在涉及到安全.网络协议.文件加密等功能时,往往需要通过C语言调用底层API来实现,而如何发出指令让C端执行我们想要的功能,并且在执行之后有返回结果呢,这就需 ...

  7. 在xampp与phpstorm环境下安装xdebug[转]

    XDebug是什么 很多PHP程序员调试使用echo.print_r().var_dump().printf()等,虽然对于有较丰富开发经验的程序员来说这些也已经足够了,他们往往可以在程序执行的过程中 ...

  8. camera驱动框架分析(上)

    前言 camera驱动框架涉及到的知识点比较多,特别是camera本身的接口就有很多,有些是直接连接到soc的camif口上的,有些是通过usb接口导出的,如usb camera.我这里主要讨论前者, ...

  9. async异步注解和aspect切面注解等注解的原理

    在我们使用spring框架的过程中,在很多时候我们会使用@async注解来异步执行某一些方法,提高系统的执行效率.今天我们来探讨下spring是如何完成这个功能的. 1.spring 在扫描bean的 ...

  10. ipsec-tools安装教程

    ipsec-tools最新版本为0.8.2,此处以0.7.3版本为例说明安装和使用过程.可参考ipsec-howto. 安装步骤 ipsec-tools依赖于linux2.6版本内核,在安装ipsec ...