使用自己的快读 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;
}