1. 程式人生 > >[樹狀數組]翠湖戰爭

[樹狀數組]翠湖戰爭

str 說了 表示 不知道 精靈 oid 數量 建立 數組

翠湖戰爭

題目描述

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; }

[樹狀數組]翠湖戰爭