具體見**:
1 #include 2using
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 ...