HDU 4417 Super Mario 主席树查询区间小于某个值的个数
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<vector>
#define LL long long
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define per(i,j,k) for(int i=j;i>=k;i--)
#define pb push_back
#define pii pair<int,int>
#define mp make_pair
using namespace std;
const int maxx = 1e5+;
vector<int>v;
struct node{
int l,r,w;
}tree[maxx*];
int cnt;
int root[maxx],a[maxx];
int l[maxx],r[maxx],h[maxx];
int getid(int x){
return lower_bound(v.begin(),v.end(),x)-v.begin()+;
}
void inserts(int l,int r,int pre,int &now,int pos,int val){
///新建节点编号
now=++cnt;
///拷贝并更新节点信息
tree[now]=tree[pre];
if (l==r){
tree[now].w+=val;
return ;
}
int mid=(l+r)>>;
if (pos<=mid){
inserts(l,mid,tree[pre].l,tree[now].l,pos,val);
}else {
inserts(mid+,r,tree[pre].r,tree[now].r,pos,val);
}
//维护区间数字的个数目
tree[now].w=tree[tree[now].l].w+tree[tree[now].r].w;
}
int query(int pre,int now,int l,int r,int pos){
if (l==r){
//查询某个区间数字的个数,就是两个版本权值线段树个数的差值
return tree[now].w-tree[pre].w;
}
int mid=(l+r)>>;
if (pos<=mid){
return query(tree[pre].l,tree[now].l,l,mid,pos);
}else {
return tree[tree[now].l].w-tree[tree[pre].l].w+query(tree[pre].r,tree[now].r,mid+,r,pos);
}
}
int main(){
int t;
int n,m;
scanf("%d",&t);
int ca=;
while(t--){
ca++;
printf("Case %d:\n",ca);
cnt=;
scanf("%d%d",&n,&m);
v.clear();
memset(root,,sizeof(root));
memset(tree,,sizeof(tree));
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
v.pb(a[i]);
}
for (int i=;i<=n;i++){
scanf("%d%d%d",&l[i],&r[i],&h[i]);
v.push_back(h[i]);///注意为了防止出错,你需要同时离散高度,防止高度出现问题
}
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
int sz=v.size();
for (int i=;i<=n;i++){
int x=getid(a[i]);
inserts(,sz,root[i-],root[i],x,);
}
for (int i=;i<=m;i++){
int posc=getid(h[i]);
l[i]++;
r[i]++;
if (posc==)printf("0\n");
else
printf("%d\n",query(root[l[i]-],root[r[i]],,sz,posc));
}
}
return ;
}
HDU 4417 Super Mario 主席树查询区间小于某个值的个数的更多相关文章
- HDU 4417 Super Mario 主席树
分析:找一个区间里小于等于h的数量,然后这个题先离散化一下,很简单 然后我写这个题主要是熟悉一下主席树,其实这个题完全可以离线做,很简单 但是学了主席树以后,我发现,在线做,一样简单,而且不需要思考 ...
- 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 ( 划分树+二分 / 树状数组+离线处理+离散化)
题意:给一个数组,每次询问输出在区间[L,R]之间小于H的数字的个数. 此题可以使用划分树在线解决. 划分树可以快速查询区间第K小个数字.逆向思考,判断小于H的最大的一个数字是区间第几小数,即是答案. ...
- HDU 4417 Super Mario ( 离线树状数组 )
把数值和查询放在一起从小到大排序,纪录每个数值的位置,当遇到数值时就更新到树状数组中,遇到查询就直接查询该区间和. #include <cstdio> #include <cstri ...
- HDU 4417 Super Mario(划分树+二分)
题目链接 #include <cstdio> #include <cstring> #include <algorithm> using namespace std ...
- A - 低阶入门膜法 - K-th Number (主席树查询区间第k小)
题目链接:https://cn.vjudge.net/contest/284294#problem/A 题目大意:主席树查询区间第k小. 具体思路:主席树入门. AC代码: #include<i ...
- HDU 4417 Super Mario(主席树 区间不超过k的个数)题解
题意:问区间内不超过k的个数 思路:显然主席树,把所有的值离散化一下,然后主席树求一下小于等于k有几个就行.注意,他给你的k不一定包含在数组里,所以问题中的询问一起离散化. 代码: #include& ...
- 【划分树+二分】HDU 4417 Super Mario
第一次 耍划分树.. . 模板是找第k小的 #include <stdio.h> #include <string.h> #include <stdlib.h> # ...
随机推荐
- Lab1 ex1 物理页内存分配算法的实现
调用流程如下 kern_init --> pmm_init-->page_init-->init_memmap--> pmm_manager->init_memmap 从 ...
- 【扩展推荐】Laravel-ide-helper 高效的 IDE 智能提示插件 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 - Powered by PHPH
说明# barryvdh/laravel-ide-helper 扩展包能让你的 IDE ( PHPStorm, Sublime ) 实现自动完成.代码智能提示和代码跟踪等功能,大大提高你的开发效率. ...
- TP5.1 首页路由
把自带的return 删了
- PHPStorm 批量选择,多光标同时编辑相同的内容
一直按Alt+J
- hdu 2444 The Accomodation of Students(二分匹配 匈牙利算法 邻接表实现)
The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- LintCode刷题笔记-- Maximal Square
标签:动态规划 题目描述: Given a 2D binary matrix filled with 0's and 1's, find the largest square containing a ...
- Struts framework
Struts功能详解——ActionMapping对象 Struts旅程(一)Struts简介和原理 实例讲解DispatchAction和LookupDispatchAction DispatchA ...
- 【JZOJ4161】于神之怒 莫比乌斯反演
任务 答案mod 1e9+7. 解法 容易写出反演: Ans=∑T=1nTk∗∑i=1⌊nT⌋⌊niT⌋⌊miT⌋μ(i) ∑⌊nT⌋i=1⌊niT⌋⌊miT⌋μ(i)这个因式显然是经典的分块处理: ...
- ORACLE 使用笔记
ORACLE TRUNC()函数 TRUNC():类似截取函数,按指定的格式截取输入的数据. 1.[trunc(for dates)]TRUNC()函数处理日期 语法格式:TRUNC(date[,fm ...
- Python学习笔记(一)初识Python以及安装Python
一.Python简介 1.Python发展史 Python 是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的. Python 本身也是由诸多 ...