GTY's gay friends

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

【Problem Description】
GTY has n gay friends. To manage them conveniently, every morning he ordered all his gay friends to stand in a line. Every gay friend has a characteristic value ai , to express how manly or how girlish he is. You, as GTY's assistant, have to answer GTY's queries. In each of GTY's queries, GTY will give you a range [l,r] . Because of GTY's strange hobbies, he wants there is a permutation [1..r−l+1] in [l,r]. You need to let him know if there is such a permutation or not.
 
【Input】
Multi test cases (about 3) . The first line contains two integers n and m ( 1≤n,m≤1000000 ), indicating the number of GTY's gay friends and the number of GTY's queries. the second line contains n numbers seperated by spaces. The ith number ai ( 1≤ai≤n ) indicates GTY's ith gay friend's characteristic value. The next m lines describe GTY's queries. In each line there are two numbers l and r seperated by spaces ( 1≤l≤r≤n ), indicating the query range.
 
【Output】
For each query, if there is a permutation [1..r−l+1]
in [l,r]
, print 'YES', else print 'NO'.
 
【Sample Input】

【Sample Output】

YES
NO
YES
YES
YES
YES
NO

【题意】

给出一个数列,询问连续的从l开始到r为止的数是否刚好能够组成从1开始到r-l+1的数列。

 
【分析】
每一次询问都是一个区间询问。
对于每一个区间询问,需要判断区间内的数是否刚好可以组成1到k的连续数列,主要的判断标准有两个:
1.区间数字的总和与(1+k)*k/2相等;
2.保证区间内所有数都只出现一次。
 
第一个可以在读入数据时用前缀和解决。
第二个就要用到线段树了,读入时预处理记录下与当前数相同的数最近一次出现的位置。询问l~r的区间时,检索每个数的最近出现位置位置,若得到的所有结果都在区间左端的左边,那就说明区间中所有的数都是不重复出现的,则满足条件。这里就是用线段树判断区间最大值小于区间左端的过程了。
 
 /* ***********************************************
MYID : Chen Fan
LANG : G++
PROG : HDU5172
************************************************ */ #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; const int N=1e6+; int last[N],a,sum[N]; typedef struct treetyp
{
int a,b,l,r,data;
} treetype;
treetype tree[*N];
int treetail; void maketree(int l,int r)
{
treetail++;
int now=treetail;
tree[now].a=l;
tree[now].b=r;
if (l<r)
{
tree[now].l=treetail+;
maketree(l,(l+r)/);
tree[now].r=treetail+;
maketree((l+r)/+,r);
}
} void add(int n,int i,int data)
{
if (tree[n].data<data) tree[n].data=data;
if (i==tree[n].a&&i==tree[n].b) return ;
else if (i<=(tree[n].a+tree[n].b)/) add(tree[n].l,i,data);
else add(tree[n].r,i,data);
} int res; void search(int n,int a,int b)
{
if (tree[n].a>=a&&tree[n].b<=b)
{
if (res<tree[n].data) res=tree[n].data;
return ;
}
if (tree[n].a==tree[n].b) return ;
if (a<=(tree[n].a+tree[n].b)/) search(tree[n].l,a,b);
if (b>=(tree[n].a+tree[n].b)/+) search(tree[n].r,a,b);
} int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==)
{
memset(sum,,sizeof(sum));
memset(last,,sizeof(last)); treetail=;
maketree(,n);
for (int i=;i<=n;i++)
{
scanf("%d",&a);
sum[i]=sum[i-]+a;
add(,i,last[a]);
last[a]=i;
} for (int i=;i<=m;i++)
{
int l,r;
scanf("%d%d",&l,&r);
if ((r-l+)*(r-l+)/==sum[r]-sum[l-])
{
res=;
search(,l,r);
if (res<l) printf("YES\n");
else printf("NO\n");
} else printf("NO\n");
}
} return ;
}

HDU 5172 GTY's gay friends 线段树的更多相关文章

  1. HDU 5172 GTY's gay friends 线段树+前缀和+全排列

    题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5172 bc(中文):http://bestcoder.hdu.edu.cn/contest ...

  2. 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 ...

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

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

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

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

  5. hdu 5172 GTY's gay friends

    GTY's gay friends 题意:给n个数和m次查询:(1<n,m<1000,000);之后输入n个数值(1 <= ai <= n):问下面m次查询[L,R]中是否存在 ...

  6. GTY's gay friends 线段树判断区间是否有相同数字

    http://acm.hdu.edu.cn/showproblem.php?pid=5172 判断一个区间是否为全排列是: 1.区间总和 = (1 + R - L + 1) * (R - L + 1) ...

  7. HDU 3074.Multiply game-区间乘法-线段树(单点更新、区间查询),上推标记取模

    Multiply game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  8. hdu 5274 Dylans loves tree(LCA + 线段树)

    Dylans loves tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  9. HDU 1394 Minimum Inversion Number(线段树求最小逆序数对)

    HDU 1394 Minimum Inversion Number(线段树求最小逆序数对) ACM 题目地址:HDU 1394 Minimum Inversion Number 题意:  给一个序列由 ...

随机推荐

  1. A框架第一步,传递不同参数.主程序执行对应方法

    访问: www.test.com/admin 1============后台目录:admin (确保单一入口) --有入口文件index.php <?phprequire '../A/a.php ...

  2. WisKey的眼神

    WisKey的眼神 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Sub ...

  3. 在Mac下显示所有文件

    显示所有隐藏文件: 第一个命令:defaults write com.apple.finder AppleShowAllFiles TRUE 回车后,迫使系统将用户资源库里Preferences文件夹 ...

  4. velocity 语法

    1,如果调用是第一条就加上类名current. #foreach($info in $aboutlist) <li><a href="$!{info.href}" ...

  5. A*搜寻算法(A星算法)

    A*搜寻算法[编辑] 维基百科,自由的百科全书 本条目需要补充更多来源.(2015年6月30日) 请协助添加多方面可靠来源以改善这篇条目,无法查证的内容可能会被提出异议而移除. A*搜索算法,俗称A星 ...

  6. zend笔记

    ZEND_STRL(str)  等价于 (str), (sizeof(str)-1) ZEND_STRS(str)等价于 (str), (sizeof(str))

  7. IntelliJ IDEA 2016.1.3激活【亲测可用】

    测试日期:2016.6.24 License server: http://www.iteblog.com/idea/key.php // ========================= 更多技术 ...

  8. docker的一些常用命令整理

    docker清除命令: 杀掉所有容器:docker kill $(docker ps -q) ; 清除所有容器:docker rm $(docker ps -a -q) ; 清除所有镜像:docker ...

  9. Sockets

    Sockets time limit per test 2 seconds memory limit per test 256 megabytes input standard input outpu ...

  10. Beam me out!

    Beam me out! 题目描述 King Remark, first of his name, is a benign ruler and every wrongdoer gets a second ...