It is the path you have chosen. Take pride in it. Kotomine Kirei

GldHkkowo

[树状数组]翠湖战争

翠湖战争

题目描述

2814年,本已平静的沙拉岛再生事端。因为翠江共和国的首席魔法师发现了翠湖边上的树木与翠理魔法的亲和度极高,于是民间的魔法工坊都开始大肆使用翠湖边的木材来进行炼化。面对这种现象,翠江共和国的实权统治者——XXX郡主采取了不管不问的态度,默许人民继续砍伐翠湖自然保护区中的树木。魔法师不愿看到这种情况发生,便孤身一人前往翠江瀑布顶端的祭坛,召唤出了远古的精灵魔法师沙拉莉亚,她听到这个消息后,便召唤出翠湖湖区中隐居的精灵族人,建立了翠湖王国,并将翠湖中央的翠水魔晶取出,使翠江中的水不再具有魔法亲和力。
XXX郡主听说了这个消息后,大怒,让翠江共和国的首席大将巴特尔组织了人类联军驾驶飞艇从天空上进攻。巴特尔曾经在的几次沙拉岛战争中带领翠江军队屡出奇兵,便有些恃才放旷。于是他派出了mn架飞艇从天空进攻翠湖王国。他将飞艇排成n列(1<=n<=32767),每列有m架飞艇。(1<=m<=255)。他每一次会发动一个调动指令1 a b x,即从a列调动x架飞艇前往b列。但是他不知道的是,魔法师沙拉莉亚研发出了一个水晶球,她使这个水晶球可以随时截获巴特尔的调动指令。她希望当精灵联军的军官沙拉利向水晶球发动一个询问指令2 a b 0,即询问在a列到b列之间(包括a,b两列)的飞艇数量时,水晶球便会立刻给出答复。
这时,沙拉莉亚找到了你,请求你为水晶球编写一个程序做到上述的内容。翠湖王国的存亡,就在你的手中了。

输入

第一行输入三个数字n,m,c,分别表示飞艇的列数,每列飞艇的初始数量与双方发出指令的总个数。

接下来的c行,每行分别输入一个指令。数据保证第一个指令是巴特尔的调动指令,最后一个指令为沙拉利的询问指令。

输出

输出共有s行(s为沙拉利发出询问指令的个数)。每一行依序对沙拉利的一个询问指令给出回答。

样例输入

3 6 4
1 2 3 1
2 3 3 0
1 2 1 2
2 1 2 0

样例输出

7
11

提示

 对于命令的总个数,有:

对于30%的数据,1<=c<=1023;

对于100%的数据,1<=c<=32767;

 

 

几乎就是一道裸的模板题,舰船转移即把前一列减去x后一列加上x,用树状数组维护即可owo

代码:

#include<cstdio>
#include<cstring>
using namespace std; 

const int Maxv = 33000; 
int sum[Maxv], n; 

int lb(int x) {
    return x & (-x);
}

int getsum(int x) {
    int ans = 0; 
    for (int i = x; i > 0; i -= lb(i)) {
        ans += sum[i]; 
    }
    return ans; 
}

void add(int x, int y) {
    for (int i = x; i <= n; i += lb(i)) {
        sum[i] += y; 
    }
}

int main() {
    int m, c; 
    scanf("%d%d%d", &n, &m, &c); 
    for (int i = 1; i <= n; i++) {
        add(i, m); 
    }
    while (c--) {
        int t, x, y, n; 
        scanf("%d%d%d%d", &t, &x, &y, &n); 
        if (t == 1) {
            add(y, n); 
            add(x, -n); 
        }
        else {
            printf("%d\n", getsum(y) - getsum(x - 1));
        }
    }
    return 0; 
}

 

posted on 2018-04-15 16:36  GldHkkowo  阅读(141)  评论(0编辑  收藏  举报

导航