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个位置,每个位置可以看做一个集合. ...
随机推荐
- JavaWeb_客户端相对/绝对路径和服务器端路径
客户端的绝对路径和相对路径 相对路径:相对与某个基准目录的路径,在同一根目录下各子目录文件之间的相互引用, 绝对路径:指目录下的绝对位置,直接到的目标位置 @charset "UTF-8&q ...
- 安装python及其它
https://www.liaoxuefeng.com/wiki/1016959663602400/1016959856222624
- JAVA源文件中可以包含多个类
可以的,一个“.java”源文件里面可以包含多个类,但是只允许有一个public类,并且类名必须和文件名一直:例如: package test; public class test { } class ...
- 剑指offer-Q60 n个骰子的点数
python版本代码 g_maxValue = 6 # 单个骰子最大的点数 def PrintProbability(number): ''' :param number: 骰子的个数 :return ...
- Vue中computed(计算属性)、methods、watch的区别
实现效果:字符串的动态拼接 methods方法 html: <div id="app"> <!-- 监听到文本框数据的改变 --> <input ty ...
- CyclicBarrier源码阅读
一种允许多个线程全部等待彼此都到达某个屏障的同步机制 使用 多个线程并发执行同一个CyclicBarrier实例的await方法时,每个线程执行这个方法后,都会被暂停,只有当最后一个线程执行完awai ...
- spring-sevlet简单配置
<<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www ...
- 第八周课程总结 & 实验报告(六)
第八周课程总结 一.包装类 介绍 装箱与拆箱 应用 二.异常 基本概念 基本格式 异常类的继承结构 throws关键字 throw关键字 Exception类和RuntimeException类 自定 ...
- java学期总结
第一周https://www.cnblogs.com/sqhe2000/p/11482760.html. 第二周https://www.cnblogs.com/sqhe2000/p/11521023. ...
- TP5 未定义变量:XXX
TP5开发模式下报错级别非常高,哪怕变量未定义都直接抛出异常 应用公共函数文件 路径: application/common.php 在common.php文件写入 // 异常错误报错级别, err ...