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. hdu_2665_Kth number(主席树)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2665 题意:给你一个区间,让你找这个区间第K大的数 题解:主席树模版题,也可以用划分树 #includ ...

  2. Entity Framework技巧系列之十四 - Tip 56

    提示56. 使用反射提供程序编写一个OData Service 在TechEd我收到一大堆有关将数据作为OData暴露的问题. 到目前为止你大概知道可以使用数据服务与Entity Framework将 ...

  3. 设置标题小图标ico

    在head里添加 <link rel="shortcut icon" href="<%=request.getContextPath()%>/FlatU ...

  4. android之DPAD上下左右四个键控制

    我们代码的目的很简单,那就是监听上下左右中这几个键的事件触发.直接上代码: dpad.xml <?xml version="1.0" encoding="utf-8 ...

  5. MyEclipse10.6、Maven、svn集成

    这几天整理maven,根据开发部署需要,需要把原先的myeclipse下的普通javaWeb工程用maven管理,弄了2天,主要还是在jar包的引入上,总是少- -! 好了,下面记录一下我的安装过程: ...

  6. .net ToString()用法详解与格式说明

    我们经常会遇到对时间进行转换,达到不同的显示效果,默认格式为:2006-6-6 14:33:34 如果要换成成200606,06-2006,2006-6-6或更多的格式该怎么办呢? 这里将要用到:Da ...

  7. 【servlet】 过滤器模板

    EncodingFilter.java package Filter; import java.io.IOException; import javax.servlet.Filter; import ...

  8. javaScript 新学习:Array.contains 函数

    Array.contains 函数 确定指定对象是否是 Array 对象中的元素. 此函数是静态的,可在不创建对象实例的情况下调用. var itemExists = Array.contains(a ...

  9. OpenGL ES着色器语言之静态使用(static use)和预处理

    OpenGL ES着色器语言之静态使用(static use) 在OpenGL ES中有一个术语叫静态使用(static use),什么叫静态使用呢? 在写代码中,对于一个变量可能具有以下三种情况: ...

  10. [转]new一个Object对象占用多少内存?

    我们分解下ArrayList arr = new ArrayList();等同于ArrayList arr = null;//初始化arr = new ArrayList();//实例化这两个过程.初 ...