Warning: session_start(): open(/tmp/sess_8510aa26a7a019e127ef1115b31539bb, O_RDWR) failed: No space left on device (28) in /data/wiki/inc/init.php on line 239

Warning: session_start(): Failed to read session data: files (path: ) in /data/wiki/inc/init.php on line 239

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/auth.php on line 430
Writing /data/wiki/data/cache/d/de2edb2fcb553ea79b79c722a4e13dbc.captchaip failed

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/actions.php on line 38

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/lib/tpl/dokuwiki/main.php on line 12
2020-2021:teams:namespace:牛客多校第八场 [CVBB ACM Team]

用户工具

站点工具


2020-2021:teams:namespace:牛客多校第八场

牛客多校第八场

想起高中时看的一本大黑砖:

《我怎样爆零(HowDoIGetZero)》

所以预计本周周报将陷入无题可写的困境。

I

比赛时以为是二分图的匹配用匈牙利算法做了,搞了半天搞出来了但是复杂度太高了过不去。

参考题解的答案是:总点数-#(k个点, k-1条边的连通分量)

点击以显示 ⇲

点击以隐藏 ⇱

#include<stdio.h>
#include<string.h>
 
#include<vector>
#include<algorithm>
 
using namespace std;
 
bool vis[200020];
int F[200020];
 
void init()
{
	memset(F,-1,sizeof(F));
	memset(vis,0,sizeof(vis));
}
 
int find(int x)
{
	if(F[x]==-1)
	{
		return x;
	}
	return F[x]=find(F[x]);//改了根 
}
 
void bing(int x,int y)
{
	int t1=find(x);//找到x的根 
	int t2=find(y);//找到y的根 
	if(t1==t2)
	{
		vis[t1]=1;//同一个根,该根变1 
		return;
	}
	F[t1]=t2;//如果x和y的根不同,修改t1的根t2 
	if(vis[t1])
	{
		vis[t2]=1;
	}
}
 
int main()
{
	int t;
	scanf("%d",&t);
	int k=0;
	while(t--)
	{
		k++;
		init();
		int n;
		scanf("%d",&n);
		vector<int> a(n),b(n);
		vector<int> val;
		int i;
		for(i=0;i<n;i++)
		{
			scanf("%d%d",&a[i],&b[i]);
			val.push_back(a[i]);
			val.push_back(b[i]);
		}
		sort(val.begin(),val.end());
		int tot=unique(val.begin(),val.end())-val.begin();
		val.resize(tot);
		for(i=0;i<n;i++)
		{
			a[i]=lower_bound(val.begin(),val.end(),a[i])-val.begin();
			b[i]=lower_bound(val.begin(),val.end(),b[i])-val.begin();
			bing(a[i],b[i]);
		}
		int ans=tot;
		for(i=0;i<tot;i++)//遍历c中不同的点
		{
			if(F[i]==-1&&!vis[i])
			{
				ans--;
			}
		}
		printf("Case #%d: %d\n",k,ans);
	}
}
2020-2021/teams/namespace/牛客多校第八场.1596875721.txt.gz · 最后更改: 2020/08/08 16:35 由 great_designer