給定對於乙個
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 句子字元總和不超過 ...