hud 4358(树状数组+离散化)
2012-08-12 16:22
246 查看
http://page.renren.com/601081183/note/865145486?null&ref=minifeed&sfet=2011&fin=1&ff_id=601081183&feed=page_reblog&tagid=1981432999&statID=page_601081183_2&level=2
#pragma comment(linker, "/STACK:1024000000,1024000000")//手动加大栈的空间 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <map> #include <vector> #include <algorithm> using namespace std; const int N=100003; int w ; int val ; int vis ; int num ; int C ; int n,k; map<int,int>mp; vector<int>pp ; vector<int>edge ; int Lef ; int Rit ; int tmp; struct Node { int LL; int RR; int id; }query ; bool cmp(Node a,Node b) { return a.RR<=b.RR; } void dfs(int u) { vis[u]=1; Lef[u]=Rit[u]=tmp; val[tmp]=w[u]; tmp++; for(int i=0;i<edge[u].size();i++) { int v=edge[u][i]; if(!vis[v]) {dfs(v); Rit[u]=Rit[v];} } } int lowbit(int a) { return a&(-a); } void modify(int p,int c) { for(int i=p;i<=n+2;i+=lowbit(i)) C[i]+=c; } int getsum(int p) { int sum=0; for(int i=p;i>0;i-=lowbit(i)) sum+=C[i]; return sum; } int main() { int cas; scanf("%d",&cas); int T=1; while(cas--) { memset(C,0,sizeof(C)); int cnt=0; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) pp[i].clear(), edge[i].clear(); mp.clear(); for(int i=1;i<=n;i++) { scanf("%d",&w[i]); if(!mp[w[i]]) { mp[w[i]]=++cnt; pp[cnt].push_back(0); } w[i]=mp[w[i]]; } int u,v; for(int i=1;i<n;i++) { scanf("%d%d",&u,&v); edge[u].push_back(v); edge[v].push_back(u); } tmp=1; memset(vis,0,sizeof(vis)); dfs(1); int q; int t; scanf("%d",&q); for(int i=1;i<=q;i++) { scanf("%d",&t); query[i].LL=Lef[t]; query[i].RR=Rit[t]; query[i].id=i; } sort(query+1,query+q+1,cmp); int nn=1; int ans ; for(int i=1;i<=n;i++) { int v=val[i]; pp[v].push_back(i); int g=pp[v].size()-1; if(g>=k) { if(g>k) { modify(pp[v][g-k-1]+1,-1); modify(pp[v][g-k]+1,1); } modify(pp[v][g-k]+1, 1); modify(pp[v][g-k+1]+1, -1); } while(query[nn].RR==i) { ans[query[nn].id]=getsum(query[nn].LL); nn++; } } if (T>1) puts(""); printf("Case #%d:\n",T++); for(int i=1;i<=q;i++) printf("%d\n",ans[i]); } return 0; }
相关文章推荐
- hdoj 4358 树的线性化,树状数组,离散化
- hdu 5877 离散化+树状数组 (2016大连网赛)
- lightoj 1085【离散化+树状数组】
- POJ 2299 Ultra-QuickSort(树状数组+离散化)
- 离散化加树状数组求逆序数。
- hdu 5877 dfs+离散化+树状数组
- CodeForces-540E Infinite Inversions(树状数组+离散化+加点)
- nyoj 1261 音痴又音痴的LT(离散化+树状数组求K小数)
- HDU-5877-Weak Pair【树状数组】【离散化】【DFS】【2016大连网络】【好题】
- Poj 2299 - Ultra-QuickSort 离散化,树状数组,逆序对
- poj-2299-Ultra-QuickSort-(树状数组and离散化)
- POJ 2299 树状数组求逆序数+离散化
- 树状数组+离散化(hdu 5862)
- UESTC 1217(树状数组+离散化)
- hdu 4605(树状数组+离散化)
- HDU - 3743 Frosh Week(树状数组+离散化)
- SUG 180 Inversions(树状数组+离散化)
- LightOJ-1085-树状数组,离散化,dp
- SGU 180-Inversions(树状数组离散化求逆序对数)
- Power OJ 2555: 火柴排队 离散化树状数组求逆序数