清明夢超能力者黃YY 異或樹(線段樹合併)

2021-10-17 11:18:20 字數 4457 閱讀 2077

這題有點像【雨天的尾巴】【永無鄉】的結合版本,樹上差分,線段樹合併,權值線段樹查詢第k

kk大。

對於操作i

ii,我們可以對u

−>

vu->v

u−>

v路徑上的點,i

ii的權值加上1

11,然後線段樹合併,查詢第k

kk大就好了。

#include

using

namespace std;

const

int n =

1e5+10;

int head[n]

, to[n <<1]

, nex[n <<1]

, cnt =1;

int n, m, k, ans[n]

, root[n]

, value[n]

;int fa[n]

, top[n]

, dep[n]

, son[n]

, sz[n]

;int ls[n *60]

, rs[n *60]

, sum[n *60]

, tot;

void

add(

int x,

int y)

void

dfs1

(int rt,

int f)

dfs1

(to[i]

, rt)

; sz[rt]

+= sz[to[i]];

if(!son[rt]

|| sz[son[rt]

]< sz[to[i]])

}}void

dfs2

(int rt,

int tp)

dfs2

(son[rt]

, tp)

;for

(int i = head[rt]

; i; i = nex[i]

)dfs2

(to[i]

, to[i]);

}}intlca

(int x,

int y)

x = fa[top[x]];

}return dep[x]

< dep[y]

? x : y;

}void

push_up

(int rt)

void

update

(int

&rt,

int l,

int r,

int x,

int value)

if(l == r)

int mid =

(l + r)

>>1;

if(x <= mid)

if(x > mid)

push_up

(rt);}

intmerge

(int x,

int y,

int l,

int r)

if(l == r)

int mid =

(l + r)

>>1;

ls[x]

=merge

(ls[x]

, ls[y]

, l, mid)

; rs[x]

=merge

(rs[x]

, rs[y]

, mid +

1, r)

;push_up

(x);

return x;

}int

find_k_th

(int rt,

int l,

int r,

int k)

int mid =

(l + r)

>>1;

if(k > sum[ls[rt]])

return

find_k_th

(ls[rt]

, l, mid, k);}

void

dfs(

int rt,

int fa)

dfs(to[i]

, rt)

; root[rt]

=merge

(root[rt]

, root[to[i]],

1, n);}

if(k <= sum[root[rt]])

}int

main()

dfs1(1

,0);

dfs2(1

,1);

for(

int i =

1; i <= m; i++)}

dfs(1,

0);for

(int i =

1; i <= n; i++

)return0;

}

異或操作,容易想到拆位,然後依次算貢獻,然後注意同一顆子樹上相同的值如果出現了偶數次要相消,線段樹合併一下就好了。

#include

using

namespace std;

typedef pair<

int,

int> pii;

typedef

long

long ll;

const

int n =

1e5+10;

int head[n]

, to[n <<1]

, nex[n <<1]

, cnt =1;

int n, m, value[n]

, root[n]

;int ls[n *33]

, rs[n *33]

, sum[n *33]

, num[n *33]

[17], tot;

ll ans[n]

;vector ask[n]

;void

push_up

(int rt)

}void

update

(int

&rt,

int l,

int r,

int x)

if(l == r)

}else

}return;}

int mid = l + r >>1;

if(x <= mid)

else

push_up

(rt)

;return;}

intmerge

(int x,

int y,

int l,

int r)

if(l == r)

sum[x]

^= sum[y]

;return x;

}int mid = l + r >>1;

ls[x]

=merge

(ls[x]

, ls[y]

, l, mid)

; rs[x]

=merge

(rs[x]

, rs[y]

, mid +

1, r)

;push_up

(x);

return x;

}void

add(

int x,

int y)

ll query

(int rt,

int l,

int r,

int l,

int r,

int value)

if(l >= l && r <= r)

else

}return ans;

}int mid = l + r >>1;

ll ans =0;

if(l <= mid)

if(r > mid)

return ans;

}void

dfs(

int rt,

int fa)

dfs(to[i]

, rt)

; root[rt]

=merge

(root[rt]

, root[to[i]],

1, n);}

update

(root[rt],1

, n, value[rt]);

for(

auto it : ask[rt])}

}int

main()

for(

int i =

1; i < n; i++

)for

(int i =

1; i <= m; i++

)dfs(1

,0);

for(

int i =

1; i <= m; i++

)return0;

}

Applese的超能力

時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 輸入兩個整數n,m 1 n,m 109 10 7 no 首先我們可以知道當m 1時,只有n 1的時候才可以。當m 1時我們有兩種方法可以做。法1 融合硬幣的過程就是n ...

程式設計是一種超能力

programming is a super power 譯文由國內整理編譯 程式設計是一種超能力 在乙個科技和網際網路成為人們日常生活中不可或缺的重要元素的社會裡,會程式設計,就形同有了一種超能力。事實上,乙個程式設計師,不僅能得益於可以很容易的接觸到最新前沿科技,同時還可以利用這些技術把純粹的思...

程式設計是一種超能力

在乙個科技和網際網路成為人們日常生活中不可或缺的重要元素的社會裡,會程式設計,就形同有了一種超能力。事實上,乙個程式設計師,不僅能得益於可以很容易的接觸到最新前沿科技,同時還可以利用這些技術把純粹的思想轉變成像軟體這樣實實在在 有用的東西。我覺得沒有乙個能比可以去程式設計更令人興奮的時刻了。回顧在七...