题目链接:

hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5172

bc(中文): 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,满足了再去查线段树,否则会超时。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define lson (o<<1)
 6 #define rson ((o<<1)+1)
 7 #define M (l+(r-l)/2)
 8 using namespace std;
 9 typedef long long LL;
10
11 const int maxn = 1e6 + 10;
12 LL sumv[maxn << 2];
13 int maxv[maxn << 2];
14 int arr[maxn],vis[maxn];
15 int n, m;
16
17 int max(int a, int b) { return a > b ? a : b; }
18
19 void build(int o, int l, int r) {
20     if (l == r) {
21         maxv[o] = arr[l];
22     }
23     else {
24         build(lson, l, M);
25         build(rson, M + 1, r);
26         maxv[o] = max(maxv[lson], maxv[rson]);
27     }
28 }
29
30 int ql, qr;
31 void query(int o, int l, int r,int &ma) {
32     if (ql <= l&&r <= qr) {
33         ma = max(ma, maxv[o]);
34     }
35     else {
36         if (ql <= M) query(lson, l, M,ma);
37         if (qr > M) query(rson, M + 1, r, ma);
38     }
39 }
40
41 bool check(int l,int r) {
42     LL nn = r - l + 1;
43     if (nn*(nn + 1) / 2 != sumv[r] - sumv[l - 1]) return false;
44     int ma = -1;
45     query(1, 1, n,ma);
46     if (ma >= l) return false;
47     return true;
48 }
49
50 void init() {
51     sumv[0] = 0;
52     memset(vis, 0, sizeof(vis));
53 }
54
55 int main() {
56     while(scanf("%d%d", &n, &m) == 2 && n) {
57         init();
58         for (int i = 1; i <= n; i++) {
59             int x;
60             scanf("%d", &x);
61             sumv[i] = sumv[i - 1] + x;
62             arr[i] = vis[x];
63             vis[x] = i;
64         }
65         build(1,1,n);
66         while (m--) {
67             scanf("%d%d", &ql, &qr);
68             LL len = qr - ql + 1;
69             if (check(ql,qr)) {
70                 puts("YES");
71             }
72             else {
73                 puts("NO");
74             }
75         }
76     }
77     return 0;
78 }

转载于:https://www.cnblogs.com/fenice/p/5441132.html

HDU 5172 GTY's gay friends 线段树+前缀和+全排列相关推荐

  1. HDU 5172 GTY's gay friends 线段树

    GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  2. GTY‘s gay friends 线段树+前缀和

    链接 题意:n个数,m次询问,每次询问判断一个区间是否为一个序列 解法: 判断长度为x的序列只要满足两个条件: 1.区间和为(1+x)*x/2  2.1~x每个数只出现一次: 对于第一个限制前缀和求区 ...

  3. BestCoder Round #29 1003 (hdu 5172) GTY's gay friends [线段树 判不同 预处理 好题]

    传送门 GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Ot ...

  4. HDU 5172 GTY's gay friends (线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5172 题意: 给你一个n个数的数组,m次询问,询问在[L, R] 这个区间里面有没有 [1, R-L+ ...

  5. hdu 5172 GTY's gay friends(线段树最值)

    题意: GTY有n个朋友,站成一排,每个人有一个特征值ai. 有m个询问.每次询问给两个数L,R.问你[L,R](即aL...aR)是否是1..(R-L+1)的一个全排列. 是输出YES,否则输出NO ...

  6. HDU 5172 GTY's gay friends HASH随机算法

    传送门:点击打开链接 GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K ( ...

  7. Hdu 5172 GTY's gay friends

    题目链接:点击打开链接 题目大意就是,给一段序列,长度为10^5,然后有10^5个询问,每次询问为一个区间,l为左边界,r为右边界,该区间是否为一个1到r-l+1的一个排列,即该区间是否满足包含1到r ...

  8. HDU - 5172 GTY's gay friends

    题目链接 题意:n个数m个查询,问[l,r]中的数是否为1到r-l+1的一个排列. 做法1: hash一下,对于[1...n],每个数都随机分配一个hash值,一个集合的hash值为元素异或和.预处理 ...

  9. HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)

    链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...

最新文章

  1. [Winform]检测exe是否已经运行,并将其置顶
  2. 分享一下收到的微软CRM云分享计划 邮件
  3. 【GoLang】转载:我为什么放弃Go语言,哈哈
  4. javascript 中this 的用法:
  5. 一代不如一代?别轻易给年轻人贴标签
  6. C++11 标准新特性: 右值引用与转移语义(点评)
  7. springMVC处理跨域问题
  8. 每天开豪车跟随老板出入高档会所,吃住高档酒店,这样的职场生活,有必要坚持下去吗?
  9. 发现一个特给力的编写HTML/CSS的插件——Zen Coding
  10. sas和python哪个好学_Sas R和Python的比较 | 数据分析的工具选择
  11. 华为s8600手机驱动_深度丨国产OLED驱动芯片玩家的机遇与困难
  12. 成功破解某app加密接口
  13. 解决接收 ACTION_PACKAGE_REPLACED 的广播会另外接收到 REMOVED 和 ADDED 的问题
  14. SAP FICO OAYZ配置定义资产分类中的折旧范围时,无法填写默认折旧年度和期间
  15. 使用电脑时经常遇到问题?来试试这四款小众的实用软件吧
  16. JAVA项目的目录结构分析
  17. YUV 422 10bit
  18. torch.sigmoid、torch.nn.Sigmoid和torch.nn.functional.sigmoid的区别
  19. js汉字转换拼音(网上找的js库)
  20. 我的 Python 主机空间

热门文章

  1. 对于TF密码卡而言,如果本身不能进行多线程加密,那么有什么方法可以对不同会话密钥进行加密以及不同数据进行类似并发的加密呢?...
  2. CSS animate动画效果
  3. vue项目中通过echarts实现地图路径展示
  4. 考研逻辑-逻辑3主讲人:王超-2020-04-25
  5. BERT模型的优化改进方法!
  6. touch服务器端文件夹,使用linux的touch命令创建文件
  7. 【调剂】武汉轻工大学2020年硕士研究生招生接收调剂考生公告
  8. 全国高新计算机模拟器,最新版:Android版本的PC计算机Windows模拟器(可以安装计算机软件)...
  9. 基于javaweb+mysql的在线购物商城shop系统(仅前台购物)
  10. mysql从库并行,MySQL 并行复制从库发生自动重启分析