CF1067D Computer Game
题意:
有 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:
#include<bits/stdc++.h>
#define rep(i,x,y) for (int i=(x);i<=(y);i++)
#define ll long long
#define db double using namespace std; const int N=1e5+;
int n,m; db mx,ans; ll t,cnt; const db eps=1e-;
const int dcmp(db x){return fabs(x)<eps?:x<-eps?-:;} struct line{
db k,b;
line(db k=,db b=):k(k),b(b){}
friend bool operator < (line x,line y){
return dcmp(x.k-y.k)==?dcmp(x.b-y.b)>:dcmp(x.k-y.k)<;
}
}p[N],q[N]; struct mat{
int n,m; db a[][];
mat(int n=,int m=):n(n),m(m){memset(a,,sizeof(a));}
friend mat operator * (mat x,mat y){
mat z(x.n,y.m);
rep (i,,z.n-)
rep (j,,z.m-)
rep (k,,x.m-) z.a[i][j]+=x.a[i][k]*y.a[k][j];
return z;
}
}A,B,trs[]; db inter_x(line x,line y){return (y.b-x.b)/(x.k-y.k);} int main(){
scanf("%d%lld",&n,&t);
rep (i,,n){
int a,b; db c;
scanf("%d%d%lf",&a,&b,&c);
mx=max(mx,b*c),p[i]=line(c,a*c);
}
sort(p+,p++n);
rep (i,,n) if (i==||dcmp(p[i].k-p[i-].k)!=) q[++m]=p[i];
n=;
rep (i,,m){
while (n>=&&dcmp(inter_x(q[i],p[n])-inter_x(p[n],p[n-]))<=) n--;
p[++n]=q[i];
}
cnt=;
A=mat(,); A.a[][]=;
for (int i=;i<=n&&cnt<t;i++){
db R=mx*cnt-A.a[][];
while (i<n&&dcmp(inter_x(p[i],p[i+])-R)<=) i++;
if (i<n) R=inter_x(p[i],p[i+]);
trs[]=mat(,);
trs[].a[][]=-p[i].k,trs[].a[][]=p[i].k*mx,trs[].a[][]=p[i].b;
trs[].a[][]=trs[].a[][]=trs[].a[][]=;
rep (j,,) trs[j]=trs[j-]*trs[j-];
for (int j=;~j;j--)
if (cnt+(1ll<<j)<t){
B=trs[j]*A;
if (i==n||dcmp((cnt+(1ll<<j))*mx-B.a[][]-R)<=) A=B,cnt+=1ll<<j;
}
cnt++,A=trs[]*A;
}
printf("%.10lf\n",A.a[][]);
return ;
}
CF1067D Computer Game的更多相关文章
- [CF1067D]Computer Game[凸包/斜率优化+倍增+矩阵乘法]
题意 你有 \(n\) 个任务,初始收益为 \(a\) ,共 \(t\) 轮游戏,每轮可以选择完成一个任务(可以做多次),完成之后可以给任意任务升级,升级之后的任务收益为 \(b\) ,每个任务还有完 ...
- CF1067D. Computer Game(斜率优化+倍增+矩阵乘法)
题目链接 https://codeforces.com/contest/1067/problem/D 题解 首先,如果我们获得了一次升级机会,我们一定希望升级 \(b_i \times p_i\) 最 ...
- 共享文件夹:The user has not been granted the requested logon type at this computer
场景重现 今天做一个项目测试,要用到虚拟机,于是在虚拟机(XP 32)上新建了一个共享的文件夹.然后我在Win7 机器上访问它得到如下的error 消息:
- Computer assisted surgery
Computer assisted surgery (CAS) represents a surgical concept and set of methods, that use computer ...
- Computer vision labs
积累记录一些视觉实验室,方便查找 1. 多伦多大学计算机科学系 2. 普林斯顿大学计算机视觉和机器人实验室 3. 牛津大学Torr Vision Group 4. 伯克利视觉和学习中心 Pro ...
- 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 ...
- 数论 - Vanya and Computer Game
Vanya and his friend Vova play a computer game where they need to destroy n monsters to pass a level ...
- A Taxonomy of Computer Organizations
COMPUTER OR GANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION
- [转载]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 ...
随机推荐
- vim编辑器基本操作介绍
vim编辑器基本操作介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 可能很多小伙伴都听说过vi编辑器或是vim编辑器.它们是Unix和Linux世界最流行的编辑器之一,他们的特 ...
- transform 属性之 transform-origin与顺序问题
transform属性之 transform-origin 针对transform中的几种值的先后顺序 transform值的先后顺序: 注意: 当我们在旋转后再进行位移的时候,其实是按照旋转后的坐标 ...
- bzoj千题计划279:bzoj4591: [Shoi2015]超能粒子炮·改
http://www.lydsy.com/JudgeOnline/problem.php?id=4591 最后的式子合并同类项 #include<cstdio> #include<i ...
- 流媒体技术学习笔记之(七)进阶教程OBS参数与清晰度流畅度的关系
源码地址:https://github.com/Tinywan/PHP_Experience 很多主播问过OBS的参数到底什么影响画质,到底什么影响流畅度,那么本篇教程尽量用通俗的语言解释下一些重要参 ...
- nodejs安装zmq出错
想用zmq来做进程间通信,在Windows下.Centos下安装成功.记录如下: 一.Windows安装zmq 直接 npm install zmq 成功就成功. 不成功的话估计是报"未能 ...
- [转载]必须Mark!最佳HTML5应用开发工具推荐
http://www.csdn.net/article/2014-04-25/2819503-10-html5-tools-worth-checking-out/2 摘要:HTML5自诞生以来,作为新 ...
- 一些CSS3的乐趣 - 工作也能发现乐的源头
中秋节 translate 前些日子做一个中秋节的专题,主要就是写一个效果,月亮滚动,花瓣飘落.具体代码如下: .icons {z-index:10088; position:absolute; -w ...
- 编写安全的API接口
HTTPS接口参数加密签名设计思路 数名 类型 必选 描述 _appid string 是 调用方身份ID,接口提供方用此来识别调不同的调用者,该参数是API基本规范的一部分,请详见API公共规范. ...
- SVM Kernel Functions
==================================================================== This article came from here. Th ...
- 总结---Python中的面向对象!
面向对象这种编程的范式每个语言都是通用的,这里总结一下python的面向对象语法,主要包含以下几个方面! 1 基本语法 # 定义类 class Person(object): n = 10 # 类变量 ...