题意:

给你一个长度为n的数组v[],有m次询问,问你在区间[L,R]中是否包含区间[1,R-L+1]的全部数字,如果是输出YES,否则输出NO

题解:

区间[1,R-L+1]与区间[L,R]的长度一样,所以如果输出YES,那么区间[L,R]中的数字就是1到R-L+1数字的全排列形式。那么就判断这个满足下面两点就行

1、区间和等于(R-L+2)*(R-L+1)/2;

2.该段区间内没有重复数字。

对于第一点我们只需要用前缀和就可以。

对于第二点,我们可以用lpos[i]表示输入的v[i]这个数字上一次(就是在区间[1,i-1])出现的最大位置,如果之前没有出现过就初始为0.这样的话对于区间内是否有重复数字,我们只需要查找一下下标为[L,R]的这些位置的值lpos[i]的最大值是否大于L,大于的话那么也就意味着这个区间内出现重复值了,就输出NO

代码:

  1. 1 #include <iostream>
  2. 2 #include <queue>
  3. 3 #include <stack>
  4. 4 #include <cstdio>
  5. 5 #include <vector>
  6. 6 #include <map>
  7. 7 #include <set>
  8. 8 #include <bitset>
  9. 9 #include <algorithm>
  10. 10 #include <cmath>
  11. 11 #include <cstring>
  12. 12 #include <cstdlib>
  13. 13 #include <string>
  14. 14 #include <sstream>
  15. 15 #include <time.h>
  16. 16 #define x first
  17. 17 #define y second
  18. 18 #define pb push_back
  19. 19 #define mp make_pair
  20. 20 #define lson l,m,rt*2
  21. 21 #define rson m+1,r,rt*2+1
  22. 22 #define mt(A,B) memset(A,B,sizeof(A))
  23. 23 #define lowbit(x) (x&(-x))
  24. 24 using namespace std;
  25. 25 typedef long long LL;
  26. 26 typedef unsigned long long ull;
  27. 27 const double PI = acos(-1);
  28. 28 const int N=1e6+10;
  29. 29 //const int M=1e6+10;
  30. 30 const LL mod=1e9;
  31. 31 const int inf = 0x3f3f3f3f;
  32. 32 const LL INF=0x3f3f3f3f3f3f3f3fLL;
  33. 33 const double esp=1e-10;
  34. 34 int a[N],vis[N],lpos[N],Ma[N<<2];
  35. 35 LL sum[N];
  36. 36 void pushUp(int rt)
  37. 37 {
  38. 38 Ma[rt]=max(Ma[rt*2],Ma[rt*2+1]);
  39. 39 }
  40. 40 void update(int pos,int val,int l,int r,int rt)
  41. 41 {
  42. 42 if(l==r)
  43. 43 {
  44. 44 Ma[rt]=val;return;
  45. 45 }
  46. 46 int m=(l+r)/2;
  47. 47 if(pos<=m)update(pos,val,lson);
  48. 48 else update(pos,val,rson);
  49. 49 pushUp(rt);
  50. 50 }
  51. 51 int query(int L,int R,int l,int r,int rt)
  52. 52 {
  53. 53 int ans=-inf;
  54. 54 if(L<=l&&r<=R)return Ma[rt];
  55. 55 int m=l+(r-l)/2;
  56. 56 if(L<=m)ans=max(ans,query(L,R,lson));
  57. 57 if(R>m)ans=max(ans,query(L,R,rson));
  58. 58 return ans;
  59. 59 }
  60. 60 int main()
  61. 61 {
  62. 62 #ifdef Local
  63. 63 freopen("data.h","r",stdin);
  64. 64 #endif
  65. 65 //ios::sync_with_stdio(false);
  66. 66 //cin.tie(0);
  67. 67
  68. 68 #ifdef Local
  69. 69 cerr << "time: " << (LL) clock() * 1000 / CLOCKS_PER_SEC << " ms" << endl;
  70. 70 #endif
  71. 71 }

代码:

  1. 1 #include<stdio.h>
  2. 2 #include<string.h>
  3. 3 #include<iostream>
  4. 4 #include<algorithm>
  5. 5 #include<math.h>
  6. 6 #include<vector>
  7. 7 #include<queue>
  8. 8 #include<stack>
  9. 9 #include<map>
  10. 10 using namespace std;
  11. 11 typedef long long ll;
  12. 12 const int maxn=1e6+10;
  13. 13 const int INF=0x3f3f3f3f;
  14. 14 const double eps=1e-10;
  15. 15 #define mt(A,B) memset(A,B,sizeof(A))
  16. 16 #define lson l,m,rt*2
  17. 17 #define rson m+1,r,rt*2+1
  18. 18 ll v[maxn],vis[maxn],lpos[maxn],tree[maxn<<2],sum[maxn];
  19. 19 void pushup(ll rt)
  20. 20 {
  21. 21 tree[rt]=max(tree[rt<<1],tree[rt<<1+1]);
  22. 22 }
  23. 23 void update(ll pos,ll val,ll l,ll r,ll rt)
  24. 24 {
  25. 25 if(l==r)
  26. 26 {
  27. 27 tree[rt]=val;
  28. 28 return ;
  29. 29 }
  30. 30 ll m=(l+r)>>1;
  31. 31 if(pos<=m) update(pos,val,lson);
  32. 32 else update(pos,val,rson);
  33. 33 pushup(rt);
  34. 34 }
  35. 35 ll query(ll L,ll R,ll l,ll r,ll rt)
  36. 36 {
  37. 37 ll ans=0;
  38. 38 if(L<=l && R>=r)
  39. 39 return tree[rt];
  40. 40 ll m=(l+r)>>1;
  41. 41 if(L<=m) ans=max(ans,query(L,R,lson));
  42. 42 if(R>m) ans=max(ans,query(L,R,rson));
  43. 43 return ans;
  44. 44 }
  45. 45 int main()
  46. 46 {
  47. 47 ll n,m;
  48. 48 while(~scanf("%lld%lld",&n,&m))
  49. 49 {
  50. 50 mt(vis,0);
  51. 51 for(ll i=1; i<=n; i++)
  52. 52 scanf("%lld",&v[i]);
  53. 53 sum[0]=0;
  54. 54 for(ll i=1; i<=n; i++)
  55. 55 {
  56. 56 if(!vis[v[i]])
  57. 57 {
  58. 58 vis[v[i]]=i;
  59. 59 lpos[i]=0;
  60. 60 }
  61. 61 else
  62. 62 {
  63. 63 lpos[i]=vis[v[i]];
  64. 64 vis[v[i]]=i;
  65. 65 }
  66. 66 sum[i]=sum[i-1]+v[i]*1LL;
  67. 67 }
  68. 68 for(ll i=1; i<=n; i++)update(i,lpos[i],1,n,1);
  69. 69 for(ll i=0; i<m; i++)
  70. 70 {
  71. 71 ll l,r;
  72. 72 scanf("%lld%lld",&l,&r);
  73. 73 if(sum[r]-sum[l-1]==1LL*(r-l+2)*(r-l+1)/2)
  74. 74 {
  75. 75 if(query(l,r,1,n,1)<l)printf("YES\n");
  76. 76 else printf("NO\n");
  77. 77 }
  78. 78 else printf("NO\n");
  79. 79 }
  80. 80 }
  81. 81 return 0;
  82. 82 }

[HDU-5172] 单点查询线段树的更多相关文章

  1. hdu 2795 Billboard 【线段树】

    给出一个高为h,宽为w的广告板,有n张广告需要贴,从第一行开始贴,尽量靠左,输出每个广告最后贴在哪一行的 先一直想不通这样建树是为什么 后来看到一篇题解里面的一句话“直到找到一个满足条件的叶子节点” ...

  2. hdu 5700区间交(线段树)

    区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  3. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  4. hdu 1540 Tunnel Warfare 线段树 单点更新,查询区间长度,区间合并

    Tunnel Warfare Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...

  5. HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Sub ...

  6. HDU 5861 Road(线段树 区间修改 单点查询)

    Road Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  7. HDU 2795 Billboard 【线段树维护区间最大值&&查询变形】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=2795 Billboard Time Limit: 20000/8000 MS (Java/Others) ...

  8. hdu 1541 Stars(线段树单点更新,区间查询)

    题意:求坐标0到x间的点的个数 思路:线段树,主要是转化,根据题意的输入顺序,保证了等级的升序,可以直接求出和即当前等级的点的个数,然后在把这个点加入即可. 注意:线段树下标从1开始,所以把所有的x加 ...

  9. HDU 1394 逆序数 线段树单点跟新 | 暴力

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

随机推荐

  1. python学习笔记 | strftime()格式化输出时间

    time模块 import time t = time.strftime("%Y-%m-%d %H:%M:%S") print(t) datetime模块 import datet ...

  2. zabbix 监控tomcat

    zabbix 监控tomcat server端rpm -ivh jdk-8u20-linux-x64.rpmvi /etc/profileJAVA_HOME=/usr/java/jdk1.8.0_20 ...

  3. 【Linux】centos 7中,开机不执行rc.lcoal中的命令

    最近将一些需要开机启动的命令添加到了rc.local中 本想着开机就启动了,很省事 但是一次意外的重启,发现rc.local中的全部命令都没有执行 发现问题后,及时查找 参考:https://blog ...

  4. linux命名小技巧(持续更新)

    一   向某个文件批量加入内容 1.1 向/etc/wxm文件添加一大段内容可以使用这个命令 [root@registry easyrsa3]# cat <<EOF >varsset ...

  5. 集成多种协议、用于 USB-A 和 TYPE-C 双端口输出的快充协议芯片IP2726

    1. 特性  支持 1A1C  支持 USB-A 和 TYPE-C 双端口输出  单口输出支持全部快充协议  双口同时插入时降压到 5V  快充规格  集成 QC2.0/QC3.0/QC4/QC4+输 ...

  6. SEO大杀器rendertron安装

    前段时间做SEO的优化,使用的是GoogleChrome/rendertron,发现这个安装部署的时候还是会有一些要注意的地方,做个记录 为什么要使用rendertron 目前很多网站都是使用 vue ...

  7. Python爬虫:数据分析小能手:JSON库的用法

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写. 给大家推荐一个Python交流的q裙,大家在学习遇到了什么问题都可以进群一起交流,大家 ...

  8. uni-app开发经验分享十九: uni-app对接微信小程序直播

    uni-app对接微信小程序直播 1.登录微信小程序后台-点击>设置->第三方设置->添加直播插件 2.添加直播组件后->点击<详情>      记录这两个参数直播 ...

  9. CISCO 如何重置3850交换机密码

    SUMMARY STEPS: Connect a terminal or PC to the switch. Set the line speed on the emulation software ...

  10. C#高级编程第11版 - 第九章 索引

    [1]9.1 System.String 类 String类中关键的方法.如替换,比较等. [2]9.1.1 构建字符串 1.String类依然有一个缺点:因为它是不可变的数据类型,这意味当你初始化一 ...