HDU 5172 GTY's gay friends 线段树+前缀和+全排列
2016-04-28 01:09
447 查看
题目链接:
hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5172bc(中文): http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=567&pid=1003
题解:
线段树+前缀和一个区间要满足1到n的一个排列,要同时满足两点,一是它的和是n*(n+1)/2,这个可以用前缀和直接求;二是它每个元素不能重复。
区间内每个元素都不能重复:
记录第i个元素的左边一个离他最近的值与他相等的数的位置,记在arr[i]里面,对于区间[L,r]要满足区间里面最大的arr[i](L<=i<=r)要小于L;这个可以用线段树或rmq维护。
要先比较第一个条件,即和要先等于n*(n+1)/2,满足了再去查线段树,否则会超时。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define lson (o<<1) #define rson ((o<<1)+1) #define M (l+(r-l)/2) using namespace std; typedef long long LL; const int maxn = 1e6 + 10; LL sumv[maxn << 2]; int maxv[maxn << 2]; int arr[maxn],vis[maxn]; int n, m; int max(int a, int b) { return a > b ? a : b; } void build(int o, int l, int r) { if (l == r) { maxv[o] = arr[l]; } else { build(lson, l, M); build(rson, M + 1, r); maxv[o] = max(maxv[lson], maxv[rson]); } } int ql, qr; void query(int o, int l, int r,int &ma) { if (ql <= l&&r <= qr) { ma = max(ma, maxv[o]); } else { if (ql <= M) query(lson, l, M,ma); if (qr > M) query(rson, M + 1, r, ma); } } bool check(int l,int r) { LL nn = r - l + 1; if (nn*(nn + 1) / 2 != sumv[r] - sumv[l - 1]) return false; int ma = -1; query(1, 1, n,ma); if (ma >= l) return false; return true; } void init() { sumv[0] = 0; memset(vis, 0, sizeof(vis)); } int main() { while(scanf("%d%d", &n, &m) == 2 && n) { init(); for (int i = 1; i <= n; i++) { int x; scanf("%d", &x); sumv[i] = sumv[i - 1] + x; arr[i] = vis[x]; vis[x] = i; } build(1,1,n); while (m--) { scanf("%d%d", &ql, &qr); LL len = qr - ql + 1; if (check(ql,qr)) { puts("YES"); } else { puts("NO"); } } } return 0; }
相关文章推荐
- Kafka开发实战(一)-入门篇
- .NET单元测试的艺术-1.入门
- redis 一二事 - 搭建集群缓存服务器
- CSS3 input 输入框蓝光特效
- 七大排序算法初步实现
- Xamarin Evolve 2016 Keynote回顾
- maven学习系列2----maven简单配置
- 并查集
- 虚幻4 材质的编译。
- phpStorm 2016.1 最新版激活方法
- 解读(四):分析主界面顶部Tab的实现
- Python Cookbook - 1 - 数据结构和算法
- RDD执行延迟执行原理
- RTSPClient工具EasyRTSPClient支持H.265,支持海思等各种芯片平台
- RTSPClient工具EasyRTSPClient支持H.265,支持海思等各种芯片平台
- 机器学习笔记04:逻辑回归(Logistic regression)、分类(Classification)
- react -- 计时器
- sql执行顺序
- Spring 框架使用QQ邮箱发送邮件
- 硬盘存储原理