求助关于快读
查看原帖
求助关于快读
398152
MinimumSpanningTree最小生成树楼主2024/8/13 20:09

使用自己的快读 20pts,改成题面中的快读就 AC 了,求问这是什么原因

20pts 代码:

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const int N=1e7+100,M=70;
ll a,b[M],l,r,mid,ans,n;
ll quick_read()
{
	ll x=0,fh=1;
	char ch=getchar();
	if(ch=='-') fh=-1;
	while(ch>='0'&&ch<='9') 
	{
		x=x*10+(ch-'0');
		ch=getchar();
	}
	return x*fh;
}
int main()
{
	n=quick_read();
	while(n--)
	{
		a=quick_read();
		if(!a)
		{
			ans++;
			continue;
		}
		l=0,r=61;
		while(l+1<r)
		{
			mid=(l+r)>>1;
			if((1ll<<mid)<=a) l=mid;
			else r=mid;
		}
		b[l]|=a;
	}
	for(int i=0;i<=60;i++)
	{
		if(!b[i]) continue;
		ans++;
		//printf("%d %d %d\n",i,ans,b[i]);
		for(int j=i+1;j<=60;j++)
		{
			if(b[i]&b[j])
			{
				b[j]|=b[i];
				ans--;
				break;
			}
		}
	}
	printf("%lld",ans);
	return 0;
}

AC 代码:

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const int N=1e7+100,M=70;
ll a,b[M],l,r,mid,ans,n;
#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
template <typename T>
inline void read(T& r) {
	r=0;bool w=0; char ch=getchar();
	while(ch<'0'||ch>'9') w=ch=='-'?1:0,ch=getchar();
	while(ch>='0'&&ch<='9') r=r*10+(ch^48), ch=getchar();
	r=w?-r:r;
}
ll quick_read()
{
	ll x=0,fh=1;
	char ch=getchar();
	if(ch=='-') fh=-1;
	while(ch>='0'&&ch<='9') 
	{
		x=x*10+(ch-'0');
		ch=getchar();
	}
	return x*fh;
}
int main()
{
	//n=quick_read();
	read(n);
	while(n--)
	{
		//a=quick_read();
		read(a); 
		if(!a)
		{
			ans++;
			continue;
		}
		l=0,r=61;
		while(l+1<r)
		{
			mid=(l+r)>>1;
			if((1ll<<mid)<=a) l=mid;
			else r=mid;
		}
		b[l]|=a;
	}
	for(int i=0;i<=60;i++)
	{
		if(!b[i]) continue;
		ans++;
		//printf("%d %d %d\n",i,ans,b[i]);
		for(int j=i+1;j<=60;j++)
		{
			if(b[i]&b[j])
			{
				b[j]|=b[i];
				ans--;
				break;
			}
		}
	}
	printf("%lld",ans);
	return 0;
}
2024/8/13 20:09
加载中...