tree 1s 128m by hzw
czy神犇種了一棵樹,他想知道地球的質量
給定一棵n個點的樹,求樹上經過點的個數≥k的路徑數量ans
對於部分資料,樹上某兩點間會多出最多一條無向邊
輸入資料
n,m,k
接下來n行,每行u,v表示u與v間有無向邊連線
輸出資料
ans樣例資料
input
5 5 2
1 32 4
3 54 1
5 2output
20資料範圍
30%的資料n,m<=5000
100%的資料n,m<=100000
其中有50%的資料滿足m+1=n,具體如下
測試點前3個小資料1樹2鏈 3環+外向樹
後7個大資料4-6樹 7-8環 9-10環+外向樹
如果沒有環,那就是經典點分治題目啦。
題目保證有且只有乙個環,那麼我們先隨便拆掉環上的一條邊,然後用點分治算出不經過這條邊的滿足題意的路徑數量。
ans需要加上經過這條邊的滿足題意的路徑數量。
這個怎麼求呢?
看我醜醜的圖。。
環可以用並查集判斷(注意每次更新fa[x]不然容易暴棧),要刪的邊就直接不要插入。
樹狀陣列用來判斷》=x的有多少個,注意0會死迴圈,加個偏移量,負數就直接公升到1。
**:
1 #include2 #include3 #include4 #include5 #include6posted @using
namespace
std;
78 typedef long
long
ll;9
const
int n=100010;10
intn,m,k,cx,cy,cl,tl,sl,len,has_circle;
11int
first[n],c[n],s[n],t[n],d[n],mark[n],size[n],f[n],cir[n];
12struct
nodea[2*n];
15ll ans;
1617
bool cmp(int x,int y)
1819
void ins(int x,int
y)20
2425
int findfa(int
x)26
3031
void add(int x,int
val)
3236
int getsum(int
x)37
4445
void find_root(int x,int fa,int tot,int &root)
4657
if(bk && 2*(tot-size[x])<=tot) root=x;58}
5960
void dfs(int x,int fa,int
tmp)
6167 t[++tl]=d[x];
68 size[x]=1;69
for(int i=first[x];i;i=a[i].next)
7076}77
78void dfs(int x,int
tot)
7994}95
for(int i=1;i<=sl;i++) add(s[i],-1
);96
for(int i=first[x];i;i=a[i].next)
97102
}103
104void find_circle(int x,int
fa)105
107for(int i=first[x];i;i=a[i].next)
108113
}114
}115
116void
solve_circle()
117141
}142
143int
main()
144165
else
166170
}171
//for(int i=1;i<=len;i+=2) printf("%d --> %d\n",a[i].x,a[i].y);
172 dfs(1
,n);
173if
(has_circle) solve_circle();
174 printf("
%lld\n
",ans);
175return0;
176 }
2016-11-10 15:12
攔路雨偏似雪花 閱讀(
...)
編輯收藏
bzoj3648 寢室管理 環套樹 點分治
題目描述 t64有乙個好朋友,叫t128。t128是寄宿生,並且最近被老師叫過去當宿管了。宿管可不是一件很好做的工作,碰 巧t128有乙個工作上的問題想請t64幫忙解決。t128的寢室條件不是很好,所以沒有很多錢來裝修。禮間寢室僅由n 1條雙向道路連線,而且任意兩間寢室之間都可以互達。最近,t128...
bzoj3648 寢室管理 樹分治
題目大意 給一顆基環樹,求所有長度大於等於k的路徑。題目分析 如果沒有環,只有樹的話,只要裸上樹分治就可以了。有環的話我們就先把環上的一條邊去掉,然後做樹分治。這樣我們就統計出了所有不經過這條邊的路徑樹,還剩下所有經過這條邊的路徑數。我們此時處理出以環上所有點位根的子樹資訊,並將其合併。然後每次去掉...
BZOJ3648 寢室管理(點分治 bit)
傳送門 sunshine學長去年的互測題orz 然而他給的solution除了點分和bit什麼都沒說啊。硬著頭皮想吧,反正我知道要用bit了。如果是樹的話點分治 二分或者bit就能搞定 如果是環套樹的話怎麼辦捏 首先考慮不經過環的答案,直接在外向樹上點分就行了 然後考慮經過環的答案 假設當前外向樹上...