這題有點像【雨天的尾巴】【永無鄉】的結合版本,樹上差分,線段樹合併,權值線段樹查詢第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 譯文由國內整理編譯 程式設計是一種超能力 在乙個科技和網際網路成為人們日常生活中不可或缺的重要元素的社會裡,會程式設計,就形同有了一種超能力。事實上,乙個程式設計師,不僅能得益於可以很容易的接觸到最新前沿科技,同時還可以利用這些技術把純粹的思...
程式設計是一種超能力
在乙個科技和網際網路成為人們日常生活中不可或缺的重要元素的社會裡,會程式設計,就形同有了一種超能力。事實上,乙個程式設計師,不僅能得益於可以很容易的接觸到最新前沿科技,同時還可以利用這些技術把純粹的思想轉變成像軟體這樣實實在在 有用的東西。我覺得沒有乙個能比可以去程式設計更令人興奮的時刻了。回顧在七...