BestCoder Round #29 GTY's gay friends

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int MAX = 100000+10;
int res[MAX<<2],ans[MAX],t[MAX];
int a[MAX],last[MAX];
struct node {
    int L,R,id,d;
    bool operator <(const node rhs) const {
        return R<rhs.R;
    }
}v[MAX];
void push_up(int o) {
   res[o]=max(res[o<<1],res[o<<1|1]);
}
void build(int L,int R,int o) {
    if(L==R) {
        res[o]=a[L];
        return ;
    }
    int mid=(L+R)>>1;
    build(L,mid,o<<1);
    build(mid+1,R,o<<1|1);
    push_up(o);
}
int Query1(int L,int R,int o,int ls,int rs) {
    if(ls<=L&&rs>=R) {
        return res[o];
    }

int mid=(L+R)>>1;
    int tt=0;
    if(ls<=mid) tt=max(tt,Query1(L,mid,o<<1,ls,rs));
    if(rs>mid) tt=max(tt,Query1(mid+1,R,o<<1|1,ls,rs));
    return tt;
}
int sum[MAX];
int lowbit(int x) {
    return x&-x;
}
void modify(int pos,int val) {
    for(int i=pos;i<MAX;i+=lowbit(i)) {
        sum[i]+=val;
    }
}
int Query(int pos) {
    int res=0;
    for(int i=pos;i;i-=lowbit(i)) {
        res+=sum[i];
    }
    return res;
}
int main() {
    int n,m;
    while(scanf("%d %d",&n,&m)==2) {
        for(int i=1;i<=n;i++) {
            scanf("%d",&a[i]);
        }
        build(1,n,1);
        for(int i=1;i<=m;i++) {
            scanf("%d %d",&v[i].L,&v[i].R) ;
            v[i].id=i;
            v[i].d=(v[i].R-v[i].L+1);
        }
        sort(v+1,v+1+m);
        memset(sum,0,sizeof(sum));
        memset(last,0,sizeof(last));
        int j=1;

for(int i=1;i<=n;i++) {
            if(last[a[i]]) {
                modify(last[a[i]],-1);
            }
            modify(i,1);
            last[a[i]]=i;
            while(i==v[j].R&&j<=m) {

ans[v[j].id]=Query(v[j].R)-Query(v[j].L-1);
              //  printf("%d %d %d\n",ans[v[j].id],v[j].d,Query1(1,n,1,v[j].L,v[j].R));
                if(ans[v[j].id]==v[j].d&&Query1(1,n,1,v[j].L,v[j].R)==v[j].d) {
                    t[v[j].id]=1;
                }
                else t[v[j].id]=0;
                j++;
            }
        }
        for(int i=1;i<=m;i++) {
            if(t[i]) printf("YES\n");
            else printf("NO\n");
        }
    }
    return 0;
}

BestCoder Round #29 GTY's gay friends

时间: 2024-10-10 05:14:03

BestCoder Round #29 GTY's gay friends的相关文章

BestCoder Round #29 1003 (hdu 5172) GTY&#39;s gay friends [线段树 判不同 预处理 好题]

传送门 GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 264    Accepted Submission(s): 57 Problem Description GTY has n gay friends. To manage them conveniently, every morning he o

hdu 5171 GTY&#39;s birthday gift (BestCoder Round #29)

GTY's birthday gift                                                                       Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 209    Accepted Submission(s): 71 Problem Description F

BestCoder Round #29 1001 GTY&#39;s math problem

GTY's math problem Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 0    Accepted Submission(s): 0 Problem Description GTY is a GodBull who will get an Au in NOI . To have more time to learn alg

BestCoder Round #29——A--GTY&#39;s math problem(快速幂(对数法))、B--GTY&#39;s birthday gift(矩阵快速幂)

GTY's math problem Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 0    Accepted Submission(s): 0 Problem Description GTY is a GodBull who will get an Au in NOI . To have more time to learn alg

【BestCoder】#29 C GTY&#39;s gay friends(区间和 随机数判重)

题目大意:可以到相应的场次查看中文翻译. 思路:其实这道题很简单,对于一个等差数列,我们要判断他是否每个数都出现,只需要判断区间和或者是最大值是否符合即可,但这边需要注意的便是中间的重复部分.最大值的判重必要性我就不知道了,而且我也不会做,目测做也超时. 这边就写一下偷别人的区间和+随机数判重的做法 其实这边判重的方法是给一个数加上一个超过1000007的权,然后在计算和的时候,便是唯一的. 否则例如下面的情况 10 11的和可以由5和16构成,既然两个的和可以被另外一个的两个数替代,那我们就找

HDU 5172 GTY&#39;s gay friends (线段树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5172 题意: 给你一个n个数的数组,m次询问,询问在[L, R] 这个区间里面有没有 [1, R-L+1] 的数. 题解: 判断有没有 1 ~ R-L+1 其实就是判断这一段区间和是不是等于 (R-L+1)*(R-L+1+1)/ 2 . 当然还有就是每一个数只能出现1次. 这个问题我们应该怎么解决呢. 我们可以记录第i个数x 的前一个x出现的位置.如果x的前一个x也出现在[L, R]里面,那么这一段

BestCoder Round #4 前两题 hdu 4931 4932

第一题太水了.. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int a[6]; 7 int main(){ 8 int cas; 9 scanf( "%d", &cas ); 10 while( cas-- ){ 11 for( int i = 0; i <

BestCoder Round #88

传送门:BestCoder Round #88 分析: A题统计字符串中连续字串全为q的个数,预处理以下或加个cnt就好了: 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <ctime> 5 #include <cmath> 6 #include <iostream> 7 #include <algorithm> 8

BestCoder Round#15 1001-Love

http://acm.hdu.edu.cn/showproblem.php?pid=5082 Love Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 64    Accepted Submission(s): 51 Problem Description There is a Love country with many couples