社区讨论

50ptsTLE的康康

P4826 [USACO15FEB] Superbull S参与者 4已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lo23hlgk
此快照首次捕获于
2023/10/23 07:23
2 年前
此快照最后确认于
2024/08/07 14:22
2 年前
查看原帖
这份代码,不开O2 50pts,5~10全TLE,开了100pts. 所以……要不要开下 试试?
CPP
#include <bits/stdc++.h>
using namespace std;
#define  int long long
inline int read() {
	int a=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9') {
		if  (c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9') {
		a=a*10+(c-'0');
		c=getchar();
	}
	return f*a;
}
int n,s1=0,k,f[4000005],m,b[4000005];
int find(int x) {
	if (f[x]!=x)
		f[x]=find(f[x]);
	return f[x];
}
void un(int x1,int x2) {
	int x=find(x1);
	int y=find(x2);
	if (x!=y)
		f[x]=y;
}
struct node {
	int x,y,s;
} a[4000005];
int k1=0;
bool cmp(node a,node b) {
	return a.s>b.s;
}
main() {
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	n=read();
	for(int i=1; i<=n; i++)
		b[i]=read();
	for(int i=1; i<=n; i++)
		for(int j=1; j<=n; j++)
			a[++m].x=i,a[m].y=j,a[m].s=b[i]^b[j];
	for (int i=1; i<=n; i++)
		f[i]=i;
	sort(a+1,a+1+m,cmp);
	int i=1,kk=0;
	while(i<=m) {
		while(find(a[i].x)==find(a[i].y)&&i<=m)
			i++;
		un(a[i].x,a[i].y);
		s1+=a[i].s;
		kk++;
		if (kk==n-1) {
			printf("%lld\n",s1);
			return 0;
		}
	}
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...