2014多校聯合 第三場

2021-06-23 00:22:54 字數 1314 閱讀 8206

1002:redraw beautiful drawings

最大流。。。。用sap+gap優化的模版過的。。。

1.源點

->

每一行對應的點,流量限制為該行的和 2.

每一行對應的點

->

每一列對應的點,流量限制為k

3.每一列對應的點

->

匯點,流量限制為該列的和

跑一遍最大流。

如果流量小於總權值和,那麼說明impossible。

如果等於:

構建殘圖網路,如果殘圖網路可以形成一條迴路,那麼說明有多解。

#include #include #include #include #includeusing namespace std;

#define inf 99999999

const int maxn =810;

const int maxm =2*410*410+410*4;

const int oo = 1<<29;

struct arclist

edge[maxm];

void init()

void add(int u, int v, int w)

int sap(int s, int e, int n)

aug[s] = oo;

pre[s] = -1;

gap[0] = n;

while(dis[s]0 && dis[u]==dis[v]+1)

}if(flag==false)

if(dfs())

int n=30*2+1;

int m=30*3-3;

cout<> n >> m;

vector> edges[111];

for(int i = 0; i < m; i++)

dequeq;

vectordist(n+1, ~0ull>>1);

vectorinqueue(n+1, false);

dist[1] = 0;

q.push_back(1);

inqueue[1] = true;

int doge = 0;

while(!q.empty())

for(vector>::iterator it = edges[x].begin();

it != edges[x].end(); ++it)}}

inqueue[x] = false;

}return dist[n];

}int main()

// spfa_slf();

// cout<<"-00"<

hdu多校第三場

題意是將給出的數相加計算出 其中p 的倍數的最大個數。由題意可得,在任意兩個數相加時,其模值必在0 p 1之間,將兩數相加的模值替換掉之前的兩個數字,得到長度減一的效果,用0和1 標記對應模值是否出現,從而代表被處理過的但還沒有達到 p 的倍數的值,直到某次得到的模值為 0 時,再清空之前的標記 代...

2013第三場多校

第三場多校 至今最慘的一場多校。共作出兩題。1008 狀態壓縮優化的搜尋 0 比賽時候直接狀態壓縮dp,結果tle了。沒有算好時間複雜度,第一次交的時候沒有測大資料。應該多想幾種方法,做到一a才行,不然卡題會卡很久。1 後來直接搜尋,從最後乙個狀態開始搜,每次都用乙個回文串,然後搜另乙個的最小步數。...

2016多校聯合第三場 HDU5760

給你個 n 然後 n個數,你要找到乙個最長的序列 s 輸出其長度,並且輸出不同的 s的個數。s 序列必須是回文的,並且中間最小,往兩邊依次增大,可以相等。s1 與s2 不同當且僅當長度不同或者存在某位s1 i s2 i 這個dp比較難。n範圍比較小,先把 a 陣列離散化。方便之後處理。再預處理兩個陣...