題解 毒瘤 OI 刷題彙總 SCOI2013

2022-02-14 07:11:33 字數 4647 閱讀 4931

由於不清楚題目順序,就按照 \(\text\) 上面的排列好了。

傳送門:電單車交易 \(\text\)

\(\text\)

給出乙個 \(n\)

\((n\leqslant 10^5)\) 個點 \(m\)

\((m\leqslant 2*10^5)\) 條邊的無向連通圖,圖中的點、邊帶有邊權,其中有 \(q\)

\((0\leqslant q\leqslant n)\) 為特殊點,對於任意兩個特殊點之間都有一條權值為 \(inf\) 的邊。

現需要按照給定順序依次經過這 \(n\) 個點,在某些點可以購買本子,某些點可以賣出本子,在各點的本子交易量不能超過該點的點權,經過某條邊時所攜帶的本子數量不能超過該邊的邊權。

在進行每次賣出交易時您想要使得本次的賣出量最大,並且在與最後乙個點進行交易後手上不能有剩餘的本子。請按照順序依次輸出最大賣出量。

最大生成樹 + 倍增 \(lca\) 求路徑最小值,模擬本子交易。

注意到我們只需要盡量攜帶最多的本子,不必在意是否賣光的問題,因為實際行動時可以通過調整數量來避免多餘本子的出現。

很顯然我們可以先求出這 \(n\) 個點的最大生成樹,每次移動時走樹上的路徑就可以保證本子運送量最大。

處理特殊點顯然不能暴力列舉,可以新建乙個中轉點 \(n+1\),所有特殊點均向 \(n+1\) 連一條權值為 \(inf\) 的邊即可(注意細節:新建節點後求生成樹就是 \(n+1\) 個節點了,還有就是當不存在特殊點時不能新建中轉點,否則會不連通)。

然後隨便寫個倍增 \(lca\) 或者樹剖求樹上路徑最小值,設個變數 \(v\) 表示目前攜帶的本子數量,瞎模擬一下就可以了。

時間複雜度:\(o((m+q)\log(m+q)+n\log n)\) 。

#include#include#include#define ll long long

#define re register ll

using namespace std;

const ll n=1e5+3,m=2e5+3,inf=1e18,logn=17;

ll n,m,x,y,o,t,a[n],ip[n],fa[n],head[n];

struct qaqa[n<<1];

inline void add(re x,re y,re z)

struct qwq}b[m+n];

inline void in(re &x)

inline ll find(re x)

struct lca

}t1;

int main()\)

\(\text\)

你需要維護乙個關於 \(x\) 的無窮多項式(初始時對於所有的 \(i\) 都有 \(a_i=0\)):\(f(x)=a_0x^0+a_1x^1+a_2x^2...\)

現給出 \(m\)

\((m\leqslant 10^5)\) 個操作,操作種類如下 \((0\leqslant l\leqslant r \leqslant 10^5,\)

\(t\leqslant 10)\):

平衡樹大水題。

用一顆 \(splay\) 維護 \(a_0,a_1...a_\) 一共 \(10^5+2\) 個係數,

操作一和操作二就是個小學生懶標記的應用,

操作三可以分為兩步:在 \(a_\) 和 \(a_\) 中間插入乙個 \(0\),然後把 \(a_r\) 累加到 \(a_\) 頭上。

操作四可以先預處理出 \(x\) 的 \(0\sim 10^5+1\) 次冪,然後 \(dfs\) 中序遍歷 \(splay\) 暴力計算答案即可。

時間複雜度:\(o(m\log n+tn)\),其中 \(n=10^5+2\)。

#include#include#include#include#define ll long long

#define re register int

using namespace std;

const int n=1e5+9,p=20130426;

int x,y,z,n=100002,t,now,ans,x[n];char op[10];

inline void in(re &x)

struct splaytr[n];

inline void pushup(re p)

inline void updata1(re p,re v)

inline void updata2(re p,re v)

inline void pushdown(re p)

if(tr[p].add)

}inline int which(re p)

inline void connect(re p,re fa,re o)

inline void rotate(re p)

inline void splay(re p,re to)

inline void clear(re p)

inline void new(re &p,re fa)

inline void cl(re p)

inline void build(re &p,re l,re r,re fa)

inline int find(re p,re k)

inline int split(re l,re r)

inline void dfs(re p)

inline void sakura(re l,re r)

}tr;

int main()

for(re i=1;i傳送門:火柴棍數字 \(\text\)

\(\text\)

給出乙個長度為 \(n\)

\((n\leqslant 500)\) 的十進位制數 \(s\),現用一堆火柴棍擺成了這個數,您最多可以移動 \(m\)

\((m\leqslant 3500)\) 根木棍,求最大能使這個數 \(s\) 變得多大。

神仙 \(dp\) 。

注意到最優方案一定是在最左邊不斷地放 \(1\),如果可操作木棍為奇數,則用剩下的一根把最左邊的那個 \(1\) 變成 \(7\)。

先預處理乙個轉移陣列 \(val\),其中 \(val[i][j]\) 表示將數字 \(i\) 變為 \(j\) 所需要的移動次數。

設 \(cnt[i]\) 表示組成數字 \(i\) 所需木棍數量,則將數字 \(i\) 轉換為 \(j\) 後所得到的空閒木棍數量就是 \(cnt[i]-cnt[j]\) 。這裡的 「空閒木棍」 指的是不需要移動代價(移動代價的計算被放到了 \(val\) 裡面),可以隨便放的木棍,下同。

用 \(dp[i][j]\) 表示目前從右至左列舉到第 \(i\) 位,手裡有 \(j\) 個空閒木根,所需要的最小移動木棍次數,

考慮列舉當前位數字 \(s_i\) 的轉移目標 \(k\),設 \(j=j-(cnt[s_i]-cnt[k])\),則有 \(dp[i][j]=\min\\)

\((0\leqslant j \leqslant m)\)

注意輸出答案時要滿足左邊的盡量大,所以不能直接記錄每次轉移的最優決策點(因為這個「最優」是針對移動次數最小而言),而應該寫乙個 \(dfs\) 從左至右列舉,每次在所有合法決策點中找到轉移目標數字最大的那乙個(由於尋找的是合法決策點,所以能保證最後火柴棍的使用一定合法)。發現在這個過程中 \(j\) 可能為負數(因為是倒著列舉),用遞推轉移寫起來很不方便,可以把前面 \(dp\) 的轉移也換成 \(dfs\) 。

時間複雜度:\(o(nm)\) 。

(貌似應該把陣列第二維開兩倍處理負數的情況,但資料水直接過了,懶得去管這些細節了)

#include#include#include#define ll long long

#define re register int

using namespace std;

const int n=503,m=3503,inf=1e9;

int val[10][10]=,,,

,,,,

,,

,};int cnt[10]=;

int n,m,dp[n][m],vis[n][m];char s[n];

//dp[i][j]: 目前掃瞄到第i位,手裡有j個空閒木根可以隨意操作,所需要的最小移動木棍次數

inline void in(re &x)

inline int dfs(re i,re j)

}int main()

print(1,0);//如果不足2個就不能在前面補數,因此答案為print(1,0)而不能是print(1,1)

}

傳送門:密碼 \(\text\)

\(\text\)

已知某長為 \(n (n\leqslant 10^5)\) 的字串以每個位置/空隙為中心的最長回文串長度,現需構造乙個字典序最小的合法字串。

詳情見另一篇部落格:【題解】密碼 \(\text\)

不知道這兒能放啥,乾脆買個萌吧(⊙ω⊙)
傳送門:數數 \(\text\)

\(\text\)

略。毒瘤數字 \(dp\),題解始終沒看懂,先咕著。

不知道這兒能放啥,乾脆買個萌吧(⊙ω⊙)
傳送門:泡泡魚 \(\text\)

\(\text\)

略毒瘤 \(oi\) 又在出毒瘤計算幾何了,題倒是不難,但比較麻煩,不想寫。

不知道這兒能放啥,乾脆買個萌吧(⊙ω⊙)

題解 毒瘤 OI 刷題彙總 SCOI2012

由於不清楚題目順序,就按照 text 上面的排列好了。傳送門 滑雪 text text 給出乙個由 n n leqslant 10 5 個點 m m leqslant 10 6 條邊組成的無向圖,點和邊均有權值,求以 1 為根的有向樹形圖,對於每條選出來的有向邊 x,y 必須滿足 x 的權值大於等於...

題解 毒瘤 OI 刷題彙總 SCOI2011

由於不清楚題目順序,就按照 text 上面的排列好了。乙個小學生圖論板子,乙個資料結構胖題,乙個噁心模擬,乙個毒瘤插頭 dp 兩道死題,我枯tat.傳送門 糖果 text text 給出 m m leqslant 10 5 個約束條件,條件分為以下 5 種 1 x y a x a y 2 x y a...

LOJ6087 毒瘤題 題解

n 個數的陣列,其中恰好有 k 個數出現了奇數次。把他們找出來。n 3e6,k 2 空間 2m k 1 直接全部異或起來。k 2 假設出現奇數次的是 a 和 b,那麼把所有數異或起來得到的就是 s a b。對每個二進位制位維護乙個數 w i 當讀入乙個 x,x 的第 j 位為 1 的時候,就把 w ...