BZOJ 4141 [Thu Summer Camp 2013]魔塔
权限题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]魔塔的更多相关文章
- [BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】
题目链接:BZOJ - 4103 题目分析 THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的.嗯,有些东西就是明白得太晚. 首先Orz ZYF-ZYF ...
- bzoj:4105: [Thu Summer Camp 2015]平方运算
Description Input 第一行有三个整数N,M,p,分别代表序列的长度.平方操作与询问操作的总次数以及在平方操作中所要模的数. 接下来一行N个数代表一开始的序列{X1,X2,... ...
- bzoj 4104 [Thu Summer Camp 2015]解密运算——思路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4104 想了很久,想出一个 nlogn (也许是 n2logn )的,可惜空间是 n2 . 已 ...
- BZOJ 4103: [Thu Summer Camp 2015]异或运算 可持久化trie
开始想了一个二分+可持久化trie验证,比正解多一个 log 仔细思考,你发现你可以直接按位枚举,然后在可持久化 trie 上二分就好了. code: #include <bits/stdc++ ...
- 【BZOJ 4104】 4104: [Thu Summer Camp 2015]解密运算 (智商)
4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 370 Solved: 237 De ...
- 【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 ...
- [BZOJ4103][Thu Summer Camp 2015]异或运算 可持久化Trie树
4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec Memory Limit: 512 MB Description 给定长度为n的数列X={x1 ...
- [Thu Summer Camp 2015]解密运算
4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec Memory Limit: 512 MB Description 对于一个长度为N的字符串,我 ...
- [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树)
[BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树) 题面 原题面有点歧义,不过从样例可以看出来真正的意思 有n个位置,每个位置可以看做一个集合. ...
随机推荐
- python虚环境
有的项目使用tornado框架比较好,有的用Django框架比较好,容易发生冲突,这个时候可以建立一个虚拟的python环境. 安装virtualenv包 进入项目所在目录,执行命令 virtuale ...
- springboot2.x 整合redis集群的几种方式
一.不指定redis连接池 #系统默认连接池 yml配置文件: spring: redis: cluster: nodes: - 192.168.1.236:7001 - 192.168.1.236: ...
- 黑马lavarel教程---6、简单验证
黑马lavarel教程---6.简单验证 一.总结 一句话总结: 1.验证的最简单实例:$request的validate方法,验证通过可以继续进行,验证失败就重定向 2.中文提示可以用中文语言包 3 ...
- Docker非常详细的讲解
CSDN大牛写的,推荐 http://blog.csdn.net/tangtong1/article/details/53556129 阿里云docker镜像地址: https://dev.aliyu ...
- if && grep
if 条件 then Command else Command fi 别忘了这个结尾 ——————— ...
- MySQL MGR 单主模式下master角色切换规则
MGR单主模式,master节点可读可写,其余节点都是只读.当配置MGR为单主模式,非master节点自动开启super_read_only 当可读可写的节点异常宕机,会进行怎样的切换?在选择新的可写 ...
- CountDownLatch用法实践
项目中写多线程时,需要判断所有线程是否执行完毕,所以想到了添加累加器来判断.这个累加器使用什么变量,找到了以下2种方式. 1. 类似AtomicInteger这种提供原子操作的类型AtomicInte ...
- AS基本设置
1,点开as之前应该做的事 很多人一定会在这个界面卡顿很久,其实这是as在检测更新.所以我们在点开as之前先修改它的配置文件,让它不再更新. 找到你安装as的目录,进入bin文件夹找到idea.pr ...
- 在java poi导入Excel通用工具类示例详解
转: 在java poi导入Excel通用工具类示例详解 更新时间:2017年09月10日 14:21:36 作者:daochuwenziyao 我要评论 这篇文章主要给大家介绍了关于在j ...
- CompletableFuture用法介绍
一.CompletableFuture用法入门介绍 入门介绍的一个例子: package com.cy.java8; import java.util.Random; import java.util ...