cf Two Sets 我用二分最大匹配做的

2021-06-25 20:22:15 字數 1349 閱讀 3851

題意:

n個數p1,p2....pn     兩個數a,b

把它們分成a,b兩個集合。

若x屬於a,a-x一定屬於a。

若x屬於b,b-x一定屬於b。

問是否可能將這n個數分成兩個集合。若可以,輸出每個數是屬於a集合還是b集合(0:集合a,1:集合b)

思路:這題我用二分圖最大匹配做的。他們用並查集,額.. 一開始就沒想過並查集哩,回頭再看看並查集的思路吧。

若x屬於a,則a-x屬於a。若a-x屬於a,則x屬於a。集合b同理。

兩兩配對,若x和y可以裝進乙個集合,則將它們之間連條線。然後二分圖最大匹配看匹配數是否等於n。

開始時用map記錄p[i]這個數在陣列中的位置

剩下看**啦,易懂

**:

#include #include #include #include #include #include #include #include #include #include using namespace std;

int const uu[4] = ;

int const vv[4] = ;

typedef long long ll;

int const maxn = 50005;

int const inf = 0x3f3f3f3f;

ll const inf = 0x7fffffffffffffffll;

double eps = 1e-10;

double pi = acos(-1.0);

#define rep(i,s,n) for(int i=(s);i<=(n);++i)

#define rep2(i,s,n) for(int i=(s);i>=(n);--i)

#define mem(v,n) memset(v,(n),sizeof(v))

#define lson l, m, rt<<1

#define rson m+1, r, rt<<1|1

int n,a,b;

int p[100005];

vectorgraph[100005];

bool bmask[100005];

int cx[100005], cy[100005];

int findpath(int u)

}return 0;

}int maxmatch()

return ans;

}int main()

rep(i,1,n)

int dd = maxmatch();

if(dd!=n) printf("no\n");

else

printf("\n");

}}

二分 Ybt 最大均值

給定正整數序列 a,求乙個平均數最大的,長度不小於 l 的 連續的 子段 為了方便計算所以所有數都乘上1000.then,二分均值。n nn 的範圍到 105 10 5 105考慮二分判斷結果如何在 o n o n o n 或 o nl ogn o nlogn o nlog n 的複雜度內解決 我們...

T Shirt Gumbo 二分最大匹配 hoj

將所有的點離散開來。避免多重匹配。include include include include include include using namespace std bool vis 200 int s 200 int cnt 200 int match 200 int n vectormat ...

最大中位數 二分

給定乙個由 n n n 個整數組成的陣列 a a a,其中 n n n 為奇數。你可以對其進行以下操作 選擇陣列中的乙個元素 例如 a i a i 將其增加 1 1ai 1 你最多可以進行 k k 次操作,並希望該陣列的中位數能夠盡可能大。奇數長度的陣列的中位數是陣列以非降序排序後的中間元素。例如,...