d es
crip
tion
description
descri
ptio
n 求樹上不經過給定數對的路徑數對個數
資料範圍:
節點個數n≤1
05n\leq 10^5
n≤10
5,給定數對個數:m≤1
05m\leq 10^5
m≤105sol
utio
nsolution
soluti
on考慮從樣例中剖析題目
注意這棵樹是無根的,這裡只是為了方便表示所以1為根
不能經過的點對分別是
2,34,8
6,7若莫得約束條件,總方案自然是cn2
c_n^2
cn2
,考慮每組約束條件帶來的影響
2,3影響為:siz
e[2]
×siz
e[3]
=4×3
=12size[2]\times size[3]=4\times 3=12
size[2
]×si
ze[3
]=4×
3=12
4,8影響為:6(除4,8以外的點都不能到8)
6,7影響為:siz
e[4]
×siz
e[7]
=2×1
=2size[4]\times size[7]=2\times 1=2
size[4
]×si
ze[7
]=2×
1=2
總影響為:12+8+2=22
所以答案應該是:28-22=6?
但樣例給的卻是11?
<1,2>,<1,3>,<1,4>,<1,5>,<1,6>,<1,7>,<2,4>,<2,5><3,6><3,7>,<4,5>
原來是4,8影響的多算了,因為2,3這個數對分掉了過來的3條,所以答案仍然是11
注意到當x,y
x,yx,
y莫得祖先關係時,影響就是它們子樹大小的積,否則就設祖先為u
uu,後代為v
vv,不合法範圍為v
vv的子樹內和整棵樹減去u
uu含v
vv的兒子的子樹
容斥注意到是乙個二維的關係,將它放到平面直角座標系中用掃瞄線+線段樹解決即可
時間複雜度:o(m
logn
)o(mlogn)
o(mlog
n) cod
ecode
code
#pragma gcc optimize(2)
#include
#include
#include
#define n 100010
using
namespace std;
int n,m,cnt,dfn[n]
,rfn[n]
,ed[n]
,dep[n]
,f[n][21
];inline
long
long
read()
struct xds
inline
void
modify
(int ql,
int qr,
int d,
int k=1,
int l=1,
int r=n)
int mid=l+r>>1;
if(ql<=mid)
modify
(ql,qr,d,lson,l,mid);if
(qr>mid)
modify
(ql,qr,d,rson,mid+
1,r);up
(k,l,r)
;return;}
#undef lson
#undef rson
}t;struct tl
e[n<<1]
;inline
void
add(
int u,
int v)
;l[u]
=tot;
return;}
inline
void
dfs(
int x)
ed[x]
=cnt;
return;}
inline
intlca
(int x,
int y)
}gt;
struct nodesec[n<<2]
;int tot;
inline
void
add(
int x1,
int x2,
int y1,
int y2)
; sec[
++tot]
=(node)
;return;}
inline
bool
cmp(node x,node y)
long
long ans;
signed
main()
else
add(rfn[x]
,ed[x]
,rfn[y]
,ed[y]);
}sort
(sec+
1,sec+
1+tot,cmp)
;for
(register
int i=
1,j=
1;i<=n;i++
)printf
("%lld\n",(
long
long
)n*(n-1)
/2-ans)
;}
jzoj 6296 NOIP提高組A 投票
詳見oj 考場就剛 t1 了。首先打了個暴力 dfs 列舉選哪些數,然後 k 2dp 求出答案。設 f i j 表示前 i 個人有 j 個選好的方案數。答案即為 f k k 2 從題解發現,選的人是一段字首和一段字尾。茹氏證明 我們可以固定 k 1 個人以及他們選什麼。我們設 s1 表示有 k 2 ...
NOIP提高組 矩陣
在麥克雷的面前出現了乙個有n m個格仔的矩陣,每個格仔用 或 表示,表示這個格仔可以放東西,則表示這個格仔不能放東西。現在他拿著一條1 2大小的木棒,好奇的他想知道對於一些子矩陣,有多少種放木棒的方案。因為棍子是1 2的,所以很容易就能發現,兩個被分割的塊,除了跨越兩個塊擺放木棍的方案數會對答案有影...
NOIP提高組2005 過河
過河 river 問題描述 在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l 其中l是橋的長度 座標為0的點表示橋的起點,座標為l的...