【刷题】洛谷 P3901 数列找不同

题目描述

现有数列 \(A_1,A_2,\cdots,A_N\) ,Q 个询问 \((L_i,R_i)\) , \(A_{Li} ,A_{Li+1},\cdots,A_{Ri}\) 是否互不相同

输入输出格式

输入格式:

第1 行,2 个整数 \(N,Q\)

第2 行,N 个整数 \(A_{Li} ,A_{Li+1},\cdots,A_{Ri}\)?

Q 行,每行2 个整数 \(L_i,R_i\)?

输出格式:

对每个询问输出一行,“Yes” 或者“No”

输入输出样例

输入样例#1:

4 2
1 2 3 2
1 3
2 4

输出样例#1:

Yes
No

说明

? 对于50% 的数据,\(N,Q \le 10^3\)

? 对于100% 的数据, \(1 \le N,Q \le 10^5, 1 \le A_i \le N, 1 \le L_i \le R_i \le N\)

题解

当做莫队裸题做了,加数和删数的时候只要判之前或之后是不是一来更改某一段的贡献
(这题还可以 \(O(n)\) 做,而且很好写,不过为了写个模板,就没去写了)

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXN=100000+10;
int n,q,A[MAXN],unit,Be[MAXN],cnt[MAXN],sum,ans[MAXN];
struct node{
    int l,r,id;
    inline bool operator < (const node &A) const {
        return Be[l]==Be[A.l]?r<A.r:l<A.l;
    };
};
node query[MAXN];
template<typename T> inline void read(T &x)
{
    T data=0,w=1;
    char ch=0;
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')w=-1,ch=getchar();
    while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
    x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
    if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline void add(int x)
{
    if((cnt[x]++)==1)sum++;
}
inline void del(int x)
{
    if((--cnt[x])==1)sum--;
}
int main()
{
    read(n);read(q);
    unit=std::sqrt(n);
    for(register int i=1;i<=n;++i)read(A[i]),Be[i]=i/unit+1;
    for(register int i=1;i<=q;++i)
    {
        read(query[i].l),read(query[i].r);
        query[i].id=i;
    }
    std::sort(query+1,query+q+1);
    int l=1,r=0;
    for(register int i=1;i<=q;++i)
    {
        while(l<query[i].l)del(A[l++]);
        while(l>query[i].l)add(A[--l]);
        while(r<query[i].r)add(A[++r]);
        while(r>query[i].r)del(A[r--]);
        ans[query[i].id]=sum;
    }
    for(register int i=1;i<=q;++i)puts(ans[i]?"No":"Yes");
    return 0;
}

原文地址:https://www.cnblogs.com/hongyj/p/9066362.html

时间: 2024-08-07 10:51:15

【刷题】洛谷 P3901 数列找不同的相关文章

洛谷——P1062 数列

洛谷——P1062 数列 题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,… (该序列实际上就是:3^0,3^1,3^0+3^1,3^2,3^0+3^2,3^1+3^2,3^0+3^1+3^2,…) 请你求出这个序列的第N项的值(用10进制数表示). 例如,对于k=3,N=100,正确答案应该是981. 输入输出格式 输入格式: 输入文件只有1行,为2个正整数,用一个

洛谷P1182 数列分段Section II 二分答案

洛谷P1182 数列分段Section II 二分答案 题意:将 n 个 数 分为 m段 求一种方案,使这m段中最大的和 最小 额..可能有点拗口,其实就是说每一种方案,都有对应的 每段和的最大值,要求一种方案,使最大值最小 题解 :二分答案 mid为分成的最大值, 然后O(n) 判断 答案 是否可行 贪心的做下去,如果再加上就要超过了,那就新开一段 最后判断开的段数是否小于 m 1.注意要判断 如果当前这个值大于 mid,一个值就已经大于 mid了,那就直接退出了,否则 ,这个值也只会单独算为

洛谷P3398 仓鼠找sugar

题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c)到图书馆(d).他们都会走最短路径.现在小仓鼠希望知道,有没有可能在某个地方,可以碰到他的基友? 小仓鼠那么弱,还要天天被zzq大爷虐,请你快来救救他吧! 输入输出格式 输入格式: 第一行两个正整数n和q,表示这棵树节点的个数和询问的个数. 接下来n-1行,每行两个正整数u和v,表示节点u到节点v之

洛谷P1062 数列

题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,- (该序列实际上就是:3^0,3^1,3^0+3^1,3^2,3^0+3^2,3^1+3^2,3^0+3^1+3^2,-) 请你求出这个序列的第N项的值(用10进制数表示). 例如,对于k=3,N=100,正确答案应该是981. 输入输出格式 输入格式: 输入文件只有1行,为2个正整数,用一个空格隔开: k N (k.

洛谷 P1062 数列

P1062 数列 题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,… (该序列实际上就是:3^0,3^1,3^0+3^1,3^2,3^0+3^2,3^1+3^2,3^0+3^1+3^2,…) 请你求出这个序列的第N项的值(用10进制数表示). 例如,对于k=3,N=100,正确答案应该是981. 输入输出格式 输入格式: 输入文件只有1行,为2个正整数,用一个空格隔开

洛谷P1062 数列 [2017年6月计划 数论03]

P1062 数列 题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,… (该序列实际上就是:3^0,3^1,3^0+3^1,3^2,3^0+3^2,3^1+3^2,3^0+3^1+3^2,…) 请你求出这个序列的第N项的值(用10进制数表示). 例如,对于k=3,N=100,正确答案应该是981. 输入输出格式 输入格式: 输入文件只有1行,为2个正整数,用一个空格隔开

洛谷P1182数列分段

题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 2][4 5][1] 第一段和为6,第2段和为9,第3段和为1,和最大值为9. 将其如下分段: [4][2 4][5 1] 第一段和为4,第2段和为6,第3段和为6,和最大值为6. 并且无论如何分段,最大值不会小于6. 所以可以得到要将数列4 2 4 5 1要分成3段,每段和的最大值最小为6. 输

【洛谷P1509】 找啊找啊找GF

题目背景 "找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手,你是我的好GF.再见." "诶,别再见啊..." 七夕...七夕...七夕这个日子,对于sqybi这种单身的菜鸟来说是多么的痛苦...虽然他听着这首叫做"找啊找啊找GF"的歌,他还是很痛苦.为了避免这种痛苦,sqybi决定要给自己找点事情干.他去找到了七夕模拟赛的负责人zmc MM,让她给自己一个出题的任务.经过几天的死缠烂打,zmc MM终于同意了. 但是,拿到这个任务的sqybi发现

洛谷P1327数列排序

题目描述 给定一个数列{an},这个数列满足ai≠aj(i≠j),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? 输入输出格式 输入格式: 第一行,正整数n (n<=100,000). 以下若干行,一共n个数,用空格分隔开,表示数列{an},任意-231<ai<231. 输出格式: 只有一行,包含一个数,表示最少的交换次数. 输入输出样例 输入样例#1: 8 8 23 4 16 77 -5 53 100 输出样例#1: 5 ------------