破環成鏈,對於每個點的策略是找最後乙個能傳遞到的旗手,每個點都指向乙個特定的點,這樣形成了一棵樹。
如果father[x]傳遞到的最後乙個點是y,那麼x傳遞到的最後乙個點在x到y的路徑上,所以如果把一條鏈看成一段決策,那麼決策點所在的深度是不減的。
所以可以對樹進行dfs,維護乙個雙端佇列,每次暴力進出佇列,然後ans=dep[y]-dep[x]+1。
複雜度o(n)
還有一種倍增的寫法:f[i][k]表示按照上述方式傳遞,i傳遞2^k次的人,然後二分答案。
#include
#include
#include
#include
#define
ll long
long
#define
inf
1e9
#define
eps
1e-8
#define
md
#define
n 400010
using
namespace
std;
struct
yts e[
n];
struct
pp p[n
];
intv[
n],dep[n],
st[n],
ans[n],
w;
intm,
num;
bool
cmp(
pp a
,pp b
)
void
put(
intx
,int
y)
void
dfs(
intx
,int
h)
for(
inti=v
[x];i
;i=e
[i].ne
)
w
--;
}
int
main
()
;p[
i+n]=(
pp);
}
n
<<=
1;
sort(p
+1,p
+n+1
,cmp
);
intnow=1
;
for(
inti=1
;ii++)
n
>>=
1;
dep[2
*n]=1
;dfs(2
*n,1
);
for(
inti=1
;i<=n;
i++)
printf
("%d "
,ans[i
]);
printf
("\n"
);
return
0;
}
bzoj4444 Scoi2015 國旗計畫
題目傳送門 好題解法 因為區間互不包含。那麼左端點在區間內最右邊的的區間一定是當前區間能擴充套件到最遠的區間。這句話有點繞。舉個例子。假設當前區間為1 5。那麼我們往右擴充套件。找到左端點最右且小於等於5的區間。這個區間一定是最優解。因為區間互不包含啊。如果這個區間不是最優解的話那麼就被別的包含了。...
BZOJ4444 Scoi2015 國旗計畫
首先將座標離散化,因為區間互不包含,可以理解為對於每個起點輸出最少需要多少個戰士。將環倍長,破環成鏈,設 f i 表示區間左端點不超過 i 時右端點的最大值,可以通過 o n 遞推求出。那麼如果將 f i 看成 i 的祖先的話,它實際上形成了一棵以 2n 為根的樹。首先暴力計算出1號點的答案 t 設...
4444 Scoi2015 國旗計畫
time limit 20 sec memory limit 256 mb submit 246 solved 111 submit status discuss a國正在開展一項偉大的計畫 國旗計畫。這項計畫的內容是邊防戰士手舉國旗環繞邊境線奔襲一圈。這 項計畫需要多名邊防戰士以接力的形式共同完成...