题解 [AGC016E] Poor Turkeys

传送门

欸,AT 出达哥原题
哦达哥打过这一场,那没事了

还是考虑对每只火鸡预处理出它能活下来的前提集合
这个用 bitset 就能搞
复杂度 \(O(n^2+\frac{nm}{\omega})\)

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 100010
#define ll long long
//#define int long long

char buf[1<<21], *p1=buf, *p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf, 1, 1<<21, stdin)), p1==p2?EOF:*p1++)
inline int read() {
	int ans=0, f=1; char c=getchar();
	while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
	while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
	return ans*f;
}

int n, m;
bool vis[N];
bitset<410> s[410];
int a[N], b[N], ans;

signed main()
{
	n=read(); m=read();
	for (int i=1; i<=m; ++i) a[i]=read(), b[i]=read();
	for (int i=1; i<=n; ++i) vis[i]=1, s[i][i]=1;
	for (int i=1; i<=m; ++i) {
		if ((s[a[i]]&s[b[i]]).any()) vis[a[i]]=vis[b[i]]=0;
		else if (!vis[a[i]]||!vis[b[i]]) vis[a[i]]=vis[b[i]]=0;
		else s[a[i]]|=s[b[i]], s[b[i]]|=s[a[i]];
	}
	for (int i=1; i<=n; ++i) if (vis[i])
		for (int j=i+1; j<=n; ++j) if (vis[j])
			if ((s[i]&s[j]).none()) ++ans;
	cout<<ans<<endl;
	
	return 0;
}
posted @ 2022-05-31 17:45  Administrator-09  阅读(0)  评论(0编辑  收藏  举报