HDU 4417 题解
来源:互联网 发布:js加附近人脚本 编辑:程序博客网 时间:2024/05/22 15:41
题目大意
给你个序列,每次问l~r之间有几个数<=k
我的做法
把序列中的每个数视为添加操作,把一个询问拆成两个,按位置从小到大排序。从前往后扫一遍就可以得出答案
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct p{ int x; int y; int u; int num; p(int a=0,int b=0,int c=0,int d=0) { x=a; y=b; u=c; num=d; }};bool cmp(p a,p b){ if(a.x!=b.x) return a.x<b.x; return a.u<b.u;}p a[300010];int c[300010];int e[300010];void add(int x,int v){ for(;x<=300000;x+=x&-x) c[x]+=v;}int sum(int x){ int s=0; for(;x;x-=x&-x) s+=c[x]; return s;}int d[300010];int ans[300010];int main(){ int t; int n,m; int i; int tt=0; scanf("%d",&t); while(t--) { printf("Case %d:\n",++tt); scanf("%d%d",&n,&m); memset(c,0,sizeof(c)); memset(ans,0,sizeof(ans)); for(i=1;i<=n;i++) { scanf("%d",&d[i]); e[i]=d[i]; } sort(e+1,e+n+1); int num=unique(e+1,e+n+1)-e-1; int cnt=0; e[0]=-1; for(i=1;i<=n;i++) a[++cnt]=p(i,lower_bound(e+1,e+num+1,d[i])-e,-2,i); int x,y,z,k; for(i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&k); x++; y++; z=upper_bound(e+1,e+num+1,k)-e-1; a[++cnt]=p(y,z,1,i); a[++cnt]=p(x-1,z,-1,i); } sort(a+1,a+cnt+1,cmp); for(i=1;i<=cnt;i++) if(a[i].u==-2) add(a[i].y,1); else ans[a[i].num]+=a[i].u*sum(a[i].y); for(i=1;i<=m;i++) printf("%d\n",ans[i]); } return 0;}
0 0
- HDU 4417 题解
- hdu 4602题解
- hdu 1789题解
- HDU 4665 题解
- HDU 4710题解
- HDU 4715题解
- hdu 1087题解
- hdu 2844题解
- hdu 2845 题解
- hdu 4007题解
- hdu 4004题解
- hdu 1879题解报告
- HDU 2180 时钟 题解
- HDU 1425 sort 题解
- HDU 1015 Safecracker 题解
- HDU Computer Transformation1041 题解
- HDU 题解 1024
- hdu 4451Dressing题解
- 核心流程 - 【Dr.Elephant源码分析系列文章-2】
- 项目日志在项目管理中的应用
- poj 3181 完全背包计数+高精度
- 网页中插入FLASH(swf文件)的html代码
- Android内存管理之道
- HDU 4417 题解
- 关于Json不规则解析
- 免费的Gif制作工具-录屏、录像
- Git常用命令
- 第四章总结
- 脚本半小时 执行mysql查询相应的数据
- Java基础学习总结(27)——7 款开源 Java 反编译工具
- dia在ubuntu下无法输入中文的解决办法
- 揪心的痛