2012 Multi-University Training Contest 6-1009 hdu4358 Boring counting
2012-08-19 17:13
357 查看
http://acm.hdu.edu.cn/showproblem.php?pid=4366
树形启发式合并,利用map
启发式合并,不管父子关系如何,每次将元素个数少的节点并入元素个数多的。用id[i]表示节点i合并后的结果存在节点id[i]。
树形启发式合并,利用map
启发式合并,不管父子关系如何,每次将元素个数少的节点并入元素个数多的。用id[i]表示节点i合并后的结果存在节点id[i]。
#include <iostream> #include <cstdio> #include <memory.h> #include <algorithm> #include <cmath> #include <string> #include <climits> #include <vector> #include <set> #include <utility> #include <map> #pragma comment(linker, "/STACK:102400000,102400000") using namespace std; #define N 100010 map<int,int> m ; vector<int> emp ,emp0 ; int id ,w ,ans ; bool vis ; int n,k; void build(int rt) { vis[rt]=true; for (int i=0;i<(int)emp0[rt].size();i++) { int son=emp0[rt][i]; if (!vis[son]) { emp[rt].push_back(son); build(son); } } } void merge(int rt,int src,int dest) { map<int,int>::iterator itr,itr1; for (itr=m[src].begin();itr!=m[src].end();itr++) { itr1=m[dest].find(itr->first); if (itr1!=m[dest].end()) { if (itr1->second==k) { ans[rt]--; itr1->second+=itr->second; } else { itr1->second+=itr->second; if (itr1->second==k) ans[rt]++; } } else { m[dest][itr->first]=itr->second; if (itr->second==k) ans[rt]++; } } } void dfs(int rt) { int l=emp[rt].size(); if (l==0) return; for (int i=0;i<l;i++) { int son=emp[rt][i]; dfs(son); int l1=emp[id[rt]].size(); int l2=emp[id[son]].size(); if (l1>l2) { merge(rt,id[son],id[rt]); } else { ans[rt]=ans[son]; merge(rt,id[rt],id[son]); id[rt]=id[son]; } } } int main() { int t,x,y; scanf("%d",&t); for (int cas=1;cas<=t;cas++) { scanf("%d%d",&n,&k); for (int i=1;i<=n;i++) scanf("%d",&w[i]); for (int i=0;i<N;i++) { emp0[i].clear(); emp[i].clear(); m[i].clear(); } for (int i=0;i<n-1;i++) { scanf("%d%d",&x,&y); emp0[x].push_back(y); emp0[y].push_back(x); } memset(vis,false,sizeof(vis)); build(1); memset(ans,0,sizeof(ans)); for (int i=1;i<=n;i++) { id[i]=i; m[i][w[i]]=1; if (k==1) ans[i]=1; } dfs(1); printf("Case #%d:\n",cas); int q; scanf("%d",&q); while (q--) { scanf("%d",&x); printf("%d\n",ans[x]); } if (cas!=t) printf("\n"); } return 0; }
相关文章推荐
- 2012 Multi-University Training Contest 9 1009解题报告 HDU 4388
- HDU 4358 Boring Counting ★★(2012 Multi-University Training Contest 6)
- HDU 4358 Boring Counting ★★(2012 Multi-University Training Contest 6)
- 2012 Multi-University Training Contest 1
- hdu 4348 To the moon(线段树成段更新) 2012 Multi-University Training Contest 5
- hdu4366-successor-2012 Multi-University Training Contest 7-1007
- hdu 4379 The More The Better ( 2012 Multi-University Training Contest 8)
- hdu 4396 More lumber is required (二维最短路 应用 2012 Multi-University Training Contest 10 )
- 2015 Multi-University Training Contest 2 1009 I Wanna Become A 24-Point Master(HDU5308) 构造
- 2017 Multi-University Training Contest - Team 1 1009 I Curse Myself 【思维 + 仙人掌图】
- Matrix&&2012 Multi-University Training Contest 2
- 2012 Multi-University Training Contest 4
- 2012 Multi-University Training Contest 4
- hdu 4360 As long as Binbin loves Sangsang (最短路 2012 Multi-University Training Contest 7 )
- hdu 4336 容斥原理 2012 Multi-University Training Contest 4
- 2012 Multi-University Training Contest 3
- hdu 4340 Capturing a country(树形DP) 2012 Multi-University Training Contest 5
- 2012 Multi-University Training Contest 4-1007 hdu4337 King Arthur's Knights
- hdu 4362 Dragon Ball(dp + 优化) (2012 Multi-University Training Contest 7 )
- hdu 4366 Successor (线段树 2012 Multi-University Training Contest 7 )