数据过水
查看原帖
数据过水
965685
yyrwlj楼主2024/5/1 10:06

如下代码无法通过样例,却AC了

#include <iostream>
#include <vector>
using namespace std;
const int N1 = 205, N2 = 3005;
int a[N1], b[N2];
int cnt[N2];
bool can[N2];
vector<int> g[N2], g1[N1];
int bf[N2], st[N2], Time;
int A, B, n, m;
inline bool check(int x)
{
	int res = 0;
	for (;x;x>>=1)
		if (x & 1)
			res ++;
	return res & 1;
}
bool find(int u)
{
    for (int j : g[u])
    {
        if (st[j] == Time || !can[j])
            continue;
        st[j] = Time;
        if (!bf[j] || find(bf[j]))
        {
            bf[j] = u;
            return true;
        }
    }
    return false;
}
int match()
{
	for (int i=1;i<=B;i++)
		if (!(b[i] & 1) && can[i])
			bf[i] = 0;
	int res = 0;
	for (int i=1;i<=B;i++)
		if ((b[i] & 1) && can[i])
		{
			 Time ++;
			 if (find(i))
			 	res ++;
		}
	return n - res;
}
void work()
{
	scanf("%d%d%d", &A, &B, &m);
	for (int i=1;i<=A;i++)
		scanf("%d", &a[i]);
	for (int i=1;i<=B;i++)
		scanf("%d", &b[i]);
	for (int i=1;i<=B;i++)
		if (b[i] & 1)
		{
			g[i].clear();
			for (int j=1;j<=B;j++)
				if (b[j] % 2 == 0 && check(b[i] | b[j]))
					g[i].push_back(j);
		}
	for (int i=1;i<=B;i++)
		can[i] = true;
	while (m--)
	{
		int a, b;
		scanf("%d%d", &a, &b);
		g1[a].push_back(b);
	}
	n = B;
	int ans = match();
	for (int i=1;i<=A;i++)
	{
		for (int j=1;j<=B;j++)
			can[j] = false;
		for (int j : g1[i])
			can[j] = true;
		n = g1[i].size();
		ans = max(ans, 1 + match());
	}
	for (int i=1;i<A;i++)
		for (int j=i+1;j<=A;j++)
			if ((a[i] ^ a[j]) & 1)
			{
				for (int k=1;k<=B;k++)
					cnt[k] = 0;
				for (int k : g1[i])
					cnt[k] ++;
				for (int k : g1[j])
					cnt[k] ++;
				n = 0;
				for (int k=1;k<=B;k++)
					if (cnt[k] == 2)
						can[k] = true, n ++;
					else
						can[k] = false;
				ans = max(ans, 2 + match());
			}
	printf("%d\n", ans);
}
int main()
{
	int T;
	scanf("%d", &T);
	while (T--)
		work();
	return 0;
}
2024/5/1 10:06
加载中...