廣外oj 亞絲娜和桐人的戰鬥(線段樹or樹狀陣列)

2021-08-18 18:56:08 字數 3246 閱讀 8274

最近市面出現了一款全新的遊戲,absolute counter online,簡稱aco。asuna跟她的男票kirito也都跑去玩這個了。aco有乙個特殊的戰鬥模式,就是完全反擊模式,在這個模式裡,boss跟小怪會來進攻kirito他們的領地,在他們領地的前面,有n個魔法陣,這些魔法陣排成一條橫線,從左往右第i個魔法陣有初始魔力m[i],這些魔法陣會不停消耗魔力攻擊接近領地的敵人,並且它們要進入領地必須經過魔法陣。而kirito他們不會主動出擊,也不能出去,只有當敵人突破魔法陣時,kirito他才能對敵人進行攻擊。asuna的角色能力是精通各種魔法,在這個模式中,她有一項重要能力,就是修復魔法陣,當乙個魔法陣魔力損耗時,她可以直接將這個魔法陣恢復到原先的狀態,即填充滿魔力。另外,她還有一項技能,就是將擅長二刀流的kirito傳送到任意乙個魔法陣的位置,增加那裡的戰鬥力,kirito的戰鬥力固定為a,並且kirito自己不會跑去別的魔法陣,因為妻管嚴。魔法陣的魔力損耗會實時反饋給asuna,但是她已經來不及去計算了,所以她請了個外援,也就是你,來幫她算下,各個魔法陣的實時戰鬥力。乙個魔法陣的戰鬥力計算很簡單,如果kirito在這個魔法陣,則戰鬥力等於m[i] + a,否則等於m[i]。

你會接收到q次資訊,資訊型別如下,第乙個為資訊編碼,後面根據資訊操作碼型別給出乙個或多個引數:

1、move x,表示把kirito移動到第x個魔法陣。

2、repair x, 表示asuna修復了第x個魔法陣,請注意,這裡只會修復到相應魔法陣的初始魔力,即把魔力修復到m[x]。

3、attack x v,表示第x個魔法陣消耗了v魔力進行了攻擊。

4、query l r,表示查詢第l個魔法陣到第r個魔法陣的戰鬥力總和。

input

第一行輸入乙個t,表示有t組資料。

每組資料,第一行輸入n, a, x,依次為魔法陣數量,kirito的攻擊力以及kirito所在魔法陣編號。

接下來一行有n個數字,依次表示各個魔法陣的初始魔力。

接下來一行,乙個整數q,表示要接收處理的資訊數量。

接著有q行,每行先乙個操作碼,操作碼只有4種(move repair attack query),根據操作碼型別後面跟著乙個或兩個引數,引數個數及意義請參照描述。

資料範圍:

1 <= t <= 20

1 <= n <= 100000

1 <= q <= 200000

1 <= a, m[i] <= 1000000000

對於操作move和repair,1 <= x <= n

對於操作attack,1 <= x <= n,1 <= v <= 當前第x個魔法陣的魔力,即保證魔法陣的魔力不會小於0。

對於操作query,1 <= l <= r <= n。

所有輸入都是正整數。

output

對於第k組資料,先輸出一行「case #k:」,k從1開始計數。

對於query操作,輸出一行表示查詢的對應的戰鬥力總和。

線段樹單點更新版本:

public

class asuna

for (int i = 0; i <= 100005

<< 2; i++)

index = 0;

build(1, 1, n);

out.println("case #" + (cases++) + ":");

int q = reader.nextint();

while (q-- > 0)

out.println(ans);

} else

if (com.equals("attack")) else

if (com.equals("move")) else }}

out.close();

}public

static

void

pushup(int i)

public

static

void

build(int i, int l, int r)

int mid = (l + r) / 2;

build(i << 1, l, mid);

build(i << 1 | 1, mid + 1, r);

pushup(i);

}public

static

void

repair(int i, int l, int r, int l, int r)

int mid = (l + r) / 2;

if (l <= mid)

if (r > mid)

pushup(i);

}public

static

void

attack(int i, int l, int r, int l, int r, int v)

int mid = (l + r) / 2;

if (l <= mid)

if (r > mid)

pushup(i);

}public

static

long

query(int i, int l, int r, int l, int r)

int mid = (l + r) / 2;

long ans = 0;

if (l <= mid)

if (r > mid)

return ans;

}static class node

}

賊長,手動再見。

樹狀陣列版本:

public

class asunabinaryindex

int q = reader.nextint();

while (q-- > 0)

system.out.println(ans);

} else

if (com.charat(0) == 'a') else

if (com.charat(0) == 'm') else }}

}public

static

intlowbit(int i)

public

static

void

update(int i, long val)

}public

static

long

getsum(int i)

return sum;

}}