权限题qwq

以下设值域大小为\(m\)

先考虑枚举攻击力,因为首先攻击力决定每个怪物的攻击次数,然后对于每个怪物,攻击次数为\(\lceil\frac{hp_i}{ATK-def_i}\rceil\),本质不同的攻击次数只有\(2\sqrt m\),所以这一方面枚举复杂度只要\(n\sqrt m\).

然后考虑防御力和血量,血量是由防御力决定的,为\(\sum_i \lceil\frac{hp_i}{ATK-def_i}\rceil max(atk_i-DEF,0)\)(输出时要+1,因为打完后血量要非负),等价于\(\sum_i \lceil\frac{hp_i}{ATK-def_i}\rceil atk_i-\sum_i \lceil\frac{hp_i}{ATK-def_i}\rceil min(atk_i,DE)\),那么从小到大枚举防御力,后面那一坨\(\sum_i \lceil\frac{hp_i}{ATK-def_i}\rceil min(atk_i,DE)\)就可以看成一堆分段函数的和,并且是个斜率不增的上凸壳的形式,前面那一坨减去某个防御力\(x\)的\(y\)值就是对应防御力的血量.然后防御力每\(+1\),需要的血量也会减少,

这时\(x\)的最优取值为某一个点,并且后面那一小段的斜率\(\le cost\_def\),因为前面部分防御力增加带来的代价小于因为血量减少带来的收益.所以可以每次二分,然后更新答案.不过随着攻击力的增长,这个\(x\)的值是单调不增的,所以可以每次直接从上一个\(x\)往后移

感觉跑的比较慢qwq

#include<bits/stdc++.h>
#define LL long long
#define db double using namespace std;
const int N=5000+10,M=1e6+10;
int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
vector<int> ls[M<<1];
vector<int>::iterator it;
int ca,cd;
int n,bear[N][3],mxat,z,mxde,mxhp,a2,a3;
LL dt[N],c1[M],c2[M],sm,mx=1ll<<50,a1;
void ad(int x,LL y)
{
LL yy=x*y;
while(x<=z) c1[x]+=y,c2[x]+=yy,x+=x&(-x);
}
LL gsm1(int x){LL an=0;while(x) an+=c1[x],x-=x&(-x);return an;}
LL gsm2(int x)
{
LL an=0,fx=x+1;
while(x) an+=fx*c1[x]-c2[x],x-=x&(-x);
return an;
} int main()
{
n=rd(),ca=rd(),cd=rd();
for(int i=1;i<=n;++i)
{
bear[i][0]=rd(),bear[i][1]=rd(),bear[i][2]=rd();
mxhp=max(mxhp,bear[i][0]);
mxat=max(mxat,bear[i][1]);
mxde=max(mxde,bear[i][2]);
}
for(int i=1;i<=n;++i) dt[i]=0,ls[mxde+1].push_back(i);
int cn=n;
z=mxat;
for(int i=mxde+1;cn&&i<=mxde+mxhp;++i)
{
if(!ls[i].size()) continue;
for(it=ls[i].begin();it!=ls[i].end();++it)
{
int x=*it;
sm-=dt[x]*bear[x][1],ad(1,-dt[x]),ad(bear[x][1]+1,dt[x]);
dt[x]=(bear[x][0]+i-bear[x][2]-1)/(i-bear[x][2]);
sm+=dt[x]*bear[x][1],ad(1,dt[x]),ad(bear[x][1]+1,-dt[x]);
if(dt[x]==1){--cn;continue;}
ls[(bear[x][0]+dt[x]-1-1)/(dt[x]-1)+bear[x][2]].push_back(x);
}
ls[i].clear();
while(z>1&&gsm1(z)<=cd) --z;
LL hp=sm-gsm2(z),nw=1ll*i*ca+1ll*z*cd+hp;
if(mx>nw) mx=nw,a1=hp+1,a2=i,a3=z;
}
printf("%lld %d %d\n",a1,a2,a3);
return 0;
}

BZOJ 4141 [Thu Summer Camp 2013]魔塔的更多相关文章

  1. [BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】

    题目链接:BZOJ - 4103 题目分析 THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的.嗯,有些东西就是明白得太晚. 首先Orz ZYF-ZYF ...

  2. bzoj:4105: [Thu Summer Camp 2015]平方运算

    Description   Input 第一行有三个整数N,M,p,分别代表序列的长度.平方操作与询问操作的总次数以及在平方操作中所要模的数.   接下来一行N个数代表一开始的序列{X1,X2,... ...

  3. bzoj 4104 [Thu Summer Camp 2015]解密运算——思路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4104 想了很久,想出一个 nlogn (也许是 n2logn )的,可惜空间是 n2 . 已 ...

  4. BZOJ 4103: [Thu Summer Camp 2015]异或运算 可持久化trie

    开始想了一个二分+可持久化trie验证,比正解多一个 log 仔细思考,你发现你可以直接按位枚举,然后在可持久化 trie 上二分就好了. code: #include <bits/stdc++ ...

  5. 【BZOJ 4104】 4104: [Thu Summer Camp 2015]解密运算 (智商)

    4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 370  Solved: 237 De ...

  6. 【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)

    4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 474  Solved: 258 De ...

  7. [BZOJ4103][Thu Summer Camp 2015]异或运算 可持久化Trie树

    4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MB Description 给定长度为n的数列X={x1 ...

  8. [Thu Summer Camp 2015]解密运算

    4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec  Memory Limit: 512 MB Description 对于一个长度为N的字符串,我 ...

  9. [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树)

    [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树) 题面 原题面有点歧义,不过从样例可以看出来真正的意思 有n个位置,每个位置可以看做一个集合. ...

随机推荐

  1. hdu 4763 看毛片(单纯next数组的应用--纯正O(n))

    因为需要负责队内的字符串题,开始刷,做到这道,开始想不出来,上网找题解, 然后就惊了,为什么你们这么暴力都可以过的啊,1e6啊,后来又想了下会做了 贴下代码 #include <iostream ...

  2. 分布式-信息方式-ActiveMQ的集群

    ActiveMQ的集群Queue consumer clusters              ActiveMQ支持 Consumer对消息高可靠性的负载平衡消费,如果一个 Consumer死掉,该消 ...

  3. OkHttp3 使用详解

    一,简介 OkHttp 是一个高效的 HTTP 客户端,具有非常多的优势: 能够高效的执行 http,数据加载速度更快,更省流量 支持 GZIP 压缩,提升速度,节省流量 缓存响应数据,避免了重复的网 ...

  4. TCP 之 TCP首部

    TCP首部图 TCP首部说明 源端口,目的端口 用于寻找发送端和接收端应用进程.(源IP,源端口,目的IP,目的端口) 四元组确定唯一一个TCP连接:(IP,端口)也称为一个插口(socket): 序 ...

  5. List<Map>集合根据Map里某个key对List集合重新排序介绍

    例1:List集合数据参考形式如下: [{GLXXLX=03,GLXXBH=20160226105812003},{GLXXLX=01,GLXXBH=20160226105812001},{GLXXL ...

  6. 七、创建UcRESTTemplate请求管理器

    一.创建UcRESTTemplate管理器封装 import com.alibaba.fastjson.JSON; import org.apache.http.client.config.Reque ...

  7. 设置ubuntu14.04命令行启动

    编辑文件"/etc/default/grub",  把 GRUB_CMDLINE_LINUX_DEFAULT="quiet"  改成GRUB_CMDLINE_L ...

  8. tf工程化部署相关

    1.TensorFlow 模型保存/载入的两种方法 https://blog.csdn.net/thriving_fcl/article/details/71423039 [讲解清晰,2种方法都有缺陷 ...

  9. mysql中文乱码 常见编码问题解决方法分享

    我是真的服了 mysql默认字符不是utf-8也不是GBK而是拉丁文字?? 在增删数据时 “中文字符” 老是乱码不停!害得我浪费不少时间在这上面 为各位之后不走坑 再此留下解决方法 若想进一步了解编码 ...

  10. 阶段3 2.Spring_02.程序间耦合_5 编写工厂类和配置文件

    先把dao的实现复制一份到别的地方.然后删除项目里面的AccountDaoImpl这个dao的实现类 删除 service层就开始报错了 这个时候运行直接报错 把文件复制回来就不报错了 解决依赖关系 ...