Codeforces 136 divIID && zoj 3633 && HDU 4358
2012-09-02 21:57
459 查看
三道类似的线段树
可参见这里的代码
http://blog.csdn.net/struggle_mind/article/details/7931956
今天下午把HDU 4358重敲了一遍
可参见这里的代码
http://blog.csdn.net/struggle_mind/article/details/7931956
今天下午把HDU 4358重敲了一遍
#include<cstdio> #include<algorithm> #include<cstring> #include<vector> #define N 100100 using namespace std; int val ,a ; int head ,cnt,tim; struct Edge{ int v,next; }edge[N*2]; int dep ,son ; struct Query{ int x,y,id; }query ; struct Tree{ int l,r,val; }tree[3*N]; vector<int>vec ; int ans ; void init(){ memset(head,-1,sizeof(head)); cnt=tim=0; } void addedge(int u,int v){ edge[cnt].v=v; edge[cnt].next=head[u]; head[u]=cnt++; edge[cnt].v=u; edge[cnt].next=head[v]; head[v]=cnt++; } void dfs(int u,int fa){ int i; dep[u]=++tim,son[u]=1; for(i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].v; if(v==fa)continue; dfs(v,u); son[u]+=son[v]; } } bool cmp(struct Query a,struct Query b){ return a.y<b.y; } void build(int s,int t,int id){ tree[id].l=s,tree[id].r=t,tree[id].val=0; if(s!=t){ int mid=(s+t)>>1; build(s,mid,id<<1); build(mid+1,t,id<<1|1); } } void insert(int pos,int val,int id){ if(tree[id].l==tree[id].r){ tree[id].val=val; return ; } int mid=(tree[id].l+tree[id].r)>>1; if(mid>=pos)insert(pos,val,id<<1); else if(mid<pos)insert(pos,val,id<<1|1); tree[id].val=tree[id<<1].val+tree[id<<1|1].val; } int sea(int s,int t,int id){ if(tree[id].l==tree[id].r)return tree[id].val; if(tree[id].l==s && tree[id].r==t)return tree[id].val; int mid=(tree[id].l+tree[id].r)>>1; if(mid>=t)return sea(s,t,id<<1); else if(mid<s)return sea(s,t,id<<1|1); else return sea(s,mid,id<<1)+sea(mid+1,t,id<<1|1); } int main(){ int t,T,q; int n,k,kk; int i,j; int u,v; int tem; scanf("%d",&T); for(t=1;t<=T;t++){ printf("Case #%d:\n",t); scanf("%d %d",&n,&k); // kk=0; for(i=1;i<=n;i++){ scanf("%d",&val[i]); a[kk++]=val[i]; } sort(a,a+kk); int nn=unique(a,a+kk)-a; // init(); for(i=1;i<n;i++){ scanf("%d %d",&u,&v); addedge(u,v); } dfs(1,0); // scanf("%d",&q); for(i=1;i<=q;i++){ scanf("%d",&tem); query[i].x=dep[tem]; query[i].y=dep[tem]+son[tem]-1; query[i].id=i; } sort(query+1,query+1+q,cmp); // build(1,tim,1); for(i=0;i<nn;i++)vec[i].clear(); kk=1; for(i=1;i<=n;i++){ int u=lower_bound(a,a+nn,val[dep[i]])-a; if(vec[u].size()<k){ vec[u].push_back(i); if(vec[u].size()==k) insert(vec[u][0],1,1); } else if(vec[u].size()>=k){ vec[u].push_back(i); insert(vec[u][vec[u].size()-k-1],-1,1); insert(vec[u][vec[u].size()-k],1,1); if(vec[u].size()>k+1) insert(vec[u][vec[u].size()-k-2],0,1); } while(kk<=q && query[kk].y==i){ ans[query[kk].id]=sea(query[kk].x,query[kk].y,1); kk++; } if(kk==q+1)break; } for(i=1;i<=q;i++)printf("%d\n",ans[i]); if(t!=T)puts(""); } return 0; }
相关文章推荐
- zoj 1002 && hdu 1045 Fire Net
- POJ 3654 & ZOJ 2936 & HDU 2723 Electronic Document Security(模拟)
- Codeforces 163E && HDU 4117 && Noi2011阿狸的打字机 && boj 1602
- ZOJ 3690 & HDU 3658 (矩阵高速幂+公式递推)
- HDU 1010 && ZOJ 2110 Tempter of the bone (DFS + 奇偶剪枝)
- ZOJ 1649 && HDU 1242 Rescue (BFS + 优先队列)
- ZOJ 3690 & HDU 3658 (矩阵快速幂+公式递推)
- HDU-4825 Xor Sum &&Codeforces Round #367 (Div. 2) D. Vasiliy's Multiset (Trie树)
- 8月10号的练习:ZOJ 3203&&POJ 3974&&HDU 1394&&HDU 3400&&HDU 2152
- ZOJ2107——Quoit Design&&HDU1007——Quoit Design
- Codeforces Round #383 (Div. 2) && Codeforces 742 B (标记技巧)
- Codeforces 495 B. Modular Equations && Codeforces Round #282 (Div. 2)
- POJ 3100 & ZOJ 2818 & HDU 2740 Root of the Problem(数学)
- POJ 3652 & ZOJ 2934 & HDU 2721 Persistent Bits(数学 元)
- ZOJ 1649 && HDU 1242 Rescue (BFS)
- CodeForces 833B Round#426 Div1B&Div2D The Bakery: DP+线段树
- hdu 3714 && zoj 3203 三分
- HDU Task Schedule && ZOJ Talented Chef
- Codeforces 494 A. Treasure && Codeforces Round #282 (Div. 1)
- codeforces 181 div2 C&E