2012杭州网赛-1008
来源:互联网 发布:广州淘宝服装模特摄影 编辑:程序博客网 时间:2024/05/01 12:45
这道题要是用线段树(树状数组)的话,也是可以的,不过就是麻烦些。发现p在不断变化,果断想到离线算法。但是发现还是不会,后来看了解题报告才知道,不仅发现要把query中按照高度排序,而且a也要排序。。。。然后将a数组插到不同的集合中,集合就是题目中的询问,该集合中所有的元素都要<=这个集合对应的询问的高度。一边插入元素一边建树,和求逆序数的题很像,附代码:
#include <iostream>#include <algorithm>using namespace std;#define clear(a) memset(a,0,sizeof(a))#define lowbit(t) t&(-t)const int N=100100;struct node{ int v; int id;};node a[N];struct seg{ int x; int y; int h; int id;};seg b[N];int res[N],sum[N],n;bool cmp1(node a1,node b1){ return a1.v<b1.v;}bool cmp2(seg a1,seg b1){ return a1.h<b1.h;} void update(int k){ while (k<=n) { sum[k]++; k+=lowbit(k); }}int query(int m){ int k=m,r=0; while (k>0) { r+=sum[k]; k-=lowbit(k); } return r;}void init(){ clear(sum);clear(res);}int main(){ int i,T,m,cas; scanf("%d",&T); for (cas=1;cas<=T;cas++) { scanf("%d%d",&n,&m); init(); for (i=1;i<=n;i++) { scanf("%d",&a[i].v); a[i].id=i; } sort(a+1,a+n+1,cmp1); for (i=1;i<=m;i++) { scanf("%d%d%d",&b[i].x,&b[i].y,&b[i].h); b[i].x++; b[i].y++; b[i].id=i; } sort(b+1,b+1+m,cmp2); int i=1; int j=1; printf("Case %d:\n",cas); while (j<=m) { while (i<=n) { if (a[i].v>b[j].h) break; update(a[i].id); i++; } if (j<=m) { res[b[j].id]=query(b[j].y)-query(b[j].x-1); j++; } } for (i=1;i<=m;i++) printf("%d\n",res[i]); } return 0;}
- 2012杭州网赛-1008
- 2012网赛杭州赛区
- 2012杭州网络赛
- 2012杭州现场赛
- 2009 杭州赛区网赛
- 2012 ACM/ICPC杭州网赛总结 #by nobody
- hdu 4414 2012杭州网络赛
- hdu 4417 2012杭州网络赛
- 2012杭州网络赛赛后【缺ACDI】
- hdu 4419 2012杭州网络赛
- HDU4738【杭州网赛、判桥】
- hdu4740【杭州网赛、模拟、有点搜索?】
- 杭电 HDU 4414 Finding crosses 2012 ACM/ICPC 杭州网赛
- 2012ACM/ICPC杭州赛区网赛 —— F题
- 杭州区域赛总结
- 杭州赛区网络赛
- 杭州赛大资本
- 2012ACM杭州站
- 怎么实现listview分页加载
- 20120926 工作情况报告
- 设计模式建造者模式
- hashtable的运用
- 升级eclipse和ADT遇到的问题以及解决办法
- 2012杭州网赛-1008
- Linux wc命令详解
- android 从网络上下载图片
- 近期学习思考
- 在oracle中建立自动递增的主键列
- 解决sesseion超时后frameset中显示登陆页面的问题
- Android中的SharedPreferences陷阱
- 查看系统进程和详细路径
- Toad For Oracle的用法介绍