[关闭]
@994495jj 2017-07-26T03:55:52.000000Z 字数 1282 阅读 1031

hdu6035

201707 (ACM)想法


  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define fi first
  4. #define se second
  5. #define pb push_back
  6. #define sz(a) (int)a.size()
  7. #define mp make_pair
  8. #define rep(i, a, b) for(int i=(a); i<(b); i++)
  9. #define de(x) cout<<#x<<"="<<x<<endl
  10. typedef long long ll;
  11. typedef pair<int, int> pii;
  12. typedef vector<int> vi;
  13. //--------
  14. const int N=200005;
  15. bool vis[N];
  16. int n;
  17. int col[N],tsz[N],sum[N];
  18. ll ans;
  19. vector<int> G[N];
  20. void dfs(int u,int f) {
  21. tsz[u]=1;
  22. int tt=0;
  23. rep(i,0,sz(G[u])) {
  24. int v=G[u][i];
  25. if(v==f) continue;
  26. ///
  27. int res=-sum[col[u]];
  28. dfs(v,u);
  29. res+=sum[col[u]];
  30. tt+=res;
  31. res=tsz[v]-res;
  32. ans=ans-1ll*res*(res-1)/2;
  33. ///
  34. tsz[u]+=tsz[v];
  35. }
  36. sum[col[u]]+=tsz[u]-tt;
  37. }
  38. int main() {
  39. int ca=0;
  40. while(~scanf("%d",&n)) {
  41. ///init
  42. rep(i,0,n+1) G[i].clear();
  43. memset(vis,0,sizeof(vis));
  44. memset(sum,0,sizeof(sum));
  45. memset(col,-1,sizeof(col));
  46. ///read
  47. int cntc=0;
  48. rep(i,1,n+1) {
  49. scanf("%d",col+i);
  50. if(!vis[col[i]]) {
  51. vis[col[i]]=1;
  52. ++cntc;
  53. }
  54. }
  55. rep(i,1,n) {
  56. int u,v;scanf("%d%d",&u,&v);
  57. G[u].pb(v);
  58. G[v].pb(u);
  59. }
  60. ///solve
  61. ans=1ll*n*(n-1)/2*cntc;
  62. dfs(1,0);
  63. rep(i,1,n+1) {
  64. if(vis[i]) {
  65. int res=n-sum[i];
  66. ans=ans-1ll*res*(res-1)/2;
  67. }
  68. }
  69. printf("Case #%d: %lld\n",++ca,ans);
  70. }
  71. return 0;
  72. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注