@994495jj
2017-07-26T03:55:52.000000Z
字数 1282
阅读 1031
201707 (ACM)想法
#include<bits/stdc++.h>using namespace std;#define fi first#define se second#define pb push_back#define sz(a) (int)a.size()#define mp make_pair#define rep(i, a, b) for(int i=(a); i<(b); i++)#define de(x) cout<<#x<<"="<<x<<endltypedef long long ll;typedef pair<int, int> pii;typedef vector<int> vi;//--------const int N=200005;bool vis[N];int n;int col[N],tsz[N],sum[N];ll ans;vector<int> G[N];void dfs(int u,int f) {tsz[u]=1;int tt=0;rep(i,0,sz(G[u])) {int v=G[u][i];if(v==f) continue;///int res=-sum[col[u]];dfs(v,u);res+=sum[col[u]];tt+=res;res=tsz[v]-res;ans=ans-1ll*res*(res-1)/2;///tsz[u]+=tsz[v];}sum[col[u]]+=tsz[u]-tt;}int main() {int ca=0;while(~scanf("%d",&n)) {///initrep(i,0,n+1) G[i].clear();memset(vis,0,sizeof(vis));memset(sum,0,sizeof(sum));memset(col,-1,sizeof(col));///readint cntc=0;rep(i,1,n+1) {scanf("%d",col+i);if(!vis[col[i]]) {vis[col[i]]=1;++cntc;}}rep(i,1,n) {int u,v;scanf("%d%d",&u,&v);G[u].pb(v);G[v].pb(u);}///solveans=1ll*n*(n-1)/2*cntc;dfs(1,0);rep(i,1,n+1) {if(vis[i]) {int res=n-sum[i];ans=ans-1ll*res*(res-1)/2;}}printf("Case #%d: %lld\n",++ca,ans);}return 0;}
