• hrbustoj 1161:Leyni(树状数组练习)


    Leyni
    Time Limit: 3000 MS Memory Limit: 65536 K
    Total Submit: 260(59 users) Total Accepted: 80(55 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
    黄李龙


      树状数组练习

      一开始想着用cd[]数组记录攻击数,每一次攻击都cd[a]-- 一次。后来发现这样每一次都要把整个数组循环一遍,会超时。就看了别人的代码,发现不用这么麻烦。不断计数攻击次数,如果防御时受到攻击(cd[a]+t<=cnt),就把这块盾牌的cd时间=当前攻击次数(cd[a]=cnt)。

      代码

     1 #include <stdio.h>
     2 #include <iostream>
     3 using namespace std;
     4 int lowbit(int x)
     5 {
     6     return x & -x;
     7 }
     8 int sum(int a[],int x)    //求出第x个元素之前的和
     9 {
    10     int ans = 0;
    11     while(x>0){
    12         ans+=a[x];
    13         x -= lowbit(x);    //向左上爬
    14     }
    15     return ans;
    16 }
    17 void add(int a[],int x,int d,int n)    //将编号为x的数加d
    18 {
    19     while(x<=n){
    20         a[x]+=d;
    21         x+=lowbit(x);
    22     }
    23 }
    24 int main()
    25 {
    26     int i,j,T,n,q,t,Case;
    27     scanf("%d",&T);
    28     for(Case=1;Case<=T;Case++){
    29         scanf("%d%d%d",&n,&q,&t);
    30         printf("Case %d:
    ",Case);
    31         char str[100];
    32         int c[100010]={0};    //有效攻击次数
    33         int cd[100010]={0};    //冷却时间
    34         for(i=1;i<=n;i++)    //初始化cd[]数组
    35             cd[i]=-t;
    36         int cnt = 0;
    37         for(j=1;j<=q;j++){
    38             scanf("%s",str);
    39             if(str[0]=='A'){    //攻击
    40                 cnt++;
    41                 int a;
    42                 scanf("%d",&a);
    43                 if(cd[a]+t<=cnt){    //防御中
    44                     cd[a] = cnt;
    45                 }
    46                 else {    //冷却中
    47                     add(c,a,1,n);
    48                 }
    49             }
    50             else if(str[0]=='Q'){    //询问
    51                 int a,b;
    52                 if(a>b){
    53                     int tt = a;
    54                     a=b;b=tt;
    55                 }
    56                 scanf("%d%d",&a,&b);
    57                 printf("%d
    ",sum(c,b)-sum(c,a-1));
    58             }
    59         }
    60     }
    61     return 0;
    62 }

    Freecode : www.cnblogs.com/yym2013

  • 相关阅读:
    ubuntu下查看某个头文件来自哪个软件包?
    系统调用fork()在powerpc上的源码分析
    linux应用程序如何从用户空间进入内核空间?
    执行docker ps时提示"dial unix /var/run/docker.sock: connect: permission denied"如何处理?
    ubuntu上安装远程桌面服务
    执行python安装命令时报错"ModuleNotFoundError: No module named 'setuptools'"如何处理?
    在arm下使用docker build创建容器镜像时磁盘空间不足如何处理?
    9、序列
    8、数据类型
    7、运算符与表达式
  • 原文地址:https://www.cnblogs.com/yym2013/p/3698793.html
Copyright © 2020-2023  润新知