codechef Killing Monsters
题目大意:大厨正在玩一个打怪兽的小游戏。游戏中初始时有 n 只怪兽排成一排,从左到右编号为 0 ∼ n − 1。第 i 只怪兽的初始血量为 hi,当怪兽的血量小于等于 0 时,这只怪兽就挂了。 大厨要进行 q 次操作。每次操作中,大厨会选择两个整数 x 和 y,并向下标 k 满足 k&x = k 的怪兽开炮(此处 & 代表按位与操作)。被炮弹打到的怪兽会掉 y 点血。 请告诉大厨,在他每次操作后,还有多少怪兽活着。
做法:考虑把操作分块
预处理每一块中下标为i的要扣的血量。
然后对于某一个下标i,暴力从第一块开始跑,跑到第一个血量不够的块,然后再在那个块里暴力地跑。
看它到哪一个位子血量刚好用完,然后那个x位子ans[x]–.(ans是差分数组,表示从x到最后都少了一个怪兽)
最后累加输出答案即可。
代码:
#include<bits/stdc++.h>
#define N 300005
#define M 605
#define int long long
using namespace std;
int n,m,num,block,limit,len;
int a[N],x[N],y[N],f[M][N],l[N],r[N],ans[N];
inline int gt(int x){return (x-1)/block+1;}
signed main(){
scanf("%lld",&n);limit=1;
for (;limit<n;limit<<=1) len++;limit--;
for (int i=1;i<=n;i++) scanf("%lld",&a[i]);
scanf("%lld",&m);block=(int)sqrt(m);
num=m/block;if (m%block) num++;
for (int i=1;i<=num;i++) l[i]=(i-1)*block+1,r[i]=i*block;
for (int i=1;i<=m;i++){
scanf("%lld%lld",&x[i],&y[i]);
x[i]&=limit;f[gt(i)][x[i]]+=y[i];
}
for (int i=1;i<=num;i++)
for (int k=0;k<len;k++)
for (int j=0;j<=limit;j++)
if (j>>k&1) f[i][j^(1<<k)]+=f[i][j];//枚举j,显然(j^(1<<k))&j==j,那么j扣的血(j^(1<<k))肯定也会扣(相当于枚举题目里的下标k)
ans[1]=n;
for (int i=1;i<=n;i++){
int j=1;
for (;j<=num&&a[i]>f[j][i-1];j++) a[i]-=f[j][i-1];
if (j>num) continue;
for (j=l[j];j<=m;j++) if ((x[j]&(i-1))==i-1){
if (a[i]>y[j]) a[i]-=y[j];
else break;
}
ans[j]--;
}
for (int i=1;i<=m;i++)
ans[i]+=ans[i-1],printf("%lld\n",ans[i]);
return 0;
}
codechef Killing Monsters的更多相关文章
- hdu4970 Killing Monsters (差分数列)
2014多校9 1011 http://acm.hdu.edu.cn/showproblem.php?pid=4970 Killing Monsters Time Limit: 2000/1000 M ...
- 周赛-Killing Monsters 分类: 比赛 2015-08-02 09:45 3人阅读 评论(0) 收藏
Killing Monsters Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- Killing Monsters(hdu4970)
Killing Monsters Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- HDU 4970 Killing Monsters(树状数组)
Killing Monsters Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- hdu 4970 Killing Monsters(数组的巧妙运用) 2014多校训练第9场
pid=4970">Killing Monsters ...
- hdu 4970 Killing Monsters(数学题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4970 Problem Description Kingdom Rush is a popular TD ...
- hdu 4970 Killing Monsters (思维 暴力)
题目链接 题意: 有n座塔,每座塔的攻击范围为[l,r],攻击力为d,有k个怪兽从这些塔前面经过,第i只怪兽初始的生命力为hp,出现的位置为x,终点为第n个格子.问最后有多少只怪兽还活着. 分析: 这 ...
- HDU 4970 Killing Monsters
开始以为是线段树,算了一下复杂度也觉得能过...但是这题貌似卡了线段树... 具体做法: 对每一个塔,记录attack[l]+=d,attack[r+1]-=d;这样对于每个block,受到的伤害就是 ...
- HDU 4970(杭电多校#9 1011题)Killing Monsters(瞎搞)
题目地址:HDU 4970 先进行预处理.在每一个炮塔的火力范围边界标记一个点. 然后对每一个点的伤害值扫一遍就能算出来. 然后在算出每一个点到终点的总伤害值,并保存下来,也是扫一遍就可以. 最后在询 ...
随机推荐
- 通过邮件找回密码功能的Java实现
1.有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密码. 2.参考别人 ...
- Eclipse中pydev开发,python重载__init__报错,是可以正常执行
python支持函数重载 而在使用Eclipse的pydev开发时,重载函数__init__时,却出现了错误duplicated 我想不到解决办法,但是居然能正常执行. pydev报错是编译错误,而p ...
- JAVA获取计算机的IP、名称、操作系统等信息
[java] view plaincopyprint? import java.io.BufferedReader; import java.io.InputStream; import java.i ...
- iOS 解决键盘挡住输入框的问题
iOS开发中经常会用到输入框UITextField,所以也常会遇到键盘挡住输入框而看不到输入框的内容. 在这里记录一种方法,用UITextField的代理来实现View的上移来解决这个问题. 首先设置 ...
- Objective-C实现常用的4种排序算法
OC实现的4种排序又来了! 4种排序分别是:快速排序.冒泡排序.选择排序.插入排序,其他的我就不写了,因为OC里的数组中不能存放基本数据类型,如int不能存放,只能放对象,所以所有的数据我用了NSNu ...
- Android性能优化之被忽视的优化点
对于性能优化这个知识点来说,实在是太广了,博主本人也一直非常关注这方面的学习,而对于性能优化来说它包括了非常非常非常多方面,比如:I/O的优化.网络操作的优化.内存的优化.数据结构的优化.代码层次的优 ...
- 《java入门第一季》之网络编程初探
由于在写有关javaweb的博客,在写到web服务器的时候需要回顾网络编程的知识,提前把网络编程放在前面写. 直接上代码解释: import java.net.InetAddress; import ...
- Linux的启动流程 (二)
引:本文以RedHat9.0和i386平台为例,剖析了从用户打开电源直到屏幕出现命令行提示符的整个Linux启动过程.并且介绍了启动中涉及到的各种文件.阅读Linux源代码,无疑是深入学习Linux的 ...
- Android 纵向跑马灯滚动效果
像淘宝和京东都会有跑马灯的效果,今天给大家贡献下以前项目的一个demo,各位看官,且看效果图. 我们先定义一个Bean文件,这个实体类文件主要包含标题,内容描述,以及还有跳转的链接. LampBean ...
- javascript的介绍,实现和输出以及语法-javascript学习之旅(1)
javascript的介绍 : 1.javascript死互联网最流行的脚本语言,可用于web和html,并且可用于服务器,pc和移动端 2.javascript脚本语言: 1.是一种轻量级的脚本语言 ...