1.校門外的樹
詳見一本通
給定[1,n]的區間,進行m次操作,每次在[l,r]範圍內種一種樹,給定任意[l0,r0]求種植的樹有多少種
問題轉化,不妨把種樹區間[l,r]看成括號序列(),對於詢問區間[l,r]:
r的左側有多少個"(",代表r的左側存在的樹的總數!
l的左側有多少個")",代表l的左側已經種下了多少種樹,這些樹不會出現在[l,r]內,需要減掉;
所以可以維護兩個樹狀陣列,t1維護左括號序列,t2維護右括號序列:
k=1 更新[l,r]區間內的值,updatet1(l,1),updatet2(r,1);
k=2 就是用r的"("減去l的")",即sumt1(r)-sumt2(l-1),(因為sum函式是閉區間,如果減去l,當只有l處存在一種樹時的情況被忽落了!)
ac code:
#include
using namespace std;
const int maxn=5e4+10;
int t1[maxn],t2[maxn],n,m;
int lowbit(int x)
void updatet1(int x,int k)
}void updatet2(int x,int k)
}int queryt1(int x)
return res;
}int queryt2(int x)
return res;
}int main()
if(k==2)
}return 0;
}2.數星星:
由於給定有序序列,只需要求有多少x座標更小的星星即可!
#include
#include
#include
using namespace std;
const int maxn=50000;
int c[maxn],n,ans[maxn],m=32001;
struct nodestar[maxn];
int lowbit(int x)
void update(int x,int k)
}int query(int x)
return res;
}int main()
for(int i=0;i<=n-1;i++)
printf("%d\n",ans[i]);
return 0;
}
COGS 數列操作a,b,c 樹狀陣列練習
cogs 264.數列操作 問題描述 假設有一列數 1 i n 支援如下兩種操作 1 將 a k 的值加 d k,d 是輸入的數 2 輸出 a s a s 1 a t s,t 都是輸入的數,s t 根據操作要求進行正確操作並輸出結果。輸入格式 輸入檔案第一行乙個整數 n 0 n 100000 第二行...
樹狀陣列1 樹狀陣列入門
仔細看一下,發現tree的每乙個節點的高度並不是隨意的,而是由它轉成二進位制之後末尾連續零的數量決定的,連續零的數量加1,就是高度,例如 3 11 零的數量為0,加1等於1,所以它的高度就是1 6 110 零的數量為1,加1等於2,所以它的高度就是2 8 1000 零的數量為3,加1等於4,所以它的...
樹狀陣列 瞎bb 樹狀陣列
樹狀陣列是乙個利用一維陣列和位運算組成的求解區間問題的高效資料結構,其構造如圖所示 首先,我們要用它解決單點修改 區間查詢的操作。根據這張圖我們建立乙個陣列bit,下標就是圖中顯示的十進位制數。bit i 就表示了圖中所示的一段區間的和,例如bit 6 sum 5,6 bit 4 sum 1,4 下...