GTY's gay friends

题意:给n个数和m次查询;(1<n,m<1000,000);之后输入n个数值(1 <= ai <= n);问下面m次查询[L,R]中是否存在1~R-L+1的序列;

Sample Input
8 5
2 1 3 4 5 2 3 1
1 3
1 1
2 2
4 8
1 5
 
3 2
1 1 1
1 1
1 2
Sample Output
YES
NO
YES
YES
YES
 
YES
NO
 
分析:问区间是否存在1~R-L+1的排列;注意里面没有一个数相同,并且还都在[1,R-L+1]的区间内;可以等价 每个数前面出现的最大标号一定要小于L(保证了不重复);其次输入的区间和要与结果的和相等;这样就确定了是在这个区间;
利用线段树维护区间pre[](每个点前面出现的最大标号)的最大值;着重理解里面的rt与区间的关系即可;
ps:这道题有更好的算法,使用线段树基本上都 2000+,我的代码2574MS  25448K  AC状态很不满意啊!!
 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<time.h>
#include<stack>
#include<set>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1|1
typedef __int64 ll;
template<typename T>
void read1(T &m)
{
T x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
m = x*f;
}
template<typename T>
void read2(T &a,T &b){read1(a);read1(b);}
template<typename T>
void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
template<typename T>
void out(T a)
{
if(a>) out(a/);
putchar(a%+'');
}
const int MAXN = 1e6+;
int id[MAXN],mx[MAXN<<],pre[MAXN];
ll sum[MAXN];
void pushup(int rt)
{
mx[rt] = max(mx[rt<<],mx[rt<<|]);
}
void build(int l,int r,int rt)
{
if(l == r){
mx[rt] = pre[l];
return ;
}
int m = l + r >> ;
build(lson);
build(rson);
pushup(rt);
}
int query(int L,int R,int l,int r,int rt)
{
if(L <= l && r <= R){
return mx[rt];
}
int m = l + r >> ,ret = ;
if(L <= m) ret = max(ret,query(L,R,lson));
if(R > m) ret = max(ret,query(L,R,rson));
return ret;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m) == ){
int x;
fill(id,id+n+,);
rep1(i,,n){
sum[i] = ;
read1(x);
sum[i] += sum[i-] + x;
pre[i] = id[x];
id[x] = i;
}
build(,n,);
int a,b;
rep0(i,,m){
read2(a,b);
int len = b-a+;
ll sm = (len+)*len/;
if(sm != sum[b] - sum[a-]) puts("NO");
else{
int ret = query(a,b,,n,);
//out(ret);
puts(ret < a?"YES":"NO");
}
}
}
return ;
}
 
 

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. HDU 5172 GTY's gay friends 线段树+前缀和+全排列

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

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

  6. GTY's gay friends HDU - 5172 线段树

    GTY has nn gay friends. To manage them conveniently, every morning he ordered all his gay friends to ...

  7. hdu 5172(线段树||HASH)

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

  8. HDU 5171 GTY's birthday gift 矩阵快速幂

    GTY's birthday gift Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

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

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

随机推荐

  1. CSS_样式sample

    <!DOCTYPE HTML> <html> <head> <title>div浮动</title> <style type=&quo ...

  2. google guava 基本工具

    近期在项目中用到了google中的cache了解到guava里面的一些工具类和对集合的操作,封装的都比较下,没有时间自己去写,先做个标记, 参考文章如下: http://macrochen.iteye ...

  3. 高灵活低耦合Adapter快速开发攻略

    Android开发中经常需要使用Adapter. 传统方法是自定义一个Adapter并继承AndroidSDK内的BaseAdapter, 这种方式代码量大,耦合度高,灵活性差(各种监听事件需要对Vi ...

  4. AT-FragmentPagerAdapter

    关于FragmentPagerAdapter的粗略翻译 英文版api地址:FragmentPagerAdapter(自备梯子) FragmentPagerAdapter    类概述(Class Ov ...

  5. 利用dijkstra算法规划线路

    # dijkstra# 1.在数据库内预先存放了北京市内最新的道路节点,选用优化了得dijkstra算法进行线路规划.    当输入起点和终点后,会计算出最短的路径.同时还能选择查看路径经过的道路节点 ...

  6. spring整合quartz实现定时任务

    需求:spring+mybatis框架已经搭建好,需要实现一个定时任务. 一:导出相应的jar包 quartz-all-1.6.5.jar获取quartz-alll-1.6.6.jar spring- ...

  7. Flash cs6 如何从FLA 文件导出sound文件

    Flash. How to export sound from the FLA file extract sound from a fla 第一个是图文教程,在下面还有"watch vide ...

  8. 【Android自动化打包】03. APK的数字签名

    1. 什么是数字签名?   数字签名就是为你的程序打上一种标记,来作为你自己的标识,当别人看到签名的时候会知道它是与你相关的   2. 为什么要数字签名?    最简单直接的回答: 系统要求的.   ...

  9. 使用Log4Net发送日志邮件 (转载)

    前言 公司前几天重新确立了考核指标,主要是针对我们研发部,而我们的经理要求也高,对我们绩效考核扣分也挺狠的,100分的,出了几个严重bug就变 0分,反正只要被用户发现并且提出来了,就会扣分,没被用户 ...

  10. webform处理过程

    一.post/get传值注意几点 post提交的时候,只有写了name属性且没有写disable=true表单元素(input,select,textarea)才会被提交. 如果不确定是get还是po ...