hdu 4031 Attack 樹狀陣列

2022-05-22 07:42:12 字數 857 閱讀 2377

題意:美國有種防護盾,能抵擋****的秘密**,但每次抵擋後,需要t個單位時間去冷卻,期間不能起抵擋作用。

思路:我一開始用線段樹做,但做到一半就坑爹了~~當修改了線段樹的子節點資訊時,父節點的左右節點就會產生不一致性,那麼也就沒法直接修改父節點。

其實這題線段樹和樹狀陣列都能做。我們現在把問題分為兩個部分:

1.統計但會節點被攻擊的次數;

2.統計所有攻擊中多少次無效;

那麼總的攻擊次數減去無效的就是被攻擊的次數了。

關於統計被攻擊的次數用線段樹和樹狀陣列都很好實現。多少次無效的,我們可以定義乙個atc[i][2]陣列,記錄第i次攻擊的區間左右節點。用陣列uint[i][0]表示i次攻擊後,上次受攻擊的時間。uinti[i][1]表示i次攻擊後,多少次無效。

每當遇到一次無效攻擊,uint[i][0]就加上t(冷卻時間),當再次被包括在攻擊區間是也一定是無效攻擊(已經冷卻了).

具體見**:

#includeusing

namespace

std;

int list[20005],c[20005

];int

n,m;

void update(int i,int

val)

}int sum(int

i)

returns;}

intmain()

else

else

j++;

}printf(

"%d\n

",sum(x)-uint[x][1]);//

得出有效攻擊次數

} }

}return0;

}

view code

HDU4031 樹狀陣列 詳解

include 類是差分的思想區間更新 include 思路 用每個點總的攻擊次數 無效次數 include using namespace std int n,q,t int s 20005 int l 20005 r 20005 last 20005 useless 20005 int lowb...

樹狀陣列 hdu2689 hdu2838

題意 給定乙個正整數n,和乙個1 n的乙個排列,每個數可以和旁邊的兩個數的任意乙個交換,每交換一次總次數就要加一,問將這個排列轉換成乙個遞增的排列需要多少次交換?題意可以轉換成求這個排列的逆序對數。include include include include using namespace std...

hdu 3887 樹狀陣列

給你一棵樹,每個節點都有個編號。讓你求乙個節點他的子樹中編號比他小的節點有幾個。編號唯一,從1 n,已給出根節點 解 樹狀陣列統計。轉化為線性序列。可以想到的是,若要統計乙個節點,那麼比它小的孩子必須先插完,然後統計就行了。對於乙個節點i來說,只要把所有x那麼對於所有節點來說也是這樣的,從一開始插,...