hdu 4417 Super Mario/树套树
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417
题意很简单,给定一个序列求一个区间 [L, R,]中小于等于H的元素的个数。
好像函数式线段树可解吧,可弱弱的沙茶一直没弄懂其精髓,只好用树套树暴力碾压了
额树套树,线段树的每一个节点套一个sb树。
当查询[l,r]区间中的值小于等于H的个数,先用线段树找到相应的区间,
然后再查询该区间下对应的平衡树中小于等于H的个数,累加即可。
一直以为会超时,结果400+ms就过了,数据应该很弱吧(自己对拍了一组(N,M)10w规模的跑了2s多o(╯□╰)o)。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define lc root<<1
#define rc root<<1|1
const int Max_N = ;
struct SBT{
int v, s, c;
SBT *ch[];
inline void set(int _v = ){
v = _v, c = s = ;
ch[] = ch[] = null;
}
inline void push_up(){
s = ch[]->s + ch[]->s + c;
}
inline int cmp(int x) const{
return v == x ? - : x > v;
}
}*null, stack[Max_N << ], *ptr[Max_N << ];
int sz = , sum = , arr[Max_N];
void init(){
null = &stack[sz++];
null->v = null->s = null->c = ;
}
inline void rotate(SBT* &x, int d){
SBT *k = x->ch[!d];
x->ch[!d] = k->ch[d];
k->ch[d] = x;
k->s = x->s;;
x->push_up();
x = k;
}
void Maintain(SBT* &x, int d){
if (x->ch[d] == null) return;
if (x->ch[d]->ch[d]->s > x->ch[!d]->s){
rotate(x, !d);
} else if (x->ch[d]->ch[!d]->s > x->ch[d]->s){
rotate(x->ch[d], d), rotate(x, !d);
} else {
return;
}
Maintain(x, ), Maintain(x, );
}
void insert(SBT* &x, int v){
if (x == null){
x = &stack[sz++];
x->set(v);
} else {
x->s++;
int d = x->cmp(v);
if (- == d){
x->c++;
return;
}
insert(x->ch[d], v);
x->push_up();
Maintain(x, d);
}
}
int sbt_rank(SBT *x, int key){
int t, cur;
for (t = cur = ; x != null;){
t = x->ch[]->s;
if (key < x->v) x = x->ch[];
else if (key >= x->v) cur += x->c + t, x = x->ch[];
}
return cur;
}
void seg_built(int root, int l, int r){
ptr[root] = null;
for (int i = l; i <= r; i++) insert(ptr[root], arr[i]);
if (l == r) return;
int mid = (l + r) >> ;
seg_built(lc, l, mid);
seg_built(rc, mid + , r);
}
void seg_rank(int root, int l, int r, int x, int y, int v){
if (x > r || y < l) return;
if (x <= l && y >= r){
sum += sbt_rank(ptr[root], v);
return;
}
int mid = (l + r) >> ;
seg_rank(lc, l, mid, x, y, v);
seg_rank(rc, mid + , r, x, y, v);
}
int main(){
#ifdef LOCAL
freopen("in.txt", "r", stdin);
freopen("out.txt", "w+", stdout);
#endif
int i, t, n, m, a, b, c, k = ;
scanf("%d", &t);
while (t--){
sz = , init();
scanf("%d %d", &n, &m);
printf("Case %d:\n", k++);
for (i = ; i <= n; i++) scanf("%d", &arr[i]);
seg_built(, , n);
while (m--){
scanf("%d %d %d", &a, &b, &c);
sum = ;
seg_rank(, , n, a + , b + , c);
printf("%d\n", sum);
}
}
return ;
}
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) 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 (主席树)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意: 给你段长为n的序列,有q个询问,每次询问区间[l.r]内有多少个数小于等于k 思路: 之前用 ...
- hdu 4417 Super Mario 离线线段树
思路:将点按值从小到大排序,询问按h从小到大排序. 在建立线段树,按h的大小更新树并得到该次查询的结果! 代码如下: #include<iostream> #include<stdi ...
- HDU 4417 Super Mario(主席树 区间不超过k的个数)题解
题意:问区间内不超过k的个数 思路:显然主席树,把所有的值离散化一下,然后主席树求一下小于等于k有几个就行.注意,他给你的k不一定包含在数组里,所以问题中的询问一起离散化. 代码: #include& ...
- 主席树: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)Total ...
随机推荐
- only one is important
今天早上还是去了图书馆,看了一早上的hello world(intel opencl),清楚了程序编写的基本流程,但是,仍和以前一样,貌似看懂了,其实什么也不会,没有发现什么问题.中午,回来取了我的笔 ...
- IList,IQeurable,IEnumble和List 的区别
IList,IQeurable,IEnumble和List 的区别主要如下: 1.IList(IList<T>)会立即在内存里创建持久数据,这就没有实现“延期执行(deferred exe ...
- Android基础总结(4)——广播接收器
在Android中的每个应用程序可以对自己感兴趣的广播进行注册,这样该程序就只会接收自己所关心的广播内容,这些广播可能来自于系统的,也可能来自于其他应用程序的.Android提供了一整套完整的API, ...
- sql实现分页
IF EXISTS(SELECT * FROM sysobjects WHERE name='usp_getPage') DROP PROC usp_getPage GO CREATE PROC us ...
- boost:exception使用实例
/************************************************************************/ /*功能描述: boost exception使用 ...
- iTunes - Forensic guys' best friend
What chances do you think to acquire suspect's data from his/her iDevice? If suspects also use iTune ...
- hdu2085
#include <stdio.h> int main(){ __int64 h[],l[]; int i,j; int n; ){ h[]=; l[]=; ;i<=n;++i){ ...
- linux驱动程序框架基础
============================ 指引 ============================= 第一节是最基础的驱动程序: 第二节是/dev应用层接口的使 ...
- IOS CLLocationManager定位反编码位置信息
//获取位置和坐标#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1 if (IOS_VERSION >= 8.0) { ...
- leetcode1:在数组中找2个数的和正好等于一个给定值--哈希
package java_net_test; import java.util.HashMap; import java.util.Iterator; import java.util.Map; pu ...