hdu 4417 Super Mario
Super Mario
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1259 Accepted Submission(s): 620
For each test data:
The first line contains two integers n, m (1 <= n <=10^5, 1 <= m <= 10^5), n is the length of the road, m is the number of queries.
Next line contains n integers, the height of each brick, the range is [0, 1000000000].
Next m lines, each line contains three integers L, R,H.( 0 <= L <= R < n 0 <= H <= 1000000000.)
//线段树离线处理
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 100010
struct node{
int l,r,s,k;
}T[N*4],b[N];
int a[N],r[N],ans[N],res;
void build(int l,int r,int k){
T[k].l=l;T[k].r=r;
T[k].s=T[k].k=0;
if(l==r)return;
int mid=(l+r)/2;
build(l,mid,2*k);
build(mid+1,r,2*k+1);
}
void insert(int x,int k){
if(T[k].l==T[k].r){
if(T[k].l==x){T[k].s=1;}
return;
}
int mid=(T[k].l+T[k].r)/2;
if(mid>=x)insert(x,2*k);
else insert(x,2*k+1);
T[k].s=T[2*k].s+T[2*k+1].s;
}
void query(int l,int r,int k){
if(T[k].l==l&&T[k].r==r){
res+=T[k].s;
return;
}
if(T[k].l==T[k].r)return;
int mid=(T[k].l+T[k].r)/2;
if(mid>=r)query(l,r,2*k);
else if(mid<l)query(l,r,2*k+1);
else{
query(l,mid,2*k);
query(mid+1,r,2*k+1);
}
}
int cmp1(int i,int j){
return a[i]<a[j];
}
int cmp2(struct node& x,struct node& y){
return x.k<y.k;
}
int main(){
int T,t=1;
int n,m,i,j,k;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
build(0,n-1,1);
for(i=0;i<n;i++)scanf("%d",&a[r[i]=i]);
for(i=0;i<m;i++){
scanf("%d%d%d",&b[i].l,&b[i].r,&b[i].k);
b[i].s=i;
}
sort(r,r+n,cmp1);
sort(b,b+m,cmp2);
//for(i=0;i<n;i++)cout<<a[r[i]]<<" ";cout<<endl;
//for(i=0;i<m;i++)cout<<b[i].k<<" ";cout<<endl;
for(i=0,j=0;i<m;i++){
for(;j<n;j++)
if(a[r[j]]<=b[i].k){insert(r[j],1);}
else break;
res=0;
query(b[i].l,b[i].r,1);
ans[b[i].s]=res;
}
printf("Case %d:\n",t++);
for(i=0;i<m;i++)printf("%d\n",ans[i]);
}
return 0;
}
//函数式线段树在线处理
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 100010
#define mid(i,j) ((i+j)>>1)
struct node{
int l,r,cnt;
void init(int ll,int rr,int s){
l=ll;r=rr;cnt=s;
}
}T[N*20];
int a[N],b[N],r[N],n,m,cnt;
void update(int p,int x,int l,int r,int &k){
k=cnt++;T[k].init(T[p].l,T[p].r,T[p].cnt+1);
if(l==r)return;
int mid=mid(l,r);
if(mid>=x)update(T[p].l,x,l,mid,T[k].l);//住左
else update(T[p].r,x,mid+1,r,T[k].r);//往右
}
int query(int i,int j,int l,int r,int k){//[i,j]中第k大
if(l==r)return r;
int mid=mid(l,r);
int t=T[T[j].l].cnt-T[T[i].l].cnt;
if(t>=k)return query(T[i].l,T[j].l,l,mid,k);
else return query(T[i].r,T[j].r,mid+1,r,k-t);
}
int main(){
int i,j,k,tt,t=1;
r[0]=cnt=0;
scanf("%d",&tt);
while(tt--){
scanf("%d%d",&n,&m);
cnt=1;
for(i=1;i<=n;i++){scanf("%d",&a[i]);b[i]=a[i];}
sort(b+1,b+n+1);//从小到大排
int num=unique(b+1,b+n+1)-b-1;//除相邻重复元素后的元素个数
for(i=1;i<=n;i++){
a[i]=lower_bound(b+1,b+num+1,a[i])-b;//返回第一个大于a[i]的位置
update(r[i-1],a[i],1,num,r[i]);
}
printf("Case %d:\n",t++);
while(m--){
scanf("%d%d%d",&i,&j,&k);
int p=0,q=j-i+2,s,ans=0;
while(p+1<q){
s=(p+q)/2;
int tmp=b[query(r[i],r[j+1],1,num,s)];
//cout<<tmp<<"***"<<s<<endl;
if(tmp<=k){
p=ans=s;
}else{//大于
q=s;
}
}
printf("%d\n",ans);
}
}
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) Prob ...
- HDU 4417 Super Mario(莫队 + 树状数组 + 离散化)
Super Mario 思路 区间查找问题,容易想到离线莫队,确实这题就是莫队,接下来我们考虑如何维护区间高度值问题. 既然是离线嘛,我们容易想到离散化和他挂钩,想想这题是否需要离散化,高度的最大值是 ...
- HDU 4417 Super Mario(划分树问题求不大于k的数有多少)
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) 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 划分树+二分
http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意: 给定一个长度为n的序列,求区间[L,R]中小于h的个数: 思路: 分三种情况: 1:如果该区间最小 ...
- HDU 4417 Super Mario(线段树离线处理/主席树)
Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in ...
- HDU 4417 Super Mario(线段树||树状数组+离线操作 之线段树篇)
Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in ...
最新文章
- 电脑的cpu是怎么制作的?
- 【Matlab】山地建模?立体热度?怎么绘制三维曲面图?
- 滴滴 KDD CUP 2020 赛题详解
- 《Java程序员面试宝典》读书笔记1
- linux下grpc安装编译,linux下安装grpc插件 (c++和go语言)
- python去除图像光照不均匀_低光照环境下图像增强相关
- 【转】eclipse技巧1
- 电脑小白和黑客的对白
- common-io-2.0的新功能之文件监控FileAlteration(文件监听的两种实现方法《很全的监听文件例子》)...
- 二维码扫描ZXing简化
- mac --snip 滚动截屏
- 如何在windows xp下实现声音内录
- c语言追赶法求方程组的解,MATLAB-追赶法求解三对角方程组的算法原理例题与程序...
- 程序员的英文简历编写参考
- 使用fedora32桌面图标
- ABP vNext 缓存使用
- IT自学网有视频教程
- 2019多用户商城系统如何选,国内主流B2B2C商城对比
- 用python画玫瑰花
- 与线速度相关的角速度方向的确定
热门文章
- 淘汰了80%的Android面试者,搞懂这些直接来阿里入职
- 如何查美国公司的年报
- win10安装mmcv和mmcv-full报错
- win7电脑桌面图标和下方任务栏都消失了怎么办
- Hibernate之load和get的区别
- java代码耗尽内存_为什么运行Java应用程序的计算机几乎耗尽了物理内存,但仍然可以运行数周...
- 修改嵌入式linux驱动支持不同的LCD
- c语言撇号的用法,不同的语言标点使用也不同,英语中的撇号如何使用?美联英语带你了解...
- 1026: 字符类型判断 C语言
- Web测试的各个测试点