cjb-poi2010teleportation

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

{{{
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <vector>
#include <map>
#include <set>
#include <cmath>
#include <stack>
#define pb push_back
#define mp make_pair
#define rep(i,n) for(int i=1;i<=n;i++)
#define C(n) (1ll*n*(n-1)/2)
using namespace std;
vector<int> g[41000];
int n,m;
long long ans;
int A,B,C,D;
int col[41000];
int main()
{
    cin>>n>>m;
    rep(i,n)g[i].clear();
    rep(i,m){ int x,y; scanf("%d%d",&x,&y); g[x].pb(y); g[y].pb(x); }
    A=B=C=D=0;
    col[1]=1;  col[2]=6;
    A=g[1].size(); for(auto p:g[1])col[p]=2;
    D=g[2].size(); for(auto p:g[2])col[p]=5;
    rep(i,n)if (col[i]==2)for(auto p:g[i])if (!col[p])col[p]=3,B++;
    rep(i,n)if (col[i]==5)for(auto p:g[i])if (!col[p])col[p]=4,C++;
    int cnt=0; rep(i,n)if (!col[i])col[i]=(A>D)?3:4,cnt++; 
    if (A>D)B+=cnt; else C+=cnt; 
    ans=C(A)+C(B)+C(C)+C(D)+A+1ll*A*B+1ll*B*C+1ll*C*D+D-m;
    cout<<ans<<endl;
    return 0;
}
}}}
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <vector>
#include <map>
#include <set>
#include <cmath>
#include <stack>
#define pb push_back
#define mp make_pair
#define rep(i,n) for(int i=1;i<=n;i++)
#define C(n) (1ll*n*(n-1)/2)
using namespace std;
vector<int> g[41000];
int n,m;
long long ans;
int A,B,C,D;
int col[41000];
int main()
{
    cin>>n>>m;
    rep(i,n)g[i].clear();
    rep(i,m){ int x,y; scanf("%d%d",&x,&y); g[x].pb(y); g[y].pb(x); }
    A=B=C=D=0;
    col[1]=1;  col[2]=6;
    A=g[1].size(); for(auto p:g[1])col[p]=2;
    D=g[2].size(); for(auto p:g[2])col[p]=5;
    rep(i,n)if (col[i]==2)for(auto p:g[i])if (!col[p])col[p]=3,B++;
    rep(i,n)if (col[i]==5)for(auto p:g[i])if (!col[p])col[p]=4,C++;
    int cnt=0; rep(i,n)if (!col[i])col[i]=(A>D)?3:4,cnt++; 
    if (A>D)B+=cnt; else C+=cnt; 
    ans=C(A)+C(B)+C(C)+C(D)+A+1ll*A*B+1ll*B*C+1ll*C*D+D-m;
    cout<<ans<<endl;
    return 0;
}