zoukankan      html  css  js  c++  java
  • [ACM] hrbustoj 1161 Leyni (树状数组)

    Leyni
    Time Limit: 3000 MS Memory Limit: 65536 K
    Total Submit: 247(56 users) Total Accepted: 78(53 users) Rating:  Special Judge: No
    Description

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

    现在小奈叶专心战斗,Leyni昏迷,他们无法得知小护盾遭受的有效攻击次数,他们需要你的帮助。
    只要能帮到他们,Leyni就会赠送出一份小奈叶写真集。
    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

    Author
    黄李龙
    解题思路:

    编号1到n的保护盾,某编号的保护盾被攻击后产生防御,有个冷却时间t,如果在这t秒内该编号的盾又被攻击,则属于有效攻击,t秒后,该编号的盾又有了一次产生防御的能力。问某个区间内一共产生多少次有效攻击。用树状数组来保存区间有效攻击数,为每个盾保存一个状态,该状态为最后一次该盾产生防御是在第几次攻击d[number],当后来再对该盾产生攻击时,判断的d[number] + t 是否大于  该次攻击是第几次攻击,如果大于,则该次攻击属于有效攻击,更新树状数组,因为冷却时间还没完,否则,属于无效攻击,更新d[number]的值为  该次攻击是第几次攻击 。做题时犯了一个严重的错误,就是没有保存当前状态下一共发生了多少次攻击,直接把循环的变量当做攻击数了,但是题目中说查询是不需要时间的,所以要单独设一个变量来保存总发生攻击数。

    代码:

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    using namespace std;
    const int maxn=100002;
    int c[maxn];//保存数组中某一段区间的和
    int d[maxn];//保存每个保护盾最后一次无效攻击发生在第几秒
    int n,q,t;
    char cm[10];//命令
    int number;//被攻击的编号
    
    int lowbit(int x)
    {
        return x&(-x);
    }
    
    void update(int x,int rt)//这里rt为1
    {
        while(x<=n)
        {
            c[x]+=rt;
            x+=lowbit(x);
        }
    }
    int sum(int x)
    {
        int s=0;
        while(x>0)
        {
            s+=c[x];
            x-=lowbit(x);
        }
        return s;
    }
    
    int main()
    {
        int k;cin>>k;
        for(int ti=1;ti<=k;ti++)
        {
            cout<<"Case "<<ti<<":"<<endl;
            scanf("%d%d%d",&n,&q,&t);
            memset(c,0,sizeof(c));
            memset(d,0,sizeof(d));
            int a,b;
            int attacknum=0;
            for(int i=1;i<=q;i++)
            {
                scanf("%s",cm);
                if(cm[0]=='A')
                {
                    attacknum++;
                    scanf("%d",&number);
                    if(d[number]==0)//第一次被攻击
                    {
                        d[number]=attacknum;
                    }
                    else
                    {
                        if(d[number]+t>attacknum)
                            update(number,1);
                        else//一开始犯了错误d[number]=i,这是错的,i既包括了攻击的时间也包括了查询时间,但题意中查询是不花时间的,所以不能用i
                            d[number]=attacknum;//编号为number的保护盾最后产生无效攻击发生在attacknum秒
                    }
                }
                if(cm[0]=='Q')
                {
                    scanf("%d%d",&a,&b);
                    printf("%d
    ",sum(b)-sum(a-1));//输出区间和
                }
            }
        }
        return 0;
    }
    


     

  • 相关阅读:
    lr 增强窗格中,如何生成调试信息?
    lr 自带的例子,如何进行关联,通过代码的函数进行实现
    lr11 录制脚本时候,无法自动启动ie,查了网上很多方法都未解决?
    loadrunner11 录制脚步不成功,在录制概要出现“No Events were detected”,浮动窗口总是显示“0 Events”,解决办法
    loadrunner11 安装及破解教程来自百度文库
    安装loadrunner11 ,出现如下错误如何解决?
    回收站数据删除了,如何进行恢复?
    网管工作方面——————打印机删除了然后开机重启他依然存在,如何解决
    Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126
    Sorry, the page you are looking for is currently unavailable. Please try again later. Nginx
  • 原文地址:https://www.cnblogs.com/vivider/p/3697508.html
Copyright © 2011-2022 走看看