題意:
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 次操作,並希望該陣列的中位數能夠盡可能大。奇數長度的陣列的中位數是陣列以非降序排序後的中間元素。例如,...