IOI2020 部分題解

2022-06-10 01:24:08 字數 2110 閱讀 7698

乙個 \(n\) 個點的無向圖,給定每兩個點之間的簡單路徑條數 \(p_\) ,構造乙個滿足要求的無向圖或判斷無解。

\((1\le n\le10^3,0\le p_\le 3)\)

這個 \(p_=3\) 非常煩,但是可以發現若 \(p_=3\) 則無解。

考慮乙個最簡單的情況(其它情況一定可以從這種情況加一些點得到):

\(2\) 到 \(4\) 有 \(3\) 條路徑,則 \(1\) 到 \(3\) 必有 \(4\) 條路徑。

所以有 \(p_=3\) 判無解即可。

現在只需要構造乙個符合要求的基環樹森林。

先定義一下乙個基環樹子樹是沒有環上的邊的乙個極大連通子圖(假設一棵樹也是乙個基環樹子樹)。

首先假裝是一定能構造出來的:

判斷構造是否合法只需要按照定義判定一下。如果之間沒有路徑也會被判斷到的。

實現:先遍歷每乙個點,以這個點為該基環樹的根(若訪問過則跳過)。

首先有乙個大佇列,用來 bfs 整棵基環樹每棵子樹的代表。

接著大佇列裡有乙個小佇列,用來 bfs 一棵基環樹子樹中的元素。

構造樹只需要鏈,構造環順次連線,此時一棵基環樹子樹中的元素其實是等價的。

這樣實際上是做到了每乙個可能在一棵基環樹子樹,一棵基環樹中的點都放在了一起,因此只需特判了。

時間複雜度: \(o(n^2)\) 。

#include #include "supertrees.h"

using namespace std;

typedef vector> va;

const int n=1005;

int n,idc[n],idt[n];

bool vis[n];

inline void add(int u,int v,va&g)

int construct(va p)\le x_\le10^9\) )

假設每次選出的數集為 \(s\) 。

這個數顯然就是這些數的中位數,再化簡可得貢獻是(以從小到大排序): \(\sum_+1}^s_i-\sum_^}s_i\)

接下來考慮哪些數是正貢獻,哪些數是負貢獻,哪些數沒貢獻。

一定是每個集合開頭的若干個數有負貢獻,末尾的若干個數有正貢獻。若中間的數有貢獻,不如將其替換成更靠近開頭或結尾的更優。

又因為每個集合恰好選 \(k\) 個數,則只會選前 \(k\) 大或前 \(k\) 小的,不妨做乙個對應:第 \(i\) 大的和第 \(k-i+1\) 小的只能選乙個。

接著在這 \(nk\) 個對應中,選出 \(\frac\) 組對應,使這組對應選擇小的那個,按照負貢獻從小到大排序,可以得到理論上的最優解。

這個負貢獻其實就是對應的兩個數之和。

接下來其實隨便放都可以了,一定能滿足正貢獻的數不小於負貢獻的數:

設正貢獻的數為 \(x_1\) ,對應的數是 \(y_1\) ,設負貢獻的數為 \(x_2\) ,對應的數是 \(y_2\) 。

則 \(x_1\ge y_1,x_2\le y_2,x_1+y_1\ge x_2+y_2\) ,所以 \(x_1>x_2\) 。

接下來隨便構造一下就行了,只需要保證每次選擇都恰好有 \(\frac\) 個是大的或小的。

乙個集合乙個集合地取,給小的少的多分配一些小的即可。

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

#include #include "tickets.h"

#define fi first

#define se second

using namespace std;

typedef long long ll;

typedef vectorvec;

typedef vectorvvec;

const int n=1505;

int n,m,d[n],s[n];

ll sum;

vector> v,l;

ll find_maximum(int k,vvec x)

if(t

return *(upper_bound(c.begin(),c.end(),t)-1);

}

Grakn Forces 2020部分題解

要求從三個陣列中每個位置取乙個數字,構成乙個相同長度的陣列,要求相鄰的不相等 環形 那麼我們直接暴力選,記錄當前不能取的值就可以了,然後要記得特判一下首位的兩個元素。首先通過模擬樣例我們發現相同的元素其實是一點用都沒有的,所以我們先去重了再說,然後我們的做法就是貪心的取四個不同的元素一直到取完為止。...

ecfinal2020 部分題解

考慮計算最後四位 momo 的方案數,有乙個狀態數 n 62 62 的 dp,但是每次有用的只有 n 62 個,暴力轉移即可 前面的方案容斥一下就好了 include using namespace std const int n 1000005 const int mod 998244353 ch...

icpc上海站2020部分題解

第一次icpc比賽,最後是以3題300多名的成績直接打鐵,很可惜,d題賽後才知道是精度的問題,不然估計可以拿銅。從比賽中也能得到很多經驗與教訓。1.選好賽區,少打兩年。這次站除去打星隊都有600多隊,只有210個牌,聽說濟南站只有500隊牌子數跟上海站一樣,枯了。2.這次思維題有足足5題,全做了可以...