码迷,mamicode.com
首页 > 其他好文 > 详细

HRBUST 1161 树状数组区间更新求和

时间:2014-08-10 21:08:10      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   os   io   数据   

Leyni
Time Limit: 3000 MS Memory Limit: 65536 K
Total Submit: 267(64 users) Total Accepted: 82(57 users) Rating: bubuko.com,布布扣bubuko.com,布布扣bubuko.com,布布扣 Special Judge: No
Description

Leyni被人掳走,身在水深火热之中...
小奈叶为了拯救Leyni,独自一人前往森林深处从静竹手中夺回昏迷中的Leyni。
历经千辛万苦,小奈叶救出了Leyni,但是静竹为此极为恼怒,决定对他们发起最强烈的进攻。
不过小奈叶有一个叫做能量保护圈的道具,可以保护他们。
这个保护圈由n个小的小护盾围成一圈,从1到n编号。当某一块小护盾受到攻击的时候,小护盾就会抵消掉这次攻击,也就是说对这一块小护盾的攻击是无效攻 击,从而保护圈里的人,不过小护盾在遭到一次攻击后,需要t秒进行冷却,在冷却期间受到的攻击都是有效攻击,此时他们就会遭到攻击, 即假设1秒时受到攻击并成功防御,到1+t秒时冷却才结束并能进行防御,在2到t受到的都是有效攻击。

现在小奈叶专心战斗,Leyni昏迷,他们无法得知小护盾遭受的有效攻击次数,他们需要你的帮助。
只要能帮到他们,Leyni就会赠送出一份小奈叶写真集。
bubuko.com,布布扣
Input

第一行是一个整数T,表示有多少组测试数据。
第一行是三个整数,n,q,t,n表示保护圈的长度,q表示攻击的询问的总次数,t表示能量盾的冷却时间。
接下来的q行,每行表示受到的攻击或者她询问某范围内的能量盾被攻击的次数。
攻击:
Attack   a
表示编号为a的小护盾受到一次攻击, 保证 1 <= a <= n
询问:
Query  a  b
表示询问编号从a到b的小护盾(包括a和b)总共受到了多少次有效攻击。保证 1<=a,b<=n
第k次攻击发生在第k秒,询问不花费时间。
1 <= n,q <=100000
1 <= t <= 50。

Output

每一组测试数据,先输出一行"Case i:",i表示第i组测试数据,从1开始计数。
之后对于每一个询问,输出该范围内的小护盾受到的有效攻击次数,一个询问一行。

Sample Input

1
4 7 3
Attack 1
Attack 1
Attack 1
Attack 2
Attack 2
Query 1 4
Query 1 1

Sample Output

Case 1:
3
2

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;
const int MAXN=100001;
int c[MAXN],p[MAXN];
int xiji;
int n,q,t,aa,b;

int lowbit(int x)
{
    return x&(-x);
}
void add(int x,int val)
{
    int i=x;
    while(i<=n)
    {
        c[i]+=val;
        i+=lowbit(i);
    }
}
int get_sum(int x)
{
    int s=0;
    while(x>0)
    {
        s+=c[x];
        x-=lowbit(x);
    }
    return s;
}

int main()
{
    int k;
    int s;
    char str[20];
    s=0;
    scanf("%d",&k);
    for(int i=0;i<k;i++)
    {
        s++;
         memset(c,0,sizeof(c));
        scanf("%d%d%d",&n,&q,&t);
        for(int i=1; i<=n; i++)
            p[i]=-t;
           xiji=0;
           printf("Case %d:\n",s);
        for(int i=1; i<=q; i++)
        {
            scanf("%s",&str);
            if(str[0]==A)
            {
                xiji++;
                scanf("%d",&aa);
                if(p[aa]+t<=xiji)
                    p[aa]=xiji;
                else
                {
                    add(aa,1);
                }
            }
            else if(str[0]==Q)
            {
                scanf("%d%d",&aa,&b);
                if(aa>b)
                    swap(aa,b);
                printf("%d\n",get_sum(b)-get_sum(aa-1));
            }
        }
    }
  return 0;
}

注:没有线段树快哦~~~~   get_sum()函数求起点到该点的和     ******************************************************
http://blog.csdn.net/shahdza/article/details/6314818
******************************************************

 

HRBUST 1161 树状数组区间更新求和,布布扣,bubuko.com

HRBUST 1161 树状数组区间更新求和

标签:des   style   blog   http   color   os   io   数据   

原文地址:http://www.cnblogs.com/zhangying/p/3903221.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!