其他分享
首页 > 其他分享> > 新年的聚会 题解

新年的聚会 题解

作者:互联网

link

Solution

我们可以考虑把整个图分成若干个独立集(可以证明个数 \(\le \sqrt m\)),然后考虑独立集之间查询边,然后你发现查询两个独立集之间的边的话我们可以通过递归,据说复杂度挺对的。

Code

#include "meeting.h"
#include <bits/stdc++.h>
using namespace std;

#define Int register int

template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');}
template <typename T> inline void chkmax (T &a,T b){a = max (a,b);}
template <typename T> inline void chkmin (T &a,T b){a = min (a,b);}

#define poly vector<int>

bool checkp (poly s,int a){
	s.push_back (a);
	return !meeting (s);
}

bool checks (poly s1,poly s2){
	for (Int v : s2) s1.push_back (v);
	return !meeting (s1);
}

#define pii pair<int,int>
vector <pii> p;
void Solve (poly s1,poly s2){
	if (s1.size() == 1 && s2.size() == 1) return p.push_back ({s1[0],s2[0]}),void ();
	if (s1.size() < s2.size()) swap (s1,s2);
	int mid = s1.size() / 2;poly s3,s4;
	for (Int i = 0;i < mid;++ i) s3.push_back (s1[i]);
	for (Int i = mid;i < s1.size();++ i) s4.push_back (s1[i]);
	if (checks (s3,s2)) Solve (s3,s2);
	if (checks (s4,s2)) Solve (s4,s2);
}

#define MAXN 1005
poly st[MAXN];

vector <pii> solve (int n){
	int tot = 0;
	for (Int i = 0;i < n;++ i){
		for (Int j = 1;j <= tot;++ j) if (!checkp (st[j],i)){st[j].push_back (i);goto there;}
		st[++ tot] = poly(1,i);
		there:;
	}
	for (Int i = 1;i <= tot;++ i) 
		for (Int j = i + 1;j <= tot;++ j) Solve (st[i],st[j]);
	return p;
}

标签:新年,int,题解,s1,poly,聚会,s2,void,size
来源: https://www.cnblogs.com/Dark-Romance/p/15840304.html