这是我之前的代码
//#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 ,结果就过了。
请问为什么?