HDU 4417 Super Mario(划分树+二分)
2013-08-05 14:15
465 查看
题目链接
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define N 100100 struct node { int l,r; }tree[4*N]; int sorted ; int lnum[20] ; int val[20] ; void build(int d,int l,int r,int rt) { int m,lsame,i,lpos,rpos,same; tree[rt].l = l; tree[rt].r = r; if(l == r) return ; m = (l+r)>>1; lsame = (m - l + 1); for(i = l;i <= r;i ++) { if(val[d][i] < sorted[m]) lsame --; } lpos = l; rpos = m+1; same = 0; for(i = l;i <= r;i ++) { if(i == l) lnum[d][i] = 0; else lnum[d][i] = lnum[d][i-1]; if(val[d][i] < sorted[m]) { lnum[d][i] ++; val[d+1][lpos++] = val[d][i]; } else if(val[d][i] > sorted[m]) { val[d+1][rpos++] = val[d][i]; } else { if(same < lsame) { same ++; lnum[d][i] ++; val[d+1][lpos++] = val[d][i]; } else { val[d+1][rpos++] = val[d][i]; } } } build(d+1,lson); build(d+1,rson); } int query(int d,int k,int l,int r,int rt) { int s,ss,nl,nr,m,rs,rss; if(l == r) { return val[d][l]; } if(l == tree[rt].l) { s = lnum[d][r]; ss = 0; } else { s = lnum[d][r] - lnum[d][l-1]; ss = lnum[d][l-1]; } if(s >= k) { nl = ss + tree[rt].l; nr = ss + tree[rt].l + s - 1; return query(d+1,k,nl,nr,rt<<1); } else { m = (tree[rt].l + tree[rt].r)>>1; rss = l - tree[rt].l - ss; rs = r - l + 1 - s; nl = m + rss + 1; nr = m + rs + rss; return query(d+1,k-s,nl,nr,rt<<1|1); } } int bin(int l,int r,int key) { int str,end,mid,temp; str = 1;end = r-l+1; while(str < end) { mid = (str + end + 1)/2; temp = query(0,mid,l,r,1); if(temp > key) end = mid - 1; else str = mid; } return end; } int main() { int i,n,m,x,y,k,t,cas = 1; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i = 1;i <= n;i ++) { scanf("%d",&val[0][i]); sorted[i] = val[0][i]; } sort(sorted+1,sorted+n+1); build(0,1,n,1); printf("Case %d:\n",cas++); for(i = 0;i < m;i ++) { scanf("%d%d%d",&x,&y,&k); x ++; y ++; if(k > query(0,y-x+1,x,y,1)) printf("%d\n",y-x+1); else if(k < query(0,1,x,y,1)) printf("0\n"); else printf("%d\n",bin(x,y,k)); } } return 0; }
相关文章推荐
- HDU 4417 Super Mario(划分树+二分)
- hdu 4417 Super Mario 划分树+二分
- HDU 4417 - Super Mario (求区间小于h的数 划分树 二分 线段树 树状数组)
- HDU 4417 Super Mario (树状数组+离线处理)(划分树+二分答案)
- 【HDU】4417 Super Mario(划分树+二分)
- HDU 4417 Super Mario(划分树+二分)
- HDU-4417 Super Mario,划分树+二分!
- HDU-4417-Super Mario(划分树+二分)
- HDU 4417 Super Mario (划分树)(二分)
- hdu 4417 Super Mario(划分树)
- HDU 4417 Super Mario 划分树
- HDOJ 4417 - Super Mario 划分树成熟模板(可解决相同元素)+二分
- hdu 4417 划分树+二分
- Hdu 4417 Super Mario(主席树+二分)
- HDU 4417 Super Mario 划分树 + 二分
- HDU 4417 Super Mario 划分树/树状数组
- HDU 4417 Super Mario(划分树)#by zh
- HDU 4417 划分树+二分
- hdu 4417 Super Mario (划分树)
- hdu 4417(划分树+二分)