JZOJ2939统计
2015-09-04 15:46
302 查看
题目大意及模型转换
给定N个数(N<=10^5),现在有M(M<=10^5)个询问,每个询问形如区间L..R是否存在X。主席树
显然离散化后用主席树。这就是我看完题目后的第一想法。
但是,我们有更短的做法。
在线大法
我们根据数值为第一关键字位置为第二关键字排序。那么每个询问我们只需要二分出位置>=L中最小的数值为X的位置。
然后检验是否<=R。
#include<cstdio> #include<cstring> #include<algorithm> #define fo(i,a,b) for(i=a;i<=b;i++) #define maxn (100000+5) using namespace std; struct dong{ int data,id; } a[maxn]; int i,j,k,l,r,mid,x,y,t,n,m,ans; int read(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); } return x*f; } bool cmp(dong a,dong b){ if (a.data<b.data) return 1; else if (a.data==b.data&&a.id<b.id) return 1; else return 0; } int main(){ n=read(); fo(i,1,n){ a[i].id=i;a[i].data=read(); } sort(a+1,a+n+1,cmp); m=read(); fo(i,1,m){ x=read();y=read();t=read(); ans=0; l=1;r=n; while (l<=r){ mid=(l+r)/2; if (a[mid].data>t) r=mid-1; else if (a[mid].data<t) l=mid+1; else if (a[mid].data==t&&a[mid].id<x) l=mid+1; else{ ans=mid; r=mid-1; } } if (ans){ if (a[ans].data==t&&a[ans].id>=x&&a[ans].id<=y) printf("1");else printf("0"); } else printf("0"); } }
相关文章推荐
- 中国大学MOOC-陈越、何钦铭-数据结构 Maximum Subsequence Sum
- CCF-图像旋转-201503-1
- C++基础---构造函数与关键字explicit
- tomcat无法启动问题
- JAVA使用脚本引擎执行JS
- 简单四则运算表达式的java实现(2)
- python多线程实例
- 【Python之旅】第二篇(一):Python文件处理
- iOS 动态表情控件视图的实现
- 39 Combination Sum
- 最小生成树(普利姆算法、克鲁斯卡尔算法)
- 关于锁屏和回到桌面的activity生命周期的疑问
- **Git 使用规范流程
- Objective-C常用类的常用方法
- JS实现先显示大图后自动收起显示小图的广告代码
- ZigZag字符长转换
- Linux用户和用户组管理
- C++基础---构造函数与析构函数
- 【数据结构】图
- 成功的背后!(给所有IT人)