题目链接

 #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[*N];
int sorted[N];
int lnum[][N];
int val[][N];
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)>>;
lsame = (m - l + );
for(i = l;i <= r;i ++)
{
if(val[d][i] < sorted[m])
lsame --;
}
lpos = l;
rpos = m+;
same = ;
for(i = l;i <= r;i ++)
{
if(i == l)
lnum[d][i] = ;
else
lnum[d][i] = lnum[d][i-];
if(val[d][i] < sorted[m])
{
lnum[d][i] ++;
val[d+][lpos++] = val[d][i];
}
else if(val[d][i] > sorted[m])
{
val[d+][rpos++] = val[d][i];
}
else
{
if(same < lsame)
{
same ++;
lnum[d][i] ++;
val[d+][lpos++] = val[d][i];
}
else
{
val[d+][rpos++] = val[d][i];
}
}
}
build(d+,lson);
build(d+,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 = ;
}
else
{
s = lnum[d][r] - lnum[d][l-];
ss = lnum[d][l-];
}
if(s >= k)
{
nl = ss + tree[rt].l;
nr = ss + tree[rt].l + s - ;
return query(d+,k,nl,nr,rt<<);
}
else
{
m = (tree[rt].l + tree[rt].r)>>;
rss = l - tree[rt].l - ss;
rs = r - l + - s;
nl = m + rss + ;
nr = m + rs + rss;
return query(d+,k-s,nl,nr,rt<<|);
}
}
int bin(int l,int r,int key)
{
int str,end,mid,temp;
str = ;end = r-l+;
while(str < end)
{
mid = (str + end + )/;
temp = query(,mid,l,r,);
if(temp > key)
end = mid - ;
else
str = mid;
}
return end;
}
int main()
{
int i,n,m,x,y,k,t,cas = ;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i = ;i <= n;i ++)
{
scanf("%d",&val[][i]);
sorted[i] = val[][i];
}
sort(sorted+,sorted+n+);
build(,,n,);
printf("Case %d:\n",cas++);
for(i = ;i < m;i ++)
{
scanf("%d%d%d",&x,&y,&k);
x ++;
y ++;
if(k > query(,y-x+,x,y,))
printf("%d\n",y-x+);
else if(k < query(,,x,y,))
printf("0\n");
else
printf("%d\n",bin(x,y,k));
}
}
return ;
}

HDU 4417 Super Mario(划分树+二分)的更多相关文章

  1. HDU 4417 - Super Mario ( 划分树+二分 / 树状数组+离线处理+离散化)

    题意:给一个数组,每次询问输出在区间[L,R]之间小于H的数字的个数. 此题可以使用划分树在线解决. 划分树可以快速查询区间第K小个数字.逆向思考,判断小于H的最大的一个数字是区间第几小数,即是答案. ...

  2. HDU 4417 Super Mario(划分树)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. HDU 4417 Super Mario(划分树问题求不大于k的数有多少)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. HDU-4417 Super Mario,划分树+二分!

    Super Mario 这个题也做了一天,思路是很清晰,不过二分那里写残了,然后又是无限RE.. 题意:就是查询区间不大于k的数的个数. 思路:裸划分树+二分答案.将区间长度作为二分范围.这个是重点. ...

  5. HDU 4417 Super Mario ( 离线树状数组 )

    把数值和查询放在一起从小到大排序,纪录每个数值的位置,当遇到数值时就更新到树状数组中,遇到查询就直接查询该区间和. #include <cstdio> #include <cstri ...

  6. HDU 4417 Super Mario 主席树

    分析:找一个区间里小于等于h的数量,然后这个题先离散化一下,很简单 然后我写这个题主要是熟悉一下主席树,其实这个题完全可以离线做,很简单 但是学了主席树以后,我发现,在线做,一样简单,而且不需要思考 ...

  7. HDU 4417 Super Mario 主席树查询区间小于某个值的个数

    #include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> ...

  8. HDU 4417 Super Mario (划分树)(二分)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. 【划分树+二分】HDU 4417 Super Mario

    第一次 耍划分树.. . 模板是找第k小的 #include <stdio.h> #include <string.h> #include <stdlib.h> # ...

随机推荐

  1. Python 正则表达式_re模块_使用compile加速

    使用compile加速 compile( rule [,flag] ) 将正则规则编译成一个Pattern对象,以供接下来使用. 第一个参数是规则式,第二个参数是规则选项. 返回一个Pattern对象 ...

  2. Bellman-Ford算法

    #include<stdio.h> #define max 0xffffff ][]; //图的邻接矩阵 ]; int n;//顶点个数 int m;//边个数 struct Edge { ...

  3. PHP日期格式转时间戳

    PHP 提供了函数可以方便的将各种形式的日期转换为时间戳,该类函数主要是: strtotime():将任何英文文本的日期时间描述解析为时间戳. mktime():从日期取得时间戳. strtotime ...

  4. 30.赋值运算符重载函数[Assign copy constructor]

    [问题] 给出如下CMyString的声明,要求为该类型添加赋值运算符函数.  C++ Code  1234567891011   class CMyString { public:     CMyS ...

  5. sybaseIQ索引类型和使用注意事项

    1. FP(Fast Projection)此索引为默认的索引形式,在创建表时系统自动设置此索引. 特点:用于SELECT.LIKE '%sys%'.SUM(A+B).JOIN操作等语句. 此类型索引 ...

  6. 利用FFmpeg生成视频缩略图 2.3.1

    1.下载FFmpeg文件包,解压包里的\bin\下的文件解压到 D:\ffmpeg\ 目录下. 下载地址 http://ffmpeg.zeranoe.com/builds/win32/static/ ...

  7. Heap:Sunscreen(POJ 3614)

    晒太阳 题目大意:一堆牛,为了避免晒太阳会灼烧自己,然后他们自己有自己的防晒指数(一个区间),防晒霜可以提高防晒因数SPF,大了不行小了不行,现在有一桶防晒霜,他们提供一定的SPF,但是最多可以提供k ...

  8. Greedy:Stall Reservations(POJ 3190)

    牛挤奶 题目大意:一群牛很挑剔,他们仅在一个时间段内挤奶,而且只能在一个棚里面挤,不能与其他牛共享地方,现在给你一群牛,问你如果要全部牛都挤奶,至少需要多少牛棚? 这一题如果把时间区间去掉,那就变成装 ...

  9. codeforces A. Table 解题报告

    题目链接:http://codeforces.com/problemset/problem/359/A 题目意思:给出一个n行m列的table,你需要选择一个good cell(假设为(x, y), ...

  10. grep' \b\b'

    \b单词锁定符,如: '\bgrep\b'只匹配grep [root@86 ttf-arphic-uming-0.0.20050501]# cat /proc/diskstats 1 0 ram0 0 ...