GDOI模擬2015 08 08 排列

2021-07-04 13:11:31 字數 1543 閱讀 7475

給定對於乙個

1 至

n的排列

的m個形如下述的約束: ∙(

1,x,

y,v)

排列的第

x 個數到第

y個數之間最大值為v

∙(2,

x,y,

v)排列的第

x 個數到第

y個數之間最小值為v

要求還原這個排列。

方案可能很多,輸出一種即可。如果沒有符合要求的排列,則輸出-1。1≤

n≤200,0≤

m≤40000

有「約束條件「,再看到

n 在

200以內,那這題應該最有可能為網路流。

我們發現,約束1就是限定區間[x

..y]

必須有v 這個數,且所有數字小於等於

v。約束2就是限定區間[x

..y]

必須有v 這個數,且所有數字大於等於

v。假設我們求出了位置能取得數的集合,剩下的就是乙個二分圖匹配的問題了。

那麼我們應該仔細考慮一下如何確定每個位置能取哪些數。比賽時我由於太急躁,並沒有想好這個條件。

我們歸納總結可以發現,位置

i 能放

j,當且僅當

j 滿足所有包含位置

i的約束,並且在不包含位置

i 的約束中,不存在v=

j。 我們通過列舉約束求出每個位置最大能放幾,最小能放幾,同時求出每個數是否出現在不包含該位置的約束中。然後位置向能連的數連邊,做匈牙利匹配即可。

時間複雜度o(

n3) 。

#include 

#include

#include

#include

using

namespace

std;

const

int n=200;

const

int m=40000;

struct constraint

c[m+1];

int next[n*n+1],tov[n*n+1];

int belong[n+1],last[n+1];

bool vis[n+1],num[n+1],r[n+1];

int n,m,can,tot;

int read()

while (ch>='0'&&ch<='9')

return x*f;

}void insert(int x,int y)

bool hungary(int x)

i=next[i];

}return

false;

}bool cmp(constraint x,constraint y)

for (int i=1;i<=n;i++)

if (canprintf("-1");

else

fclose(stdin);

fclose(stdout);

return

0;}

GDOI模擬 排列

給你m個對1到n的排列的特徵,特徵有兩種 1 x y v 排列的第x個數到第y個數之間的最大值為v 2 x y v 排列的第x個數到第y個數之間的最小值為v 要求你還原出這個排列。刷水有益身心健康。既然是求方案,資料範圍又很小,那麼明顯的要用把點向權值連邊。然後他每次給出範圍之後再進行刪邊。最後,二...

GDOI模擬8 21總結

今天做了cqoi2013的題。第一次5個小時做5道題 先看了半小時的題。t5是初中做過的原題,記得是處理出上下界然後暴力列舉就行了,就先打了t5,花了乙個小時搞定了t5,過了樣例和自己出的幾個資料就沒管了 沒對拍是因為我覺得資料生成器有點難搞 然後這題做法本來就是暴力 然後去看了下之前沒怎麼看懂題的...

GDOI模擬2015 08 18 解密

給定一篇由若干個單詞構成的原文,還有乙個由若干個單詞組成的句子。加密文是由原文單詞通過某個單詞 可能一樣 替換而成的,原文相同單詞一定會被相同加密文單詞替換。沒有兩個不同的原文單詞被同乙個加密文單詞替換。要求找出句子在加密文中第一次出現的位置。原文本元總和不超過 1000000 句子字元總和不超過 ...