CodeForces 877E DFS序 線段樹

2022-03-16 22:43:06 字數 1279 閱讀 5566

就是樹上有n個點,然後每個點都有一盞燈,給出初始的狀態,1表示亮,0表示不亮,然後有兩種操作,第一種是get x,表示你需要輸出x的子樹和x本身一共有幾個燈是亮的。pow x,表示你需要改變x的子樹和x本身上的燈的狀態。

這個題肯定是用dfs序了,為啥?因為樹不好操作啊(我也不會啊),使用dfs序可以把樹壓成一維的一串數,這樣就可以使用線段樹來進行區間操作了。

話說這個題是我暑假限時訓練中做的,看到這個題老開心了,但是讓我萬萬沒想到的是,這個題我交了11次才過,太心酸了。

#include#include#include#include#include#includeusing namespace std;

const int maxn=2e5+100;

struct nodet[maxn<<2];

vectorg[maxn];

int num[maxn];

int in[maxn], out[maxn], rk[maxn], cnt;

int n, m;

void dfs(int u, int fa) //

void down(int rt)

void update(int rt, int l, int r)

down(rt);

int mid=(t[rt].l+t[rt].r)>>1;

if(l<=mid) update(rt<<1, l, r);

if(r>mid) update(rt<<1|1, l, r);

up(rt);

}int query(int rt, int l, int r)

int ans=0;

down(rt);

int mid=(t[rt].l+t[rt].r)>>1;

if(l<=mid) ans+=query(rt<<1, l, r);

if(r>mid) ans+=query(rt<<1|1, l, r);

return ans;

}void init()

}int main()

return 0;

} for(int i=2; i<=n; i++)

dfs(1, 0);

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

build(1, 1, n);

scanf("%d", &m);

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

else

}} return 0;

}

Codeforces 976E 題解報告

1 當把所有的倍數2 a都加到同一health上,health增加的最多 2 先計算每乙個creature的hp dmg,按該值對所有的creature排序 再求和,i include using namespace std const int n 200 1000 9 int hp n dmg n...

codeforces 1030E 暴力 思維)

題目 題意 給定一些數,可將區間 l r 中某些數的二進位制位的1的位置更換,使得最終區間所有數異或和為0,求這樣的區間個數。思路 在那裡瞎dp了好久,wa的很徹底,借鑑了一下別人的思路。區間合法的條件是 這個區間1的個數為偶數,並且區間中二進位制位1最多的乙個數的二進位制個數小於等於和的一半。我們...

Codeforces 1270E 構造 數學

有 n 個二維平面上的點,每兩個點之間連一條線段,將這些點劃分為兩個非空的集合 a b 同乙個集合內的兩點之間線段用黃色標註,不同集合的兩點之間線段用藍色標註,使距離相同的線段顏色相同。先將所有點的座標以其中乙個點作為原點轉化一下,使其中必定有乙個點是 0,0 然後將所有點按奇偶分為四組 0代表偶數...