退役前的最後的作題記錄upd:2019.04.04

考試考到自閉,天天被吊打。
還有幾天可能就要AFO了呢。。。php

Luogu3602:Koishi Loves Segments

從左向右,每次刪除右端點最大的便可。算法

[HEOI2014]南園滿地堆輕絮

答案必定是 \(\lceil \frac{max_{1\le i < j \le n}(a_i-a_j)}{2} \rceil\)
能夠考慮一個二分答案 \(mid\),那麼每一個數 \(x\) 都是一個 \([x-mid,x+mid]\) 的範圍。
當前面有一個 \(y\) 使得 \(y-mid>x+mid\) 時不合法。
而後答案就是最開始的東西了。數組

UOJ244:【UER #7】短路

能夠發現路徑必定對稱,枚舉在哪一個繞半圈,以前必定每一個都走過兩次,每次確定會多走前綴最小值,因此直接加上便可。網絡

Atcoder ???:D Four Coloring

爲了方便轉成切比雪夫距離。
每一個 \(d\times d\) 的矩陣染一樣的顏色,每次換顏色便可。函數

Codeforces 734F:Anton and School

\((a|b)+(a\& b)=a+b\),所有加起來就能夠手動解方程了。
注意還要代回去驗證。優化

Atcoder ???:J Farm Village

模擬費用流。正確性:匹配不會交叉,因此匹配過的不會同時返悔向後匹配。spa

[JXOI2017]加法

二分答案以後從前日後貪心,每次選擇右端點最大的區間加入。.net

BZOJ3709: [PA2014]Bohater

\(a-d>0\) 的時候,確定是按照 \(d\) 從小到大打。
不然,由於最後的血量是必定的,那麼直接倒過來向上面同樣打便可。設計

Codeforces 720A:Closing ceremony

把左邊每一個人按照體力值排序。
把每一個空位按照到左邊的距離排序。
左邊人依次選擇,確定選到右邊距離最大的空位置。
而後右邊隨便貪心便可。code

[AHOI2014/JSOI2014]宅男計劃

三分最後要買的外賣數量。
而後考慮每次外賣怎麼買,首先確定是先買便宜的,買到保質期個。
那麼從小到大考慮每一個食物,若是能使全部次外賣的存活天數增大就買到最多能增大的天數個。
買不了了就能買則買。

BZOJ3716: [PA2014]Muzeum

能夠經過倍長座標軸使得角度變成 \(\frac{\pi}{2}\)
而後旋轉使得變成一個向右下的矩陣。
這個東西就是一個最大權閉合子圖。
考慮模擬網絡流(?),按照 \(y\) 從小到大加入每個手辦和警衛,插入警衛 \((x_0,y_0)\) 的時候按照 \(x,x\le x_0\) 從小到大依次流流量,流滿了就刪除。

BZOJ2034: [2009國家集訓隊]最大收益

模擬二分圖最大權匹配(?)。
首先能夠縮小位置的規模,每一個區間(左端點小到大)向右找到第一個沒有染色的點染色,這樣染色過的點纔有可能匹配。
而後按照權值從大到小增廣,嘗試每一個位置,若是沒有匹配就成功,若是這個位置匹配的區間右端點小於等於當前的點,那麼尋找下一個;不然用這個位置的匹配去尋找(這樣才更有可能找到)。

牛客Wannafly挑戰賽27:E 黃魔法師

考慮用 \(2,98,14\) 這些數字構造答案。
這些數字中 \(14+2=16,14+98=112\),那麼 \(14+98\) 不是徹底平方數。
因此能夠找到一個最小的數 \(m\),使得 \(\frac{m(m-1)}{2}\ge k\)
所有填 \(2\),多的用 \(98\) 換,最後換個 \(14\) 便可。

UOJ143:【UER #5】萬聖節的數列

首先兩個位置的和相同的等差子序列不管如何都消不掉,不用管這些。
剩下的等差子序列是能夠構形成沒有的。
考慮對其奇偶分紅兩組,那麼剩下的等差子序列只可能出如今每一個組內。
而每一個數除掉 \(2\) 後等差子序列仍然等差,因此遞歸處理便可。

[CEOI2011]Hotel

考慮將訂單按價格從高到低排序,而後按順序安排最便宜房間並求出收益。取出前 \(o\) 大就是答案。
安排最便宜房間能夠二分+並查集維護刪除。
由於若是房間有衝突,顯然會知足價格最高的;若是 \(2\) 個訂單對 \(2\) 個房間能夠任意分配,那麼不會影響答案。
注意安排的時候要求,收益大於 \(0\)

BZOJ2124: 等差子序列

考慮枚舉等差子序列 \((a,x,2\times x - a)\) 中間的 \(x\)
若是長度不能大於 \(2\),那麼就必須知足 \(a\)\(2\times x-a\)\(x\) 以前或以後出現。
也就是說把前面小於 \(x\) 的數的存在性寫成一個 \(0/1\) 序列 \(a\),和大於 \(x\) 的數寫成一個 \(0/1\) 序列 \(b\)
那麼知足 \(b\) 倒過來和 \(a\) 相等時就不會出現長度大於 \(2\) 的。
因此直接樹狀數組維護 \(hash\) 便可。

BZOJ 2907: 拜訪神犇

枚舉最後的終點,能夠肯定最開始的方向,分紅三段,除了起點到終點的這一段之外,其它段的答案肯定。
因此把間隔拿出來排序取出前 \(k\) 小便可,用線段樹或者優先隊列便可。

Luogu5273:【模板】多項式冪函數 (增強版)

能夠把前面的 \(0\) 項先去掉,最後補 \(m\)\(0\)
注意到求 \(ln\) 要求常數項爲 \(1\),那麼能夠先乘個逆元,最後乘回來便可。

Codeforces 1111D:Destroy the Colony

能夠設計一個揹包 \(f_i\) 表示選了 \(i\) 個字符的方案數,每次枚舉一個字符,加入這個字符的個數。
答案就是強制不選 \(x,y\) 兩種字符的方案數以後乘上可重組合便可。
能夠預處理答案,枚舉 \(x,y\),作逆 \(dp\) 便可。

Codeforces 1111E:Tree

按照劇本先創建虛樹,而後從 \(r\) 開始 \(dfs\)
\(f_{i,j}\) 表示到了點 \(i\) ,分紅了 \(j\) 個組的方案數。
從子樹向上合併考慮很是麻煩,考慮按照 \(dfs\) 序作。
那麼這個點要麼新建一個組;
要麼選一個組加入,而選擇的組不能包含以前已經插入過了的祖先,而祖先們顯然也不在一個組,因此直接減去這些組便可。

Educational Codeforces Round 57 (Rated for Div. 2)E/F/G

E
枚舉分數,枚舉相同的人數,容斥計算出把 \(n\) 分給 \(m\) 我的,每一個人不超過 \(lim\) 的方案數。
F
指望的線性性,求出每一個逆序對的貢獻便可。
G
多項式快速冪模板題。

Codeforces Hello 2019D/E/F/G

D
能夠把操做當作是對每一個質數的指數操做,那麼就能夠質數分開獨立計算(積性函數)。
每一個質數分別暴力 \(dp\) 便可。
E
能夠發現 \(f(n) = k − 1\),其中 \(k = min\){\(x|\frac{x(x+1)}{2}> n\)}。
考慮證實同時構造答案。
對於長度爲 \(n\) 的序列,設其 \(LIS\) 長度爲 \(len\)
\(len \le K\), 則 \(n − len < \frac{K(K+1)}{2}-K=\frac{K(K-1)}{2}\)
\(len < K\), 根據 \(Dilworth\) 定理,能夠用 \(< K\) 個降低序列覆蓋, 只須要把以 \(i\) 相同的長度的點分紅一組便可
F
除了操做 \(3\) 均可以 \(bitset\)
如今要維護
\[C_i=\sum_{gcd(j,k)=i}A_jB_k\]
類比 \(FWT\),只要求出 \(A'_i=\sum_{i|d}A_d\)
就能夠直接按位相乘了
求答案就是莫比烏斯反演,\(A_i=\sum_{i|d}\mu(\frac{d}{i})A'_i\)
把每一個數字的 \(\mu\)\(bitset\) 預處理出來,乘法就是 \(and\)
最後用 \(count\) 統計答案
G
對於 \(x^k\)
二項式定理展開,通常須要 \(k^2\) 卷積合併。
而斯特林展開後,只須要求 \(\binom{x}{i}\) 之類的東西,通常能夠進行 \(O(k)\) 遞推。
這題就是
\(\sum_{i=1}^{k}\binom{f(X)}{i}i!\begin{Bmatrix}k\\i\end{Bmatrix}\)
考慮計算 \(\binom{f(X)}{i}\) 便可。
這個東西就是在一棵虛樹上選出 \(i\) 條邊的方案數。
能夠樹 \(dp\),設 \(f_{u,i}\) 表示當前到了 \(u\),虛數內選擇了 \(i\) 條邊的方案數。
合併兒子的時候注意一些子樹內必須選點才能構成虛樹,要減去空集的方案。
計算的時候考慮清楚便可。
不難證實複雜度爲 \(O(nk)\)

LOJ2396:「JOISC 2017 Day 3」長途巴士

對於全部的東西按照 \(mod~T\) 排序。
考慮 \(i\) 次和 \(i+1\) 次飲水,若是中間有一個站點,那麼一個以 \(i\) 結尾的後綴都是能夠下車的。
能夠設計一個 \(dp\)\(f_i\) 表示前 \(i\) 次飲水,把每個 \(T\) 的事情一次作完,轉移能夠斜率優化。

TopCoder SRM720 Div 1:ExtremeSpanningTrees

不難發現就是給定了一些形如 \(D_i\le D_j\) 的限制。
\(\sum_{i=1}^{m} |D_i - w_i|\)
顯然 \(D\) 只多是出現過的 \(w\)
首先考慮 \(1\le w_i\le 2\),只有兩種取值,最小割 \(S\) 表示 \(1\)\(T\) 表示 \(0\),建圖便可。
對於 \(1\le w_i\le 10^9\)
首先答案確定是關於 \(D_i\) 的一次函數加起來,考慮總體二分。
對於全部小於等於 \(mid\)\(w\) 當作是 \(1\),大於的爲 \(2\),用上面的建圖便可。
\(S\) 在同一集合的顯然大於 \(mid\) 不優秀,不在的同理,分治便可。

TopCoder TCO2018 Algo Onsite Final:Div1:BalancingTrees

最優策略下能夠只改變葉子,只須要把父親的改變均分給兒子便可。
那麼每一個葉子都是一個關於總和的一次函數。
總的代價確定也是一個分段一次函數,而且是凸的。
三分便可。
upd:貌似不用三分,直接排序枚舉答案便可,相似中位數。

[NOI2018]冒泡排序

本身yy了一個複雜的一批的方法QwQ
能夠發現與一個位置 \(i\) 有關的逆序對的個數 \(\ge |p_i-i|\)
顯然一個排列合法就要要求與每一個位置有關的逆序對的個數 \(= |p_i-i|\)
也就是說對於 \(p_i<i\) 的,要求 \(i\) 後面的 \(p\) 都大於 \(p_i\),對於 \(p_i>i\) 的,要求前面的 \(p\) 都小於 \(p_i\)
那麼就是不存在一個不以 \(i\) 爲開頭或結尾的的遞減子序列,也就是遞減子序列長度不超過 \(2\)
考慮沒有字典序限制怎麼計算。
能夠考慮從小到大依次加入數字,能夠發現會造成不少空位。其中有一個前綴的空位置,若是加入了當前的數字,會使降低序列長度變成 \(2\),不妨認爲這種位置是特殊的。
那麼顯然若是要放在這些特殊的位置就只能在第一個,不然能夠放在一個其它位置並把這個位置以前的位置變成特殊的。
那麼能夠設計狀態 \(f_{i,j}\) 表示從小到大前 \(i\) 個數放完,有 \(j\) 個特殊位置的方案數。
轉移顯然是 \(f_{i,j}=f_{i-1,j+1}+\sum_{k=0}^{j}f_{i-1,k}\)
\(g_{i,j}=\sum_{k=0}^{j}f_{i,k}\)
那麼 \(g_{i,j}=g_{i,j-1}+g_{i-1,j+1}\)
能夠當作是網格圖上一個點 \((x,y)\) 每次可使得 \(y+1\) 或者 \(x+1,y-1\),從 \((0,0)\) 最後到 \((n,0)\) 的方案數。
也就是 \((x,x+y)\) 每次能夠走到 \((x,x+y+1)\) 或者 \((x+1,x+y)\),從 \((0,0)\)\((n,n)\) 的方案數,要求 \((a,b)\) 知足 \(b\ge a\),即不通過 \(y=x-1\)
這是個經典組合問題,對稱相減便可。
考慮利用上面的東西計算最終答案。
枚舉排列 \(p\) 的前 \(i-1\) 位和給定的排列 \(q\) 相同,而且 \(p_i>q_i\)
分狀況:
若是前 \(i-1\) 位已經不合法就結束了。
若是前 \(i-1\) 位存在一個逆序對 \((x,y)\),使得 \(<y\) 的還有數沒有出如今前面一樣也結束了。
不然,那些小於 \(max\{max_{k=1}^{i-1}\{q_k\},q_i+1\}\) 的沒有在前面出現的數顯然只能遞增的排列,設這樣的數有 \(k\) 個。
考慮用以前的 \(dp\) 計算,也就是給以前的 \(f\) 賦值,即 \(f_{k,i}=\binom{k-i+2}{i-1}\),也就是枚舉強制 \(k\) 個遞增後有多少特殊位置,而且要求第一個位置必須爲空。
這個東西就是網格圖上 \((1,k+1)\)\((k,k+i)\) 的格路數。
因爲要求出 \(g\)\(f\) 的前綴和,\(g_{k,i}\) 也就是 \((0,k+1)\)\((k,k+i)\) 的格路數。
那麼答案就變成了 \((0,k+1)\)\((n-i+1,n-i+1)\),不通過 \(y=x-1\) 的格路數,直接組合數計算。

LOJ2834:「JOISC 2018 Day 2」修行

神仙的一批。
至關因而要求有多少排列 \(P\) 知足 \(P_i>P_{i+1}\) 的位置數剛好爲 \(k−1\)
等價於求 \(n\)\([0,1)\) 隨機變量 \(v_i\),知足剛好 \(k-1\) 個知足 \(v_i>v_{i+1}\) 的機率 \(\times n!\)
等價於 \(n\)\([0,1)\) 隨機變量 \(b_i\)\(a_i\) 對應 \(b_i\) 前綴和的小數部分,知足 \(k-1 \le \sum b_i \ge k\)
容斥有多少個 \(b_i\ge 1\),而後就變成了求 \(n\)\([0,+\infty)\) 隨機變量之和 \(<k\) 的機率,這個機率等於 \(\frac{k^n}{n!}\)
詳見官方題解。

Codeforces 906E:Reverses

\(S\)\(T\) 插空,問題變成劃分紅長度爲偶數的迴文串的問題。
利用 \(PAM\) 上回文串長度不超過 \(log\) 進行 \(DP\)

Codeforces 611H:New Year and Forgotten Tree

首先確定要把相同的長度的邊連成鏈,縮起來,設爲關鍵點。
若是最終方案存在不一樣長度的非關鍵點之間連邊,那麼顯然能夠更換連邊方式使得這條邊替換成關鍵點和非關鍵點的邊。
因此如今只有兩種邊,一個是關鍵點之間的邊,一個是非關鍵點和關鍵點之間的邊。
能夠枚舉關鍵點之間的邊(\(prufer\) 序列),而後對於非關鍵點和關鍵點之間的邊:一條邊 \((a,b)\) 要麼連 \(a\) 的關鍵點和 \(b\) 的非關鍵點,要麼連 \(b\) 的關鍵點和 \(a\) 的非關鍵點,網絡流解決。

[ZJOI2012]災難

\(DAG\) 支配樹的每一個點子樹大小 \(-1\)
每一個點在支配樹上的父親爲全部指向它的點的支配樹的 \(lca\)
注意加超級源點,有可能有某個點同時能吃多個生產者,若是沒有超級源點的話,\(lca\) 就掛了。

Codeforces757F:Team Rocket Rises Again

在最短路徑 \(DAG\) 上求個支配樹便可。

[ZJOI2019]線段樹

問題能夠當作是每次有 \(\frac{1}{2}\) 的機率作修改,求全部狀況的權值總和。
\(f_i\) 表示 \(i\) 點有標記的機率,那麼答案就是求個和。
考慮一次修改的影響:
a.對於樹上不會打懶標記的而且會通過的點,顯然 \(f_x=\frac{f_x}{2}\)
b.對於會打懶標記的點,顯然 \(f_x=\frac{f_x+1}{2}\)
c.關鍵是那些不會通過的,可是會獲得下放的標記的點,\(f_x=\frac{f_x+v}{2}\),其中 \(v\) 表示 \(x\) 的祖先存在至少一個點有標記的機率。
能夠發現這個 \(v\) 很差直接計算,考慮再設 \(g_x\) 直接表示 \(x\) 的祖先存在至少一個點有標記的機率。
實際上在後面的過程當中,能夠發現維護 \(x\) 的祖先不存在一個點有標記的機率更好操做。
因此就委會 \(x\) 的祖先存在不一個點有標記的機率。
對於 \(a\),顯然 \(g_x=\frac{g_x+1}{2}\)
對於 \(b\),顯然 \(g_x=\frac{g_x}{2}\)
對於 \(c\),顯然 \(g_x=\frac{g_x+g_x}{2}=g_x\)
因爲引入了 \(g\),因此須要考慮全部打上懶標記的點的子樹,顯然 \(g_x=\frac{g_x}{2}\),能夠用懶標記維護。

Codeforces 1098E:Fedya the Potter

首先能夠預處理每一種 \(gcd\) 的區間有多少,能夠 \(st\) 表+倍增 \(log^2\) 處理。
而後二分中位數 \(mid\)
考慮在預處理的東西上從小到大取出區間。
枚舉左端點,計算全部可能的右端點。若是這個區間的 $gcd\times $ 次數不超過 \(mid\) 則直接乘法原理。
不然就是一個相似求 \(\sum_{x=1}^{n}\sum_{y=1}^{m}ax+by\le c\) 的式子,能夠容斥以後直接作類歐幾里得。

[HNOI2017]影魔

感受還比較簡單?
如下是我這個垃圾想到的垃圾算法。
\(i<j\),分幾種狀況考慮貢獻:
首先是 \(p_1\) 的貢獻:

a. \(k_i<k_j\),那麼能夠枚舉 \(i\),顯然只有一個 \(j\) 合法,二分便可。

b. \(k_j<k_i\),那麼能夠枚舉 \(j\),顯然也只有一個 \(i\) 合法,仍是能夠二分。
這一部分的貢獻就能夠離線下來,枚舉右端點,維護左端點的答案。
而後是 \(p_2\) 的貢獻:

a. \(k_i<max_{p=i+1}^{j-1}\{k_p\}<k_j\),能夠枚舉 \(i\),找到後面的第一個大於 \(k_i\) 的數,而後這個位置以後的單調遞增的位置均可以是 \(j\)

b. \(k_j<max_{p=i+1}^{j-1}\{k_p\}<k_i\),能夠枚舉 \(j\),找到前面的第一個大於 \(k_j\) 的數,而後這個位置向前的單調遞增的位置均可以是 \(i\)
這一部分的貢獻也能夠離線下來,從前到後和從後到前分別做一遍,枚舉右(左)端點,維護左(右)端點的答案。
給單調遞增的位置加貢獻能夠單調棧 \(+lazy\) 實現,每次彈出的時候在 \(bit\) 裏面修改,棧內的直接二分+前綴和。
而後就能夠在 \(O(nlogn)\) 的時間裏面,用單調棧+\(bit\)+二分解決這個題目。

[HNOI2017]大佬

首先能夠認爲懟大佬以及還嘴的操做當作是休息,作完了以後再一次性懟個爽。
那麼顯然是留下的時間越多越好,這個能夠 \(O(n^2)\) 預處理。
假設最大時間爲 \(d\)
考慮枚舉兩次懟大佬的時間,設嘲諷值爲 \(f_1,f_2\),蓄力的時間爲 \(d_1,d_2\)
那麼只要知足 \(f_1+f_2-d_1-d_2+d\ge c\)\(f_1+f_2\le c\) 便可。
能夠把全部的 \(f,d\) 對爆搜出來聽說很少
而後每次雙端點便可。

[HNOI2016]大數

基本上是莫隊模題,特判一下 \(p\)\(10\) 的約數的狀況便可。

[HNOI2015]落憶楓音

\(d_i\) 表示 \(i\) 的入度,那麼不加邊的答案顯然是 \(\prod_{i=2}^{n}d_i\),表示每一個點選一個入邊。
加邊就只須要減去包含 \((x,y)\) 的環的貢獻,拓撲排序求出 \(y\)\(x\) 的路徑的貢獻便可。

[HNOI2015]實驗比較

能夠發現把一樣的縮起來以後就能夠弄出一棵樹。
\(f_{u,i}\) 表示點 \(u\) 的子樹有 \(i\) 個不一樣的數的方案數。
\(f_{u,i+j-k}=\sum_kf_{v,j}f_{u,i}\binom{i+j-k}{i}\binom{i}{k}\)
枚舉有多少變成相同,\(\binom{i+j-k}{i}\) 表示安排 \(i\) 的位置,\(\binom{i}{k}\) 表示選出那些相同的數,能夠發現這些數肯定了以後 \(v\)\(j\) 個數的放法就肯定了。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息