字首 樹狀陣列

2022-05-29 19:12:20 字數 2996 閱讀 1797

具體見**:

1 #include 2

using

namespace

std;

3 typedef long

long

ll;4

const

int maxn=1e5+10;5

const

int mod=1e9+7;6

#define rep(i,first,second) for(int i=first;i<=second;i++)

7#define dep(i,first,second) for(int i=first;i>=second;i--)89

struct node

15}s[maxn];

1617

intn,m,a[maxn];

18int first[maxn];//

記錄從前往後不同數的個數

19int

vis[maxn];

20int

sum[maxn];

21int lowbit(int x)

22void update(int pos,int

val)27}

28int query(int

pos)

34return

ans;35}

36int

pre[maxn],ans[maxn];

37int

main()

3848 pre[i]=res;//

記下i位置前面不同數的個數49}

50 rep(i,1

,m)54 sort(s+1,s+1+m);

55 memset(sum,0,sizeof

(sum));

56 memset(vis,0,sizeof

(vis));

57 res=0;//

記錄從後往前不同數的個數

58int r=n+1

;59 rep(i,1

,m)67

}68 ans[s[i].id]=pre[s[i].l]+res-query(s[i].l);//

s[i].l以前不同的個數+res-前後重複出現的數量69}

分析:每一次詢問的答案,等於 這個區間所有不同元素異或和 異或上 區間異或和。(因為出現偶數次的對區間異或和貢獻為0,此時剩下的是出現奇數次的數,在取個補集即為答案);x^x=0,x^0=x;

1

//每一次詢問的答案,等於 這個區間所有不同元素異或和 異或上 區間異或和。(因為出現偶數次的對區間異或和貢獻為0,此時剩下的是出現奇數次的數,在取個補集即為答案)2//

x^x=0,x^0=x;

3 #include 4

using

namespace

std;

5 typedef long

long

ll;6

const

int maxn=1e6+10;7

const

int mod=1e9+7;8

#define rep(i,first,second) for(int i=first;i<=second;i++)

9#define dep(i,first,second) for(int i=first;i>=second;i--)

1011

struct

node

16}e[maxn];

1718

inttree[maxn],sum[maxn],a[maxn];

19 mapvis;

20int

n,ans[maxn],m;

2122

int lowbit(int x)

23void update(int pos,int

val)28}

29int query(int

x)35

return

res;36}

3738

intmain()

3945 scanf("

%d",&m);

46 rep(i,1

,m)50 sort(e+1,e+1+m);

5152

int p=1

;53 rep(i,1

,m)60

else

65 p++;66}

67 ans[e[i].id]=sum[r]^sum[l-1]^query(r)^query(l-1);//

在現區間沒有出現過的數通過query(r)^query(l-1)清零68}

69 rep(i,1,m) printf("

%d\n

",ans[i]);

70return0;

71 }

字首和 與 樹狀陣列

通常情況下,樹狀陣列可用來處理單點修改,區間查詢。通過字首和的轉換,可以使其處理區間修改和單點查詢。考慮原陣列和字首和陣列 修改原陣列的某個點 i 等價於 修改字首和陣列 的一條線段 1 i 都要修改 查詢原陣列的某條線段 1 i 等價於 查詢字首和陣列的乙個點 i 這樣,適當地處理字首和陣列和原陣...

hdu 5147 樹狀陣列 字首和

題目 題目分析 要保證兩對數滿足前面的大於後面的,第一對數的下標中較大的小於第二對數中下標較大的,那麼我們可以利用字首和和字尾和的思想,先預處理算出每乙個數的字首中比它小的數的個數,再計算出字尾中比它大的個數,利用樹狀陣列可以快速求取,然後對前面的數取字首和,也就是以它為較大數的所有數對的個數,列舉...

字首和 差分 樹狀陣列 線段樹

字首和 應用 區間查詢,不涉及數的變化。求區間 l,r d的和 一維字首和 s i a 1 a 2 a i s i s i 1 a i 二維字首和 s i j 第 i 行第 j 列格仔左上部分所有元素的和 以 x1,y1 為左上角,x2,y2 為右下角 s x2,y2 s x2,y1 1 s x1 ...