題意:美國有種防護盾,能抵擋****的秘密**,但每次抵擋後,需要t個單位時間去冷卻,期間不能起抵擋作用。
思路:我一開始用線段樹做,但做到一半就坑爹了~~當修改了線段樹的子節點資訊時,父節點的左右節點就會產生不一致性,那麼也就沒法直接修改父節點。
其實這題線段樹和樹狀陣列都能做。我們現在把問題分為兩個部分:
1.統計但會節點被攻擊的次數;
2.統計所有攻擊中多少次無效;
那麼總的攻擊次數減去無效的就是被攻擊的次數了。
關於統計被攻擊的次數用線段樹和樹狀陣列都很好實現。多少次無效的,我們可以定義乙個atc[i][2]陣列,記錄第i次攻擊的區間左右節點。用陣列uint[i][0]表示i次攻擊後,上次受攻擊的時間。uinti[i][1]表示i次攻擊後,多少次無效。
每當遇到一次無效攻擊,uint[i][0]就加上t(冷卻時間),當再次被包括在攻擊區間是也一定是無效攻擊(已經冷卻了).
具體見**:
#includeusingview codenamespace
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;
}
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那麼對於所有節點來說也是這樣的,從一開始插,...