Codeforces 703D 樹狀陣列

2021-07-16 06:43:47 字數 1276 閱讀 4386

codeforces 703d

題意:

給1e6長度的區間,每個單位代表乙個數。

給1e6個詢問,每次問區間內出現次數為偶數次的數異或和。

思路:

賽中的時候想莫隊水過去,結果pretest都沒過233

正解是樹狀陣列。首先假設是奇數次的話,就是乙個簡單字首和。現在偶數次,有乙個處理技巧就是記錄這個區間出現過的數字的異或和。然後就是明顯的樹狀陣列統計題。

嘗試用線段樹寫,但是沒有成功。

**:

#include 

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 1e6 + 5;

int dp[maxn], n;

int lowbit(int x)

void add(int u, int v)

int query(int u)

return res;

}struct query

query(int _l, int _r, int _id): l(_l), r(_r), id(_id){}

}que[maxn];

bool cmp(query q1, query q2)

int a[maxn];

int query(int o, int l, int r, int l, int r)

}int ans[maxn], sum[maxn];

mapvis;

int main()

vis.clear();

int r = 0, l = 1;

sort(que, que + q, cmp);

for(int i = 0 ; i < q ; i++)

}// printf("que = %d %d %d\n", que[i].l, que[i].r, que[i].id);

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

}for(int i = 0 ; i < q ; i++) printf("%d\n", ans[i]);

}return

0;}

codeforces686D(樹的重心)

題意 求出以每個點為子樹的重心。思路 可以利用重心的性質,某乙個點的重心在最大的點那個子樹上,並且在在這個節點到最大子樹的重心之間,重心滿足num x 2 num u x為重心,u為要求重心的節點,num代表這個節點的子樹的節點個數。includeusing namespace std typede...

Codeforces 755D(思維 線段樹)

從x到x k點,其實只要求從x到x k之間的點有多少條線超過x x k這條線就行,一開始直接暴力,就時間超時了,而用線段樹維護就快多了。1 include 2 using namespace std 3 typedef long long ll 4 define n 1000010 5 define...

CodeForces 686D 樹的重心

傳送門 題意 給你n個節點,其中1為根,第二行給你2 n的節點的父親節點編號。然後是q個詢問,求詢問的節點為根的重心的節點編號。思路 利用樹的重心的乙個性質 樹的重心在 根節點 和 根節點的最大子結點的重心 之間。並且2 cnt v cnt u u為根節點,v為重心 include includeu...