CodeForces 522D 樹狀陣列

2022-08-19 18:48:29 字數 1168 閱讀 5543

//戳這裡:522d

思路:為了簡化問題我們先確定區間的右端,則需要先從右端最靠左的區間開始處理;處理某個區間時,我們將元素從 1 的位置處理到這個區間的右端(得到每個元素在其右側最近相同元素的距離),然後只需要從這個區間的左端遍歷到右端就能得到這個區間內的解。如果熟悉樹狀陣列性質的話可以方便的把這個 o(n) 的遍歷過程,優化成o(logn)。

//ps:用線段樹**貌似會長很多...

1 #include "

bits/stdc++.h"2

using

namespace

std;

3const

int maxn = 5e5 + 5;4

const

int inf = 0x3f3f3f3f;5

intn, m;

6int

ans[maxn], order[maxn], l[maxn], r[maxn];

7int

res[maxn];

8 mapmp;

9int

tr[maxn];

1011

bool cmp(int a, int

b)12

1516

intmain()

1723

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

2728 memset(tr, 0x3f, sizeof

(tr));

29 memset(res, 0x3f, sizeof

(res));

30 sort(order + 1, order + 1 +m, cmp);

31for(i = j = 1; i <= m; ++i)

39 mp[ans[j]] =j;

40 ++j;41}

42for(int k = l[o]; k <= r[o]; k += k&-k)

43 res[o] =min(res[o], tr[k]);44}

45for(i = 1; i <= m; ++i)

46 printf("

%d\n

", res[i] == inf? -1

: res[i]);

47 }

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...