BZOJ4141 THUSC2013 魔塔 贪心
没得传送门
考虑当\(Atk\)增大时,\(Def\)一定越来越没用,因为回合数在变少。所以考虑从小到大枚举\(Atk\)然后双指针计算。
设\(f_i(x)\)表示在\(Atk = i\)时,\(Def\)从\(x-1\)到\(x\)时可以减少的血量的数量,易知\(f_i(x) \leq f_i(x - 1) , f_i(x) \leq f_{i-1}(x)\)。对于每一个怪,当\(Atk\)确定之后,它的攻击回合数就确定了。对于\(Atk = i\),一个怪物的攻击力为\(atk\),攻击回合数为\(T\)时,相当于在函数\(f_i(x)\)上\([1,atk]\)区间做一个前缀加\(T\)的操作。当攻击回合数减小的时候也相当于前缀减然后前缀加。
不妨把这个问题变得更形象一点:有若干条线段,左端点为\(1\),右端点不固定,每一条线段都有一个权值。从\(Def = x - 1\)到\(Def = x\)能够减少的血量就是覆盖了\(x\)点的所有线段的权值和。
一件显然的事情是因为\(Def\)在不断变小,所以之前被当前点覆盖的线段在之后也一定被覆盖。
所以我们可以设\(num_i\)表示右端点为\(i\)的所有线段的权值之和,然后我们考虑:当当前的\(Def\)覆盖的线段的权值之和\(\leq cd\)时将\(Def - 1\),然后把\(num_{Def - 1}\)加入,就可以更新出新的权值了。对于删线段和加线段只需要看一下当前加入线段的右端点和\(Def\)的关系并进行更新就可以了。在维护攻击防御值的时候同时维护血量以保证复杂度。
那么最后的问题就是如何快速加入和删除线段,暴力做是\(O(NHp)\)的,但是注意到\(\lceil \frac{Hp}{i} \rceil = \lfloor \frac{Hp - 1}{i} \rfloor + 1\)只有\(\sqrt{Hp}\)种取值,我们可以预处理出每一个转移点,就可以做到\(O(\sqrt{Hp}N)\)了
可能比较卡空间,慎用STL
然后这道题BZOJ上没有SPJ,面向数据编程可以知道:对于所有可行答案,取其中Atk最大的;对于所有Atk一样大的,取Def最大的。
#include<bits/stdc++.h>
//this code is written by Itst
using namespace std;
int read(){
int a = 0; char c = getchar();
while(!isdigit(c)) c = getchar();
while(isdigit(c)){
a = a * 10 + c - 48; c = getchar();
}
return a;
}
const int _ = 2e6 + 7;
#define PII pair < int , int >
struct node{
int nxt , rht , val;
}now[_ * 5 + 5000];
int head[_] , N , CA , CD , cnt , MXD;
long long num[_] , Ans , HP , ATK , DEF , sum , X , Y , Z;
void push(int rht , int val , int id){
now[++cnt] = (node){head[id] , rht , val};
head[id] = cnt;
}
void modify(int plc , int val){
num[plc] += val;
if(Y <= plc){sum += val; Z += (plc - Y) * val;}
}
int main(){
N = read(); CA = read(); CD = read();
for(int i = 1 ; i <= N ; ++i){
int h = read() - 1 , a = read() , d = read();
for(int j = 1 , pj ; j <= h ; j = pj + 1){
pj = h / (h / j);
if(j == 1) push(a , h + 1 , d + 1);
else push(a , h / j - h / (j - 1) , d + j);
}
push(a , -1 , h + d + 1);
MXD = max(MXD , d);
}
Ans = 1e18; Y = 1e6; Z = 1;
for(X = 1 ; X <= 2e6 ; ++X){
for(int i = head[X] ; i ; i = now[i].nxt)
modify(now[i].rht , now[i].val);
if(X <= MXD) continue;
while(Y > 1 && sum < CD){
Z += sum; sum += num[--Y];
}
if(Z + X * CA + Y * CD <= Ans){
Ans = Z + X * CA + Y * CD;
ATK = X; DEF = Y; HP = Z;
}
}
cout << HP << ' ' << ATK << ' ' << DEF;
return 0;
}
BZOJ4141 THUSC2013 魔塔 贪心的更多相关文章
- BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1383 Solved: 582[Submit][St ...
- HDOJ 1051. Wooden Sticks 贪心 结构体排序
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- BZOJ 1691: [Usaco2007 Dec]挑剔的美食家 [treap 贪心]
1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 786 Solved: 391[Submit][S ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【BZOJ-4245】OR-XOR 按位贪心
4245: [ONTAK2015]OR-XOR Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 486 Solved: 266[Submit][Sta ...
- code vs 1098 均分纸牌(贪心)
1098 均分纸牌 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 有 N 堆纸牌 ...
- 【BZOJ1623】 [Usaco2008 Open]Cow Cars 奶牛飞车 贪心
SB贪心,一开始还想着用二分,看了眼黄学长的blog,发现自己SB了... 最小道路=已选取的奶牛/道路总数. #include <iostream> #include <cstdi ...
- 【贪心】HDU 1257
HDU 1257 最少拦截系统 题意:中文题不解释. 思路:网上有说贪心有说DP,想法就是开一个数组存每个拦截系统当前最高能拦截的导弹高度.输入每个导弹高度的时候就开始处理,遍历每一个拦截系统,一旦最 ...
随机推荐
- LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力
二次联通门 : LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 /* LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 叫做计算几 ...
- mysql 字段拼接
mysql> select concat(name,"**",id) as test from test; +----------------+ | test | +---- ...
- 排序---希尔排序Java
希尔排序 插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减 ...
- MySQL索引和SQL调优手册
MySQL索引 MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree ...
- vuejs cli3 env配置文件实践指南
env文件 配置四个环境名字分别 VUE_APP_ENV=dev 只支持:VUE_APP_ 开头,比如设置其它变量 VUE_APP_NAME=stark package.json 配置 方式 &quo ...
- 分布式CAP理论介绍:一致性(Consistency),可用性(Availability),容忍网络分区(Partition tolerance)
在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点: 一致性(Consisten ...
- [代码质量] 代码质量管控 -- 复杂度检测 (JavaScript)
转载自: https://juejin.im/post/59bb8b546fb9a00a4247532e 背景 代码的复杂度是评估一个项目的重要标准之一.较低的复杂度既能减少项目的维护成本,又能避免一 ...
- 推荐:使用 Anaconda 工具搭建并管理 Python 环境
https://www.anaconda.com/distribution/#download-section 官网下载地址 https://mirror.tuna.tsinghua.edu.cn/ ...
- Linux_CentOS下搭建Nodejs 生产环境-以及nodejs进程管理器pm2的使用
nodejs安装:https://www.cnblogs.com/loaderman/p/11596661.html nodejs 进程管理器 pm2 的使用 PM2 是一款非常优秀的 Node 进程 ...
- 几种常见的java网页静态化技术对比
名称 优点 缺点 使用场景 jsp 1.功能强大,可以写java代码 2.支持jsp标签(jsp tag) 3.支持表达式语言(el) 4.官方标准,用户群广,丰富的第三方jsp标签库 5.性能良好. ...