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个位置,每个位置可以看做一个集合. ...
随机推荐
- Eclipse常用快捷键与IDEA中的对比.
最近从github下载了一些项目,但是看了一下使用的编译器是IDEA的,所以就下载了一个IDEA. 这边可以提供几个网址:只要是针对各个下载idea之后的一些激活相关的帮助. http://idea. ...
- JVM----堆上为对象动态分配内存
jvm中内存划分: 如上图,一共分为五块,其中: 线程共享区域为: 1.java堆 2.方法区 线程私有区域为: 3.JVM栈 4.本地方法栈 5.程序计数器 java技术体 ...
- 第九周学习总结&实验报告(7)
完成火车站售票程序的模拟. 要求: (1)总票数1000张; (2)10个窗口同时开始卖票; (3) 卖票过程延时1秒钟; (4)不能出现一票多卖或卖出负数号票的情 况 实验代码: package y ...
- 第3周Java编程总结
1.打印输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其中各位数字立方和等于该数本身.例如,153是一个“水仙花数”. 2. 编写Java程序,求13-23+33-43+…+973-983+ ...
- yagent使用说明
介绍 yagent是ycache的一个组件,用于管理memcached或redis的缓存实例.主要功能包括启动cache实例.将cache实例的信息写到zk上给yconsole使用.检测cache ...
- note:开源许可证之间的区别
最近接触开源项目比较多,关注一下许可证的问题. 饱受诟病的病毒式copyleft就是GPL了.. ref:http://code.csdn.net/news/2819582 ref:http://ww ...
- C# 判断两条直线是否相交
直接上代码,过程不复杂 /// <summary> /// 判断两条线是否相交 /// </summary> /// <param name="a"& ...
- leetcode 72. 编辑距离
/***** 定义状态: DP[i][j]其中i表示word1前i个字符,j表示Word2前i个字符 DP[i][j]表示单词1前i个字符匹配单词2前j个字符,最少变换次数: 状态转移: for i: ...
- 113路径总和II
题目: 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 来源: https://leetcode-cn.com/problems/path-sum-ii/ 法一: ...
- jitamin配置(nginx设置)
server { listen 66; server_name 192.168.2.253; root "/var/www/jitamin/public"; location / ...