JOISC2017C 手持 花火

2022-03-25 22:57:56 字數 1568 閱讀 3990

link

首先二分答案\(v\)。

考慮這樣乙個結論:最優解一定是\(k\)不動,其它人往\(k\)這裡跑,跑到了之後先不點燃,等\(k\)的位置上每有乙個人的火熄滅就點燃下乙個。

那麼如果我們能夠點燃區間\([l,r]\)的所有煙火,就需要存在乙個擴充套件路徑上的所有\(l,r\)滿足:

\[x_l+vt(r-l)\ge x_r-vt(r-l)

\]移項得

\[x_l-2vtl\ge x_r-2vtr

\]設\(a_i=x_i-2vti\),上式就是\(a_l\ge a_r\)

因此,存在一種點燃方案,等價於存在\(p_1\cdots p_n,p_1\cdots p_n\),使得\(p_1=p_1=k,p_n=1,p_n=n\),隨著\(i\)遞增每次\(p_i\)減一或者\(p_i\)加一,並且保證\(a_\ge a_\)。

也就是存在乙個擴充套件路徑使得路徑上的每對\(l,r\)滿足\(a_l\ge a_r\)。

假如我們現在有區間\([l,r]\),我們要對它擴充套件。

考慮如何擴充套件\(l\),若存在\(i\),使得

1:\(a_i\ge a_l\)。

2:\(\forall j\in[i,l],a_j\ge a_r\)。

條件2顯然是必須滿足的,條件一是為了使接下來\(r\)一定更遠。

那麼我們就可以進行一次把左端點擴充套件到\(i\)的擴充套件。

每次擴充套件時找到最右邊的能擴充套件的\(i\)即可。

擴充套件\(r\)也是同樣的操作。

如果某次我們\(l,r\)都沒有擴充套件,並且都是因為條件2不滿足,那麼這個\(v\)一定不合法。

如果是因為條件1不滿足,我們無能為力。

接下來考慮如何解決這個問題。

我們求出\(a_1\sim a_\)中最大值\(a_\)和\(a_\sim a_n\)中的最小值\(pr\)。

顯然如果我們能夠擴充套件到\([pl,pr]\),那麼接下來1條件一定不滿足,並且說明過程中2條件都滿足,這一部分是合法的。

我們再考慮將左端點\(l\)設為\(1\),右端點\(r\)設為\(n\),向內擴充套件。擴充套件過程就是上面的反過來。

如果我們還能擴充套件到\([pl,pr]\),那麼說明過程中2條件都滿足,也就是這個\(v\)合法。

我們要計算的有\(vti\),這個東西顯然可能爆long long。

我們注意到,當\(vt\ge10^9\)時,一定可以點燃所有烟花,所以一開始把二分的右端點設為\(\frac+1\)即可。

#include#define ll long long

#define mid ((l+r)>>1)

using namespace std;

namespace io

int read()

}using namespace io;

const int n=100007,inf=1e9;

int n,k,t,x[n];

ll a[n];

int check(int v)

for(l=1,r=n;l^ql||r^qr;)

return 1;

}int main()

SHOI 2017 分手是祝願

題目鏈結 演算法 首先發現 對於乙個開關 按下2次和沒按是等價的 因此每個開關最多按一次 考慮k n的情況 只需簡單倒序貪心即可 考慮隨機的情況 由觀察可知乙個開關不能由多個開關組合得到 用fi表示i次將所有開關變關到 i 1 次將所有開關變關的期望步數 有轉移方程fi i n 1 i n 1 fi...

4872 Shoi2017 分手是祝願

4872 shoi2017 分手是祝願 time limit 20 sec memory limit 512 mb submit 153 solved 109 submit status discuss description zeit und raum trennen dich und mich....

六省聯考2017 分手是祝願

展開 題目描述 zeit und raum trennen dich und mich.時空將你我分開。b 君在玩乙個遊戲,這個遊戲由 nn 個燈和 nn 個開關組成,給定這 nn 個燈的初始狀態,下標為從 11 到 nn 的正整數。每個燈有兩個狀態亮和滅,我們用 11 來表示這個燈是亮的,用 00...