关于 long long
查看原帖
关于 long long
64976
hewo楼主2021/10/19 11:50

这是我之前的代码

//#pragma comment(linker,"/STACK:102400000,102400000")

#include<bits/stdc++.h>

using namespace std;

const int MX=3*1000000+233;
#define LL long long
#define inf 0x3f3f3f3f

inline int read()
{
    int x=0,f=1;char ch=getchar();
    while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
    while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}

int n,m;

struct tEdge
{
	int to,next;
}edge[MX];
int head[MX],cnt=0;

inline void add(int from,int to)
{
	edge[++cnt].to=to,edge[cnt].next=head[from];
	head[from]=cnt;
}

int dfn[MX],low[MX];
int idx=0;

int siz[MX];

bool del[MX];

LL ans[MX];

inline void tarjan(int now,int rt)
{
	dfn[now]=low[now]=++idx;
	siz[now]=1;
	int child=0;
	LL sum=0LL;
	LL sbn=(LL)n;
	for(int i=head[now];i;i=edge[i].next)
	{
		int yt=edge[i].to;
		if(dfn[yt]) low[now]=min(low[now],dfn[yt]);
		else if(!dfn[yt])
		{
			if(now==rt) child++;
			tarjan(yt,rt);
			low[now]=min(low[now],low[yt]);
			siz[now]+=siz[yt];
			if(low[yt]>=dfn[now])
			{
				ans[now]+=(siz[yt]*(n-siz[yt])*1LL);//子图对其他点(包括了割点)的贡献
				sum+=siz[yt];
				if(now!=rt||child>=2) del[now]=1;
			}
		}
	}
	if(!del[now]) ans[now]=2LL*(sbn-1);
	else
	{
		ans[now]+=1LL*(sum+1LL)*(sbn-sum-1LL)+(sbn-1LL);//前一段是其他点对子图的贡献,n-1是割点对其他点的贡献,n-sum-1是n对子图没有独立的点的贡献
	}
}

int main(int argc, char const *argv[])
{
	//freopen("P3469_6.in","r",stdin);
	//freopen("debug.out","w",stdout);
	n=read(),m=read();
	//cout<<n<<endl;
	for(int i=1;i<=m;i++)
	{
		int u,v;
		u=read(),v=read();
		add(u,v),add(v,u);
	}
	tarjan(1,1);
	for(int i=1;i<=n;i++)
	{
		printf("%lld\n",ans[i]);
	}
	return 0;
}

结果 #6 #10 WA了。

一气之下全开了 long long ,结果就过了。

请问为什么?

2021/10/19 11:50
加载中...