hdu4417 线段树+离线处理
来源:互联网 发布:科比 数据分析 生涯 编辑:程序博客网 时间:2024/04/28 20:49
题意是给你一个序列 m次询问 每次询问区间内比给定值小的有多少个
首先相到的肯定是线段树 但是按常规的做不容易做出来 这里用到离线处理 及先把所有的询问区间输入存起来并保存原来id 进行如下处理
对每段区间按高度从小到大排序 把序列也按从小到大排序并保存原来id
i表示插入位置 j表示询问位置 如果当前i表示的高度比当前j表示的高度小则跟新 否则查询(这样子的原因是当查询当前j表示的高度时只用跟上比他小的高度 )具体见代码
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;#define LL(x) (x<<1)#define RR(x) ((x<<1)|1)struct node{ int high; int ii;}A[100100];struct Node{ int L,R,h,i;}f[100100];int cmp1(node a,node b){ return a.high<b.high;}int cmp2(Node a,Node b){ return a.h<b.h;}int num[4*100000];int update(int L,int R,int pos,int mark){ num[mark]+=1; if(L==R&&L==pos) { return 0; } int mid=(L+R)/2; if(pos<=mid) { update(L,mid,pos,LL(mark)); } else update(mid+1,R,pos,RR(mark)); return 0;}int find(int L,int R,int left,int right,int mark){ if(L==left&&R==right) { return num[mark]; } int mid=(L+R)/2; if(right<=mid) { return find(L,mid,left,right,LL(mark)); } else if(left>mid) { return find(mid+1,R,left,right,RR(mark)); } else return find(L,mid,left,mid,LL(mark))+find(mid+1,R,mid+1,right,RR(mark));}int main(){ int n,m,i,j,a,T,b,c,d=1; int print[100010]; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { scanf("%d",&A[i].high); A[i].ii=i; } for(i=1;i<=m;i++) { scanf("%d%d%d",&f[i].L,&f[i].R,&f[i].h); f[i].L++; f[i].R++; f[i].i=i; } sort(A+1,A+1+n,cmp1); sort(f+1,f+1+m,cmp2); memset(num,0,sizeof(num)); int j=1; for(i=1;i<=n;) { if(A[i].high>f[j].h) { print[f[j].i]=find(1,n,f[j].L,f[j].R,1); j++; if(j>m) break; } if(A[i].high<=f[j].h) { update(1,n,A[i].ii,1); i++; } } while(j<=m) { print[f[j].i]=find(1,n,f[j].L,f[j].R,1); j++; } printf("Case %d:\n",d++); for(i=1;i<=m;i++) printf("%d\n",print[i]); } return 0;}
0 0
- hdu4417 线段树+离线处理
- HDU4417 Super Mario 线段树离线操作
- hdu4417- Super Mario(离线,线段树)
- Hdu4417线段树求区间统计+离线处理 线段树 树状数组
- 线段树离线处理专题
- hdu4288 离线处理线段树
- hdu4417 Super Mario 线段树端点更新
- hdu 4417 线段树离线处理
- hdu4358 线段树之离线累加处理
- hdu 4348 线段树离线处理
- hdu4417Super Mario(线段树+离线处理)
- hdu3874Necklace(线段树或者BIT + 离线处理)
- hdu4630 线段树||树状数组离线处理
- hdu3333 线段树+离散化+离线处理
- hdu 4638 Group (线段树+离线处理)
- HDU4638:Group(线段树离线处理)
- hdu 4630 线段树+离线处理
- HDU - 3874 Necklace (线段树 + 离线处理)
- 正则表达式-常用正则表达式
- Java DES 加密和解密算法的使用
- 工作后能捡起英语的三个网站
- Android下的Junit测试
- 来点好玩的,输入数字,点阵输出
- hdu4417 线段树+离线处理
- 信息论学习总结
- Android体系架构及认识
- 用CountDownLatch和CyclicBarrier处理并发线程
- iOS: 为画板App增加 Undo/Redo(撤销/重做)操作
- 怎样把图片转换成pdf
- LeetCode算法编程(两题)
- 3Sum Closest
- eclipse 设置注释模板& 调出注释快捷键