HDU 4417 Super Mario
题解:函数式线段树求区间小于等于k的数有几个,离线做法,首先将所有询问和序列一起离散,然后用函数式线段树处理。
#include <map>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=200005;
const int MAXN=3000005;
int n,m,tot,data[MAXN],son[MAXN][2],head[MAXN];
map<int,int>M;
int b[N],a[N],l[N],r[N],k[N];
int make(int l,int r){
int t=++tot,mid=(l+r)>>1;
if(l==r)return t;
son[t][0]=make(l,mid);son[t][1]=make(mid+1,r);
return t;
}
int insert(int x,int pos,int l,int r){
int t=++tot,mid=(l+r)>>1;
data[t]=data[pos]+1;
if(l==r)return t;
if(x<=mid)son[t][1]=son[pos][1],son[t][0]=insert(x,son[pos][0],l,mid);
else{son[t][0]=son[pos][0];son[t][1]=insert(x,son[pos][1],mid+1,r);}
return t;
}
int query(int x,int y,int k,int l,int r){
int mid=(l+r)>>1;
if(l==r) return 0;
if(k>=mid)return(query(son[x][1],son[y][1],k,mid+1,r)+data[son[y][0]]-data[son[x][0]]);
else return query(son[x][0],son[y][0],k,l,mid);
}
int main(){
int T,cnt=1;
scanf("%d",&T);
while(T--){
int s=0,t=0; M.clear(); tot=0;
printf("Case %d:\n",cnt++);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){scanf("%d",&a[i]);b[++s]=a[i];}
for(int i=1;i<=m;i++){scanf("%d%d%d",&l[i],&r[i],&k[i]);l[i]++,r[i]++;b[++s]=k[i];}
sort(b+1,b+s+1);
for(int i=1;i<=s;i++)if(!M[b[i]])M[b[i]]=++t;
for(int i=1;i<=n;i++)a[i]=M[a[i]];
for(int i=1;i<=m;i++)k[i]=M[k[i]];
head[0]=make(1,t);
for(int i=1;i<=n;i++)head[i]=insert(a[i],head[i-1],1,t);
for(int i=1;i<=m;i++)printf("%d\n",query(head[l[i]-1],head[r[i]],k[i],1,t));
}return 0;
}
HDU 4417 Super Mario的更多相关文章
- HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- 主席树:HDU 4417 Super Mario
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 4417 Super Mario 树状数组||主席树
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Prob ...
- HDU 4417 Super Mario(线段树)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 4417 Super Mario(划分树)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 4417 Super Mario (划分树)(二分)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 4417 Super Mario(划分树问题求不大于k的数有多少)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- [HDU 4417] Super Mario (树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 题目大意:给你n个数,下标为0到n-1,m个查询,问查询区间[l,r]之间小于等于x的数有多少个 ...
- hdu 4417 Super Mario/树套树
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意很简单,给定一个序列求一个区间 [L, R,]中小于等于H的元素的个数. 好像函数式线段树可 ...
- hdu 4417 Super Mario (主席树)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意: 给你段长为n的序列,有q个询问,每次询问区间[l.r]内有多少个数小于等于k 思路: 之前用 ...
随机推荐
- SQL复杂查询(子查询)
USE STUDY SELECT * from EMP SELECT * FROM SALGRADE --1.查询雇员姓名,所在部门编号和名称 SELECT ename,EMP.deptno,DEPT ...
- js 获取月份 格式yy-mm-dd
/** * 获取上一个月 * * @date 格式为yyyy-mm-dd的日期,如:2014-01-25 */ function getPreMonth(date) { var arr = date. ...
- Linux----给一个普通用户root权限
问题说明:linux可以通过useradd创建用户.那有没有想过.我们创建的用户怎么样才可以使它得到全部的root权限呢? 解决办法: 1.这是一个可以打80分的办法.就是编辑/etc/sudoers ...
- Oracle提示“资源正忙,需指定nowait”的解决方案
Oracle提示“资源正忙,需指定nowait”的解决方案 | T 本文我们主要介绍了Oracle数据库操作表时提示“资源正忙,需指定nowait”的解决方案,希望能够对您有所帮助. AD:51CT ...
- Oracle EBS-SQL (SYS-11):查询系统已打的PATCH.sql
select a.patch_name, b.DRIVER_FILE_NAME, c.language, b.creation_datefrom app ...
- linux关闭防火墙方法
在关闭防火墙之前需要查看防火墙的状态,可以使用service iptables status命令来查看,确定防火墙是否开启再来进行关闭操作. 如果想临时开启防火墙使用命令service iptable ...
- intent传对象
intent还有一个很好用的地方,就是传输对象,但要注意的是这里的传输只是将对象复制了一份通过intent进行传递,并不能达到实时更新的效果,也就是这个对象等偏重于“读”.intent对这个对象有着严 ...
- support.SerializationFailedException: Failed to deserialize payload.
support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of c ...
- Xcode 4.1~4.6 + iOS 5、iOS 6免证书(iDP)开发+真机调试+生成IPA全攻略
原创文章,欢迎分享:未经许可,不得转载:版权所有,侵权必究 开发环境使用的是目前为止最新的稳定版软件:Mac OS X Lion 10.7 + Xcode 4.1 目前Xcode 4.2 Previe ...
- android样式布局--->ListView(附上源代码)
在android应用开发过程中,Listview 是经常使用的数据展现控件,往往用于显示列表形式的数据. 假设只显示数据往往会显得非常单调.非常多时候依据须要定义不同的item 背景选项.比如定义数据 ...