您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: