题意:

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

代码:

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

    将用户在注册界面中的数据填充到数据库相对应的表格中.当用户再次登录时,从数据库中拿到相应的数据查询并与页面的数据做对比,判断是否登陆成功. 需要在HTML文件中将form表单上的action属性值设置 ...

  2. Java并发包源码学习系列:挂起与唤醒线程LockSupport工具类

    目录 LockSupport概述 park与unpark相关方法 中断演示 blocker的作用 测试无blocker 测试带blocker JDK提供的demo 总结 参考阅读 系列传送门: Jav ...

  3. LeetCode872. 叶子相似的树

    题目 1 class Solution { 2 public: 3 vector<int>ans1; 4 vector<int>ans2; 5 bool leafSimilar ...

  4. 入门OJ:郭嘉的消息传递

    题目描述 我们的郭嘉大大在曹操这过得逍遥自在,但是有一天曹操给了他一个任务,在建邺城内有N(<=1000)个袁绍的奸细 将他们从1到N进行编号,同时他们之间存在一种传递关系,即若C[i,j]=1 ...

  5. 2V升3V芯片,输入2V输出3V可达1A

    PW5328B是一个恒定频率, 6引脚 SOT23电流模式升压转换器,用于小型低功耗应用. PW5328B的开关频率为 1.2MHz,允许使用微小的.低成本的电容器和电感器.内部软启动导致小涌流和延长 ...

  6. 【Android】编译报错 Annotation processors must be explicitly declared now 解决方案

    问题 在网上下载一个demo,因为版本久远,里面添加了本地 Butter Knife 的jar包,在编译时报错 Annotation processors must be explicitly dec ...

  7. 理解js闭包9大使用场景

    1.返回值(最常用) //1.返回值 最常用的 function fn(){ var name="hello"; return function(){ return name; } ...

  8. (15)-Python3之--configparser模块

    1.模块简介 configparser模块是python用来读取配置文件的模块,置文件的格式跟windows下的ini或conf配置文件相似,可以包含一个或多个节(section), 每个节可以有多个 ...

  9. 自定义Decoder继承ByteToMessageDecoder实现解码的小案例

    ByteToMessageDecoder是一种ChannelInboundHandler,可以称为解码器,负责将byte字节流(ByteBuf)转换成一种Message,Message是应用可以自己定 ...

  10. RabbitMq消费者在初始配置之后进行数据消费

    RabbitMq消费者在初始配置之后进行数据消费 问题背景 在写一个消费rabbitmq消息的程序是,发现了一个问题,消费者的业务逻辑里面依赖这一些配置信息,但是当项目启动时,如果队列里面有积压数据的 ...