題解 SBCOI2020 一直在你身旁

2022-05-01 19:30:09 字數 1083 閱讀 9827

題目傳送門

給出乙個長度為 \(n\) 的單調不減的序列,每次可以選出乙個點,產生貢獻 \(a_k\),我們可以得知我們需要找到的數是否大於 \(k\)。問找到要找到的數最小花費。

\(n\le 7100\)

\(\theta(n^3)\) 的 \(\text\) 顯然,可以設 \(f_\) 表示答案在 \([l,r]\) 區間時找到答案最小貢獻。可以得到轉移式:

\[f_=\min_\,f_)+a_k\}

\]然後我們經過思考,發現以下事情:

於是,我們可以把問題拆成兩個部分進行考慮。

\(k< w_\)

對於這一部分,我們觀察到式子可以改寫為:

\[f_=\min_\)

對於這一部分你發現式子可以改寫為:

\[f_=\min_\le k\le r}\+a_k\}

\]然後你發現 \(f_+a_k\) 隨著 \(k\) 的增大而增大,所以最優貢獻點一定是在 \(w_\)。

綜上,可以列舉 \(r\) 然後使用單調佇列優化即可,時間複雜度 \(\theta(n^2)\)。

#include using namespace std;

#define int register int

#define int long long

#define maxn 7105

template inline void read (t &t)while (c >= '0' && c <= '9') t *= f;}

template inline void read (t &t,args&... args)

template inline void write (t x)if (x > 9) write (x / 10);putchar (x % 10 + '0');}

int n,head,tail,a[maxn],q[maxn],f[maxn][maxn];

void ins (int k,int r)

signed main()

} write (f[n][1]),putchar ('\n');

} return 0;

}

一直在流浪

人生是一場旅途,我們一直在流浪。沿途的美景轉瞬即逝,唯有往事如影隨行。總在平衡,追蹤夢裡的畫面,現實還是幻覺,誰又能察覺?迷一樣的歲月,在旅途中丟失方向。茫然若失的不知所措,驚慌失措的無計可施。揮一揮拳頭,砸向深邃的夜空,迷茫的心境。總是努力不敢如此窘迫,而事實卻總是出乎意料的背道而馳,難道命硬的人...

一直在出差。。。

一直在出差,工作地方沒有外網,而且幹的活裡面沒有什麼新的技術,基本都是用最基本的android的知識,所以也就沒有想著來寫部落格。最近不太忙了,來csdn看看新知識,提高下水平,感覺和網際網路脫軌了已經。回顧下最近提高的地方吧 socket,tcp之類的有了進一步的認識,對資料的操作,檔案的操作,對...

30期 一直在忙碌 一直都不孤單

一下子發現自己來京學習已經兩個月了,想想也是,就是這麼不經意。當初,雲裡霧裡似的獨自來到北京,來到曾經陌生的 lamp,兄弟連 但這是個正確的衝動。到了兄弟連,一切從新開始。發現這裡沒有了以前學校裡的樂趣,不准玩手機,不准看電影,不准玩遊戲,不准睡覺,沒有人談論課後去 玩,沒有人談論流行,沒有人談論...