一些簡單的樹狀陣列題

2021-09-02 01:44:12 字數 1709 閱讀 5136

大意:給定一列數$a_i$,求滿足下列條件的數對$(x,y)$的數量:$(1)xn$與$a_i=n$是等價的,所以直接將大於n的$a_i$賦為$n$可以避免離散化

#include#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int tree[200500],n,a[200500

];vector

v[200500

];int lowbit(int

x)void add(int pos,int

val)

int query(int

pos)

intmain()

long

long ans=0

; memset(tree,

0,sizeof

(tree));

for (i=1;i<=n;i++)

printf(

"%i64d

",ans);

return0;

}

大意:給定乙個由"a","g","t","c"組成的字串,有如下兩種操作

​           $1\ x \  c$ :將位置為x的字元替換成c

​           $2\ l\ r\ e$:給出乙個字串,它的迴圈節是$e$(即這個字串為$ee\ldots$),將它與原字串的子串$[l\ldots r]$進行比較,求出有多少位能夠匹配

本題的關鍵在於$e\leq 10$,所以很多東西要在$e$上做文章

我們可以對每個字元開$10*10$個樹狀陣列(記做$[i][j]$),表示當$e$的長度為$j$時這個字元能處在$e$的第$i$位

樹狀陣列再開兩維記錄當前的元素是什麼以及在原串中的位置

在查詢時,對每乙個字元統計它的貢獻即可

1 #include2 #include

3 #include

4 #include5 #include6 #include7 #include8 #include9

using

namespace

std;

10const

int maxn=1e5+10;11

int tree[11][11][5

][maxn],n,q;

12char a[100500

];13 mapmp;

1415

int lowbit(int

x)16

1920

void add(int x,int y,int id,int pos,int

val)

2127}28

29int query(int x,int y,int id,int

pos)

3036

37int

main()

3850

while (q--)

5163 a[x-1]=ch;64}

65else

if (op==2)66

74 printf("

%d\n

",ans);75}

76}77return0;

78 }

一些簡單的樹狀陣列題

大意 給定一列數 a i 求滿足下列條件的數對 x,y 的數量 1 xn 與 a i n 是等價的,所以直接將大於n的 a i 賦為 n 可以避免離散化 include include include include include include include include using nam...

關於樹狀陣列的一些討論

樹狀陣列用於在log n 的時間複雜度修改與詢問字首 相比線段樹更好寫 常數更小 不過侷限性很大 不能用於維護最大最小值之類的情況 最常用的應用 我用過的 大概有 單點修改區間查詢 區間修改單點查詢 區間修改區間查詢 離散化權值求逆序對 以上內容 洛谷金秋講義 上面已經把樹狀陣列定義以及修改查詢方法...

轉 樹狀陣列的一些應用

樹狀陣列 bit,binary indexed tree 以下 1.單點增減 區間求和 思路 c x 表示該點的元素 sum x c 1 c 2 c x int arr maxn inline int sum int x inline void add int x,int n inline int ...