思路:将点按值从小到大排序,询问按h从小到大排序。

在建立线段树,按h的大小更新树并得到该次查询的结果!

代码如下:

 #include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstring>
#define MAX 100005
#define I(x) scanf("%d",&x)
#define lson step<<1
#define rson step<<1|1
using namespace std;
int ans[MAX];
struct node
{
int x,y,h,id;
bool operator<(const node a)const{
return h<a.h;
}
}q[MAX];
struct point
{
int v,id;
bool operator<(const point a)const{
return v<a.v;
}
}p[MAX];
struct tree
{
int l,r,cnt;
}T[MAX<<];
void built(int step,int l,int r)
{
T[step].l=l;
T[step].r=r;
T[step].cnt=;
if(l==r) return ;
int m=(l+r)>>;
built(lson,l,m);
built(rson,m+,r);
}
void update(int step,int pos)
{
T[step].cnt++;
if(T[step].l==T[step].r) return;
int m=(T[step].l+T[step].r)>>;
if(pos<=m) update(lson,pos);
else update(rson,pos);
}
int query(int step,int l,int r)
{
if(T[step].l==l&&T[step].r==r) return T[step].cnt;
int m=(T[step].l+T[step].r)>>;
if(r<=m) return query(lson,l,r);
else if(l>m) return query(rson,l,r);
else return query(lson,l,m)+query(rson,m+,r);
}
int main()
{
int t,i,j,m,n,k,ca=;
I(t);
while(t--){
scanf("%d%d",&n,&m);
for(i=;i<n;i++){
I(p[i].v);
p[i].id=i+;
}
for(i=;i<m;i++){
scanf("%d%d%d",&q[i].x,&q[i].y,&q[i].h);
q[i].id=i;
}
built(,,n);
sort(p,p+n);
sort(q,q+m);
j=;
for(i=;i<m;i++){
while(j<n&&p[j].v<=q[i].h){
update(,p[j].id);
j++;
}
ans[q[i].id]=query(,q[i].x+,q[i].y+);
}
printf("Case %d:\n",++ca);
for(i=;i<m;i++)
printf("%d\n",ans[i]);
}
return ;
}

这个是划分树做的。

 #include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
#include<set>
#include<string>
#include<queue>
#define inf 1<<28
#define M 6000005
#define N 100005
#define maxn 300005
#define Min(a,b) ((a)<(b)?(a):(b))
#define Max(a,b) ((a)>(b)?(a):(b))
#define pb(a) push_back(a)
#define mem(a,b) memset(a,b,sizeof(a))
#define LL long long
#define MOD 1000000007
#define lson step<<1
#define rson step<<1|1
using namespace std;
struct Node{
int left,right;
int sum;
}L[N*];
int sa[N],num[][N],cnt[][N];//sa中是排序后的,num记录每一层的排序结果,cnt[deep][i]表示第deep层,前i个数中有多少个进入左子树
void Bulid(int step,int l,int r,int deep){
L[step].left=l;
L[step].right=r;
if(l==r)
return;
int mid=(l+r)>>;
int mid_val=sa[mid],lsum=mid-l+;;
for(int i=l;i<=r;i++)
if(num[deep][i]<mid_val)
lsum--; //lsum表示左子树中还需要多少个中值
int L=l,R=mid+;
for(int i=l;i<=r;i++){
if(i==l)
cnt[deep][i]=;
else
cnt[deep][i]=cnt[deep][i-];
if(num[deep][i]<mid_val||(num[deep][i]==mid_val&&lsum>)){ //左子树
num[deep+][L++]=num[deep][i];
cnt[deep][i]++;
if(num[deep][i]==mid_val)
lsum--;
}
else
num[deep+][R++]=num[deep][i];
}
Bulid(*step,l,mid,deep+);
Bulid(*step+,mid+,r,deep+);
}
int Query(int step,int l,int r,int k,int deep){
if(l==r)
return num[deep][l];
int s1,s2; //s1为[L[step].left,l-1]中分到左子树的个数
if(L[step].left==l)
s1=;
else
s1=cnt[deep][l-];
s2=cnt[deep][r]-s1; //s2为[l,r]中分到左子树的个数
int m=(L[step].left+L[step].right)/;
if(k<=s2) //左子树的数量大于k,递归左子树
return Query(lson,L[step].left+s1,L[step].left+s1+s2-,k,deep+);
int b1=l--L[step].left+-s1; //b1为[L[step].left,l-1]中分到右子树的个数
int b2=r-l+-s2; //b2为[l,r]中分到右子树的个数
return Query(rson,m++b1,m++b1+b2-,k-s2,deep+);
}
int slove(int l,int r,int h){
int ans=,low=,high=r-l+,mid;
while(low<=high){
mid=(low+high)/;
int tmp=Query(,l,r,mid,);
if(tmp<=h){ans=mid;low=mid+;}
else high=mid-;
}
return ans;
}
int main(){
int n,q,t,cas=;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&q);
for(int i=;i<=n;i++){
scanf("%d",&sa[i]);
num[][i]=sa[i];
}
sort(sa+,sa++n);
Bulid(,,n,);
printf("Case %d:\n",++cas);
while(q--){
int l,r,h;
scanf("%d%d%d",&l,&r,&h);
l++;r++;
printf("%d\n",slove(l,r,h));
}
}
return ;
}

hdu 4417 Super Mario 离线线段树的更多相关文章

  1. HDU 4417 Super Mario(线段树)

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

  2. HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)

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

  3. HDU 4417.Super Mario-可持久化线段树(无修改区间小于等于H的数的个数)

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

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

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

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

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

  6. hdu 4417 Super Mario (主席树)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意: 给你段长为n的序列,有q个询问,每次询问区间[l.r]内有多少个数小于等于k 思路: 之前用 ...

  7. HDU 4417 Super Mario(主席树 区间不超过k的个数)题解

    题意:问区间内不超过k的个数 思路:显然主席树,把所有的值离散化一下,然后主席树求一下小于等于k有几个就行.注意,他给你的k不一定包含在数组里,所以问题中的询问一起离散化. 代码: #include& ...

  8. HDU 5700 区间交 离线线段树

    区间交 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5700 Description 小A有一个含有n个非负整数的数列与m个区间.每个区间可以表示为 ...

  9. HDU 4417 Super Mario(2012杭州网络赛 H 离线线段树)

    突然想到的节约时间的方法,感觉6翻了  给你n个数字,接着m个询问.每次问你一段区间内不大于某个数字(不一定是给你的数字)的个数 直接线段树没法做,因为每次给你的数字不一样,父节点无法统计.但是离线一 ...

随机推荐

  1. JDK 与 JRE (转)

    很多程序员已经干了一段时间java了依然不明白jdk与jre的区别.JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境. ...

  2. Allegro设置十字大光标

    使用大十字光标,在摆放元器件时,容易对齐.在allegro中,可以通过设置实现大十字光标,其具体方法如下: 1.选择Setup->User Perferences,即可出现如下图所示界面: 2. ...

  3. Ubuntu14.04 安装 PHP cURL

    今天遇到 Fatal error: Call to undefined function curl_init() in /xxx/xxxx/www/application/library/Ku/Htt ...

  4. jquery 从页面获取li数组,删除不在数组中的key

    应用场景: 获取页面 li 下面 key的值,添加到 arr数组 删除车型不在arr 数组中的value值. 示例代码: var getSaleModels = function(brand_id){ ...

  5. jQuery插件css3动画模拟confirm弹窗

    相比浏览器自带的alert.confirm,能力所及,我更喜欢所有的东西都是自定义:首先在head标签(当然喜欢其他地方自己看着办)内引入插件样式表和js.<link rel="sty ...

  6. php后台如何避免用户直接进入方法实例

    这篇文章介绍了php后台如何避免用户直接进入方法实例,有需要的朋友可以参考一下 1)创建BaseController控制器继承Controller(后台的一切操作要继承BaseController): ...

  7. Java中resourceBundle和Properties的区别

    第一种办法InputStream is = Test.class.getResourceAsStream("DbConfig.properties");Properties p = ...

  8. SQL统计——按照各种维度

    在SQLserver中可以按照各种维度进行统计,实现与EXCLE一样强大的功能. --========================== --Blog:<奔跑的金鱼> --Desc:&l ...

  9. 【nodejs】jade模板入门

    使用jetbrians webstom创建空项目 1.创建package.json 引用依赖配置 { "name": "demojade", "des ...

  10. MITK Tutorial(二)

    目标: 生成MITK 插件包括一个新用户交互的视图,并调用一些ITK filters. Step 1: How to create a new MITK Plugin 可以选择用Plugin Gene ...