題解 毒瘤 OI 刷題彙總 SCOI2012

2022-02-14 07:11:34 字數 4706 閱讀 7896

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

傳送門:滑雪 \(\text\)

\(\text\)

給出乙個由 \(n\)

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

\((m\leqslant 10^6)\) 條邊組成的無向圖,點和邊均有權值,求以 \(1\) 為根的有向樹形圖,對於每條選出來的有向邊 \((x,y)\) 必須滿足 \(x\) 的權值大於等於 \(y\) 的權值,在包含點數最大的前提下,求出最大邊權和。

拓撲 + 最大生成樹 亂搞。

首先是求能包含的最大點數,其實質就是從 \(1\) 出發走合法有向邊能到達的點的個數,拓撲排序暴力統計即可。

在拓撲的過程中順帶把經過的邊全部存起來,然後在這些邊中選出一部分使得邊權和最大,其實就是個最大生成樹,\(kruscal\) 暴力搞搞就可以了。

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

#include#include#define ll long long

#define re register int

using namespace std;

const int n=1e5+3,m=1e6+3;

int n,m,o,x,y,z,h,t,cnt,q[n],a[n],fa[n],vis[n],head[n];ll ans;

struct qaqa[m<<1];

struct qwq

inline int find(re x)

int main()

m=0,h=1,t=0,q[++t]=1,vis[1]=1;

while(h<=t)

}sort(b+1,b+m+1);

for(re i=1;i<=n;++i)fa[i]=i;

for(re i=1,t=0;i<=m&&t傳送門:喵星球上的點名 \(\text\)

\(\text\)

給定 \(n\)

\((n\leqslant 5*10^4)\) 對字串 \(a_i,b_i\) 表示喵咪的資訊,以及 \(m\) 個詢問串 \(s_j\) 。在一次詢問中,若 \(s_j\) 是 \(a_i\) 或者 \(b_i\) 的子串,則 \(i\) 會被統計一次。

對於每次詢問輸出統計到的喵咪個數,最後再對於每個喵咪,輸出在 \(m\) 次詢問中被統計的次數。

字串經典題,大部分高階字串匹配演算法都可以艹過。

由於我 菜+懶,只寫了廣義字尾自動機的做法。

其實用廣義 \(\text\) 的話這就是板子題,統計答案時暴力跳 \(parent\) 並染色,遇到已經染過的地方就跳過。

然後...就完了...

時間複雜度:\(o(n*\text)\) 。

聽巨佬說暴跳 \(parent\) 可以被卡到根號,但如果用 \(dfs\) 序優化的話,能做到上界 \(o(n\log n)\)(不管這麼多了,反正能過就行)。

#include#include#include#include#include#define re register int

#define ll long long

using namespace std;

const int n=2e5+5;

int n,t,t,x,s[n],ch[n],len[n];

inline void in(re &x)

struct suffix_automaton

inline int insert(re ch,re last)

}return flag?y:z;

}int co[n];

inline void updata(re p,re id)

int gs[n],ans[n];

inline void updata_(re p,re id)

inline void ask(re ch,re l)

if(flag)++gs[p];

printf("%d\n",flag?cnt[p]:0);

}}sam;

int main()

for(re i=1,t=0;i<=n;++i)

while(t--)

memset(sam.co,0,sizeof(sam.co));

for(re i=1,t=0;i<=n;++i)

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

}

傳送門:喵星人入侵 \(\text\)

\(\text\)

略。又是毒瘤插頭 \(dp\),不會,先咕著。

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

\(\text\)

共有 \(t\)

\((t\leqslant 10)\) 組資料,每組資料給出乙個 \(n\times m\)

\((n,m\leqslant 40)\) 的棋盤,每個位置 \((i,j)\) 上的數為 \(v[i][j]\) 。

一次操作可以選擇兩個相鄰的數,並使這數都加上 \(1\),求最少需要多少次操作才能使棋盤中的所有數都相同,如果無解輸出 \(-1\)。

二分 + 最大流判斷可行性。

注意到每次操作都是選擇兩個相鄰的位置,可以先對棋盤黑白染色,建出二分圖。

設黑點、白點分別有 \(a,b\) 個,其權值總和分別為 \(a,b\),設操作次數為 \(k\),最後所有數字都變成了 \(x\),由於每次操作都會使黑點總權值增加 \(1\),則有:\(a+k=a*x\),同理得 \(b+k=b*x\),聯立得 \(k=a*x-a=b*x-b\),即 \((a-b)*x=a-b\) 。

當 \(a\neq b\) 時,可以直接算出 \(x\),但這個 \(x\) 可能並不合法,所以還要跑最大流 \(judge\) 一下。

當 \(a=b\) 時,此時如果 \(a\neq b\) 則說明一定無解(每次操作並不會改變 \(a,b\) 的相對大小,\(a,b\) 永遠都不能相等)。

由於黑白點個數相等,可知 \(n*m\) 為偶數,如果某乙個 \(x\) 是可行的,那麼進行 \(\frac\) 次操作可以將所有數都變為 \(x+1\),即說明 \(x+1\) 也一定是可行的。所以這個 \(x\) 是可以二分,每次跑最大流判斷可行性即可。

關於如何跑最大流 \(judge\):

在已經確定目標值 \(x\) 的情況下,每個位置 \((i,j)\) 上的點需要被操作 \(x-v[i][j]\) 次。

分別設立超源、超匯,超源向所有白點連容量為 \(x-v[i][j]\) 的邊,所有黑點向超匯連容量為 \(x-v[i][j]\) 的邊,所有白點到相鄰的黑點連容量為 \(inf\) 的邊,跑一遍 \(dinic\) 演算法,如果最大流 \(maxflow=\sum_\}}(x-v[i][j])\),則說明 \(x\) 是可行的。

時間複雜度:\(o(\log (inf) nm\sqrt)\),帶乙個取決於建邊數量的常數。

#include#include#include#define ll long long

#define re register int

using namespace std;

const int n=1600+5,m=n*3+5;//點數:n=nm 邊數:m=n/2*4+n/2*2=3n

const ll inf=1e18;

int n,m,t,st,ed;

inline void in(re &x)

struct dinica[m<<1];

inline void add_(re x,re y,ll flow)

inline void add(re x,re y,ll flow)

inline void cl()

inline int bfs(re st,re ed)

}return 0;

}inline ll dfs(re x,ll flow)

}return tmp;

}inline void dinic(re st,re ed)

}t1;

int cnt1,cnt2,maxa,a[43][43],wx[4]=,wy[4]=;ll sp1,sp2;

inline int poi(re i,re j)

inline int judge(ll x)

}t1.dinic(st,ed);

return t1.maxflow==s;

}int main()

if(cnt1!=cnt2)

else

ll r=inf,l=maxa;

while(l>1;

ll tmp=l+r>>1;

if(judge(mid))r=mid;

else l=mid+1;

}printf("%lld\n",r==inf?-1:r*cnt1-sp1);}}

}

傳送門:\(\text\) 的仰慕者 \(\text\)

\(\text\)

略又是毒瘤數字 \(dp\),不會,先咕著。

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

\(\text\)

略。毒瘤 \(oi\) 的毒瘤計算幾何終於開始顯示其毒瘤本質了。

自己隨便瞎造的資料 把網上僅有的幾篇題解都給卡了,先咕著吧。。。

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

題解 毒瘤 OI 刷題彙總 SCOI2013

由於不清楚題目順序,就按照 text 上面的排列好了。傳送門 電單車交易 text text 給出乙個 n n leqslant 10 5 個點 m m leqslant 2 10 5 條邊的無向連通圖,圖中的點 邊帶有邊權,其中有 q 0 leqslant q leqslant n 為特殊點,對於...

題解 毒瘤 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 ...