题目大意:大厨正在玩一个打怪兽的小游戏。游戏中初始时有 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的更多相关文章

  1. hdu4970 Killing Monsters (差分数列)

    2014多校9 1011 http://acm.hdu.edu.cn/showproblem.php?pid=4970 Killing Monsters Time Limit: 2000/1000 M ...

  2. 周赛-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) ...

  3. Killing Monsters(hdu4970)

    Killing Monsters Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...

  4. HDU 4970 Killing Monsters(树状数组)

    Killing Monsters Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  5. hdu 4970 Killing Monsters(数组的巧妙运用) 2014多校训练第9场

    pid=4970">Killing Monsters                                                                   ...

  6. hdu 4970 Killing Monsters(数学题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4970 Problem Description Kingdom Rush is a popular TD ...

  7. hdu 4970 Killing Monsters (思维 暴力)

    题目链接 题意: 有n座塔,每座塔的攻击范围为[l,r],攻击力为d,有k个怪兽从这些塔前面经过,第i只怪兽初始的生命力为hp,出现的位置为x,终点为第n个格子.问最后有多少只怪兽还活着. 分析: 这 ...

  8. HDU 4970 Killing Monsters

    开始以为是线段树,算了一下复杂度也觉得能过...但是这题貌似卡了线段树... 具体做法: 对每一个塔,记录attack[l]+=d,attack[r+1]-=d;这样对于每个block,受到的伤害就是 ...

  9. HDU 4970(杭电多校#9 1011题)Killing Monsters(瞎搞)

    题目地址:HDU 4970 先进行预处理.在每一个炮塔的火力范围边界标记一个点. 然后对每一个点的伤害值扫一遍就能算出来. 然后在算出每一个点到终点的总伤害值,并保存下来,也是扫一遍就可以. 最后在询 ...

随机推荐

  1. 套接字输入缓冲装置——InternalInputBuffer

    互联网的世界很复杂,信息从一端传向另一端过程也相当复杂,中间可能通过若干个硬件,为了提高发送和接收效率,在发送端及接收端都将引入缓冲区,所以两端的套接字都拥有各自的缓冲区,当然这种缓冲区的引入也带来了 ...

  2. 批量替换数据库中所有用户数据表中字段数据类型为char和varchar到nvarchar的脚本

    解决问题:字段类型为char的总是占用指定字节长度(末尾好多空白符号),varchar数据类型长度一个汉字占2个字节,内容存储为中文的字段个人建议全部使用nvarchar. 操作说明:打开SQL Se ...

  3. Dynamics CRM 2011/2013 section的隐藏

            代码如下 Xrm.Page.ui.tabs.get("TabName").sections.get("SectionName").setVisi ...

  4. pig limit 少于10行,会返回所有记录

    my = limit g_log 3; STORE my INTO '/user/wizad/tmp/my' USING PigStorage(','); 这样会返回g_log的所有记录. 要大于等于 ...

  5. javascript之DOM文档对象模型编程的引入

    /* DOM(Document Object Model) 文档对象模型 一个html页面被浏览器加载的时候,浏览器就会对整个html页面上的所有标签都会创建一个对应的 对象进行描述,我们在浏览器上看 ...

  6. 柔弱的APP如何自我保护,浅谈APP防御手段,使用360加固助手加固/签名/多渠道打包/应用市场发布

    柔弱的APP如何自我保护,浅谈APP防御手段,使用360加固助手加固/签名/多渠道打包/应用市场发布 由于JAVA和Android的平台型,所以APP很容易被反编译,这对于我们开发者来说,是一个不想要 ...

  7. mongoDB基本使用(二)

    数据库基本操作 连接到mongoDB服务器 ./bin/mongo 127.0.0.1:12345  查看当前数据库 > show dbs admin  (empty) local  0.078 ...

  8. 排序算法(二)Sort with Swap(0,*)

    对于一个由0到N-1的序列,如果只能交换0和另一个数的位置,求多少次能够将序列变为递增序列. 输入为<N> <序列>(N和序列之间有一个空格,序列元素之间均有一个空格). 设序 ...

  9. HBASE表设计

    1. 表的设计 1.1 Pre-Creating Regions 默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这一个region写数 ...

  10. 《java入门第一季》之二维数组

    /* 格式2: 数据类型[][] 数组名 = new 数据类型[m][]; m:表示这个二维数组有多少个一维数组. 列数没有给出,可以动态的给.这一次是一个变化的列数. */ class Array2 ...