BZOJ4444 Scoi2015 國旗計畫

2021-09-07 06:14:49 字數 826 閱讀 5728

首先將座標離散化,因為區間互不包含,可以理解為對於每個起點輸出最少需要多少個戰士。

將環倍長,破環成鏈,設$f[i]$表示區間左端點不超過$i$時右端點的最大值,可以通過$o(n)$遞推求出。

那麼如果將$f[i]$看成$i$的祖先的話,它實際上形成了一棵以$2n$為根的樹。

首先暴力計算出1號點的答案$t$,設$l=t-1$。

然後dfs這棵樹,用乙個棧按深度依次儲存每個點到根路徑上的點。

對於乙個點,只需要從$l$開始暴力列舉答案,然後$o(1)$檢驗即可。

因為每個點的答案相差不超過1,所以除去離散化後,整個演算法的時間複雜度為$o(n)$。

#include#include#define n 400010

int n,m,i,x,y,l,a[n/2][2],b[n],st[n/2],f[n*2],g[n*2],nxt[n*2],q[n*2],t,ans[n];

inline void read(int&a)

inline int lower(int x)

inline void up(int&x,int y)

for(int i=g[x];i;i=nxt[i])dfs(i);

t--;

}int main()

for(i=1;i<=m+m;i++)up(f[i],f[i-1]);

for(i=1;ifor(l=-1,i=1;i<=m;i=f[i])l++;

dfs(m+m);

for(i=1;i<=n;i++)printf("%d ",ans[st[i]]);

return 0;

}

bzoj 4444 Scoi2015 國旗計畫

破環成鏈,對於每個點的策略是找最後乙個能傳遞到的旗手,每個點都指向乙個特定的點,這樣形成了一棵樹。如果father x 傳遞到的最後乙個點是y,那麼x傳遞到的最後乙個點在x到y的路徑上,所以如果把一條鏈看成一段決策,那麼決策點所在的深度是不減的。所以可以對樹進行dfs,維護乙個雙端佇列,每次暴力進出...

bzoj4444 Scoi2015 國旗計畫

題目傳送門 好題解法 因為區間互不包含。那麼左端點在區間內最右邊的的區間一定是當前區間能擴充套件到最遠的區間。這句話有點繞。舉個例子。假設當前區間為1 5。那麼我們往右擴充套件。找到左端點最右且小於等於5的區間。這個區間一定是最優解。因為區間互不包含啊。如果這個區間不是最優解的話那麼就被別的包含了。...

4444 Scoi2015 國旗計畫

time limit 20 sec memory limit 256 mb submit 246 solved 111 submit status discuss a國正在開展一項偉大的計畫 國旗計畫。這項計畫的內容是邊防戰士手舉國旗環繞邊境線奔襲一圈。這 項計畫需要多名邊防戰士以接力的形式共同完成...