GTY's gay friends

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1379    Accepted Submission(s): 355

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

题意:

n个数m个询问,询问(l,r)中的数是否为1 ~ r-l+1的一个排列。

分析:

若(l,r)中的数为1 ~ r-l+1中的一个排列,则必须满足:

1、(l,r)中的数之和为len*(len+1)/2,其中len = r-l+1。

2、区间内的数字各不相同,即用线段树维护位置i上的数上次出现的位置的最大值。

只要区间内所有的数上次出现的位置last[i] < l,则区间内的数各不相同。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <math.h>
using namespace std;
typedef long long LL;
const int N = ;
int pre[N],now[N];
LL sum[N];
struct Tree{
int MAX_ID;
}tree[N<<];
int MAX_ID;
void PushUp(int idx){
tree[idx].MAX_ID = max(tree[idx<<].MAX_ID,tree[idx<<|].MAX_ID);
}
void build(int l,int r,int idx){
if(l==r){
tree[idx].MAX_ID = pre[l];
return;
}
int mid = (l+r)>>;
build(l,mid,idx<<);
build(mid+,r,idx<<|);
PushUp(idx);
}
void query(int l,int r,int L,int R,int idx){
if(l >= L&& r <= R){
MAX_ID = max(MAX_ID,tree[idx].MAX_ID);
return;
}
int mid = (l+r)>>;
if(mid>=L) query(l,mid,L,R,idx<<);
if(mid<R) query(mid+,r,L,R,idx<<|);
}
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF){
memset(now,,sizeof(now));
sum[] = ;
for(int i=;i<=n;i++){
int x;
scanf("%d",&x);
sum[i] = sum[i-]+x;
pre[i] = now[x];
now[x] = i;
}
build(,n,);
while(k--){
int l,r;
scanf("%d%d",&l,&r);
LL len = r-l+;
LL S = (len+)*(len)/;
if(sum[r]-sum[l-]!=S){
printf("NO\n");
continue;
}
MAX_ID = -;
query(,n,l,r,);
if(MAX_ID<l) printf("YES\n");
else printf("NO\n");
}
}
return ;
}

不过我们还有更简单的hash做法,对于[1..n][1..n][1..n]中的每一个数随机一个64位无符号整型作为它的hash值,一个集合的hash值为元素的异或和,预处理[1..n]的排列的hash和原序列的前缀hash异或和,就可以做到线性预处理,O(1)O(1)O(1)回答询问.

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<ctime>
#define eps (1e-8) using namespace std; typedef long long ll;
unsigned long long ra[],a[],ha[];
int n,m,t,p; //int main(int argc,char const *argv[])
int main()
{
srand(time(NULL));
a[] = ha[] = ;
for(int i=; i<=; i++)
{
ra[i] = rand()*rand();
ha[i] = ha[i-]^ra[i];
}
for(int i=; i<=; i++)
{
printf("%lld\n",ra[i]);
}
while(~scanf("%d%d",&n,&m))
{
for(int i=; i<=n; i++)
{
scanf("%d",&t);
a[i] = ra[t];
a[i]^=a[i-];
}
for(int i=; i<=m; i++)
{
scanf("%d%d",&t,&p);
puts((ha[p-t+]==(a[p]^a[t-])?"YES":"NO"));
}
}
return ;
}

hdu 5172(线段树||HASH)的更多相关文章

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

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

  2. Codeforces Round #321 (Div. 2) E. Kefa and Watch 线段树hash

    E. Kefa and Watch Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/580/prob ...

  3. hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  4. hdu 3974 线段树 将树弄到区间上

    Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. hdu 3436 线段树 一顿操作

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  6. hdu 3397 线段树双标记

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  7. hdu 4578 线段树(标记处理)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others) ...

  8. hdu 4533 线段树(问题转化+)

    威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

  9. hdu 2871 线段树(各种操作)

    Memory Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

随机推荐

  1. Linux 进程,线程,线程池

    在linux内核,线程与进程的区别很小,或者说内核并没有真正所谓单独的线程的概念,进程的创建函数是fork,而线程的创建是通过clone实现的. 而clone与fork都是调用do_fork(),差异 ...

  2. java面向对象课程设计-数学表达式计算器

    项目简介 设计一个计算器,其能够: 1)由用户输入一个简单的四则运算表达式,求出其计算结果后显示. 2)特殊数学函数,如:绝对值.取整.三角函数.倒数.平方根.平方.立方等. 3)对一定范围内的数字将 ...

  3. PE文件格式介绍

    Useful Tools: 1. WDK安装目录下搜下depends.exe,这个工具可以查看.exe文件依赖的.dll,以及用到的dll中的api. 2.PE文件格式分析器: 有很多的PE格式分析器 ...

  4. hibernate笔记(三)

    目标: 第1部分: 对象的状态: 第2部分:缓存 1) 一级缓存 2) 相关知识 ----懒加载--- 第3部分:映射 一对一映射 组件映射 继承映射 一.对象的状态 举例: User   user  ...

  5. 【bzoj4813】[Cqoi2017]小Q的棋盘 树上dfs+贪心

    题目描述 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上共有V个格点,编号为0,1,2…,V-1,它们是连通的 ...

  6. hdu 1598 find the most comfortable road (并查集)

    find the most comfortable road Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  7. [bzoj1018] [SHOI2008]堵塞的交通

    题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个22行CC列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所 ...

  8. POJ 3801/HDU 3157 Crazy Circuits | 有下界的最小流

    题目: POJ最近总是炸 所以还是用HDU吧http://acm.hdu.edu.cn/showproblem.php?pid=3157 题解: 题很长,但其实就是给个有源汇带下界网络流(+是源,-是 ...

  9. POJ3261 Milk Patterns 【后缀数组】

    牛奶模式 时间限制: 5000MS   内存限制: 65536K 提交总数: 16796   接受: 7422 案件时间限制: 2000MS 描述 农夫约翰已经注意到,他的牛奶的质量每天都在变化.经进 ...

  10. poj2814-拨钟问题-C语言-枚举算法

    #include <stdio.h> #include <stdlib.h> /* 首先,我们考虑用长度为9的数组表示表盘的状态以及调表的操作,终止的条件是表盘状态数组所有元素 ...