給出一顆樹,每次選中m個點,對於樹上任意乙個點,會被其最近的乙個選中點包含(相同有編號小優先),求每個選中點包含了多少個點。
之前寫過兩次都沒寫部落格。。
結果複習板題的時候,連題意都不知道。。。
方法就是虛數板子
#include
#include
#include
#include
#define sf scanf
#define pf printf
#define maxn 300010
#define inf 0x3fffffff
using
namespace std;
typedef pair<
int,
int> pii;
int dfn[maxn]
,ncnt,q;
int dep[maxn]
,siz[maxn]
,ans[maxn]
,flag[maxn]
;int fa[maxn][20
];vector<
int> a[maxn]
,son[maxn]
;void
dfs(
int x,
int f=0)
}int
find_child
(int x,
int u)
pii near[maxn]
;void
get_near
(int x)
}void
get_near
(int x,pii upd)
}void
calc
(int x)
int tp=u;
int q=near[u]
.first;
int p=near[x]
.first;
int totlen=p+q+dep[u]
-dep[x]
;for
(int i=
19;i>=
0;i--)if
(totlen%2==
0&&ax(dep[u]
-dep[fa[tp][0
]]+q)*
2<=totlen)
tp=fa[tp][0
];ans[ax]+=
(siz[tp]
-siz[u]);
ans[bx]+=
(siz[sonc]
-siz[tp]);
} ans[near[x]
.second]
+=siz1;
}void
solve
(int rt)
bool
sort_by_dfn
(int x,
int y)
intlca
(int u,
int v)
return fa[u][0
];}int n,u,v,q,tot,rt;
int b[maxn]
,id[maxn]
,st[maxn]
,tp;
void
print
(int x)
intmain()
dfs(1)
;sf("%d"
,&q)
;for
(int i=
1;i<=q;i++
)sort
(b+1
,b+1
+tot,sort_by_dfn)
; tp=0;
st[++tp]
=b[1];
son[b[1]
].clear()
;for
(int j=
2;j<=tot;j++)
son[st[tp]].
push_back
(rt);}
st[++tp]
=b[j]
; son[b[j]].
clear()
;}while
(tp)
for(
int j=
1;j<=tot;j++
) ans[id[j]]=
0;solve
(rt)
;// print(rt);
for(
int j=
1;j<=tot;j++)pf
("%d "
,ans[id[j]])
;pf("\n");
}}
bzoj3575 Hnoi2014 道路堵塞
一開始看錯題啦!某一條邊不走的最短路相當於1 沿最短路 x y 沿最短路 n,於是 定義t,表示從起點到最短路上序號r有一條長度為l的非最短路。然後用堆維護即可。慎用memset。tle。include include include include include define n 100005 ...
bzoj3575 Hnoi2014 道路堵塞
總趕腳第二題總是比第三題難。好吧,這題一點思路都沒有 聽說用民科可以過掉大部分資料。我們發現刪邊後的路徑一定是這樣的 起點 若干個原最短路徑上的邊 若干個非最短路徑上的邊 若干個原最短路徑上的邊 終點 我們發現其實就是不走原最短路徑上的乙個區間,並且刪除的邊一定在這個區間上 我們按順序列舉邊,然後從...
bzoj3575 Hnoi2014 道路堵塞
題目鏈結 給出乙個有向圖和一條最短路,問最短路上任意一條邊斷掉,此時的最短路是多少。聽說這道題正解被江哥插了。右轉題解 lmy學長 平衡樹用堆就可以了。用棧來存要加入堆中的點,不然不好消除標記。bzoj3575 include include include include include incl...