数列找不同

题目描述

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

输入格式

第1 行,2 个整数N,QN,Q

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

Q 行,每行2 个整数L_i,R_iLi?,Ri?

输出格式

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

输入输出样例

输入 #1复制

4 2
1 2 3 2
1 3
2 4

输出 #1复制

Yes
No

说明/提示

• 对于50% 的数据,N,Q \le 10^3N,Q≤103

• 对于100% 的数据,1 \le N,Q \le 10^5, 1 \le A_i \le N, 1 \le L_i \le R_i \le N1≤N,Q≤105,1≤Ai?≤N,1≤Li?≤Ri?≤N

我们想,因为每次查询是离线的,所以我们先给每次的查询排一个序。

排序的方法是

分块。

我们把所有的元素分成多个块(即分块)。分了块跑的会更快。再按照右端点从小到大,左端点块编号相同按右端点从小到大。

#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;

const int maxn=100010;

inline int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){
        if(ch==‘-‘){
            w=-1;
        }
        ch=getchar();
    }
    while(ch>=‘0‘&&ch<=‘9‘){
        s=s*10+ch-‘0‘;
        ch=getchar();
    }
    return s*w;
}

int n,m,hhh,ans=0,kkksc03,kkksc04,cnt[maxn],a[maxn],i;

bool anb[maxn];

struct node{
    int l,r,p;
}q[maxn];

bool cmp(const node x,const node y){
    return (x.l/hhh)==(y.l/hhh)?x.r<y.r:x.l<y.l;
}

void add(int position){
    if((++cnt[a[position]])==1){
        ++ans;
    }
}

void remove(int position){
    if((--cnt[a[position]])==0){
        --ans;
    }
}

int main(){
    n=read();
    m=read();
    hhh=sqrt(n);
    for(i=1;i<=n;i++){
        a[i]=read();
    }
    for(i=1;i<=m;i++){
        q[i].l=read();
        q[i].r=read();
        q[i].p=i;
    }
    sort(q+1,q+1+m,cmp);
    for(i=1;i<=m;i++){
        int L=q[i].l,R=q[i].r;
        while(kkksc03<L){
            remove(kkksc03++);
        }
        while(kkksc03>L){
            add(--kkksc03);
        }
        while(kkksc04<R){
            add(++kkksc04);
        }
        while(kkksc04>R){
            remove(kkksc04--);
        }
        if(ans==(R-L+1)){
            anb[q[i].p]=1;
        }
    }
    for(i=1;i<=m;i++){
        if(anb[i]==1){
            printf("Yes\n");
        }
        else{
            printf("No\n");
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/hrj1/p/11235037.html

时间: 2024-08-08 00:49:14

数列找不同的相关文章

特征根法求通项+广义Fibonacci数列找循环节 - HDU 5451 Best Solver

Best Solver Problem's Link Mean: 给出x和M,求:(5+2√6)^(1+2x)的值.x<2^32,M<=46337. analyse: 这题需要用到高中的数学知识点:特征根法求递推数列通项公式. 方法是这样的: 对于这题的解法: 记λ1=5+2√6,λ2=5-2√6,则λ1λ2=1,λ1+λ2=10 根据韦达定理可以推导出:λ1,λ2的特征方程为 x^2-10x+1=0 再使用该特征方程反向推导出递推公式为:a[n]=10*a[n-1]-a[n-2] 再由特征根

CodeForces 450B Jzzhu and Sequences 费波纳茨数列+找规律+负数MOD

题目:Click here 题意:给定数列满足求f(n)mod(1e9+7). 分析:规律题,找规律,特别注意负数取mod. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 using namespace std; 7 const int M = 1e5+5; 8 const int

[XSY 1543] Crash的数列 找规律

题意 一个序列形如 {1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, ...} , $a_i = \sum_{j}[a_j = i]$ . 给定 $n$ , 求 $a_n$ . $n \le {10} ^ {18}$ . 分析 打表找规律. 一阶: 第 $i$ 项为 $a_i$ . 二阶: $i$ 有 $a_i$ 项. 三阶: 出现次数为 $i$ 的有 $a_i$ 项. 发现利用三阶的性质可以在 $O(\sqrt[3]{n})$ 直接求解. 实现 1 #

【刷题】洛谷 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" 输入输出

广义Fibonacci数列找循环节

遇到了2019ICPC南昌赛区的网络赛的一道题,fn=3*fn-1+2*fn-2,有多次询问求fn.总结起来其实就是在模P意义下,O(1)回答广义斐波那契额数列的第n项,可以说是一道模板题了. 这道题的解法有两种:①求出通项公式之后,用二次剩余+优化快速幂(可以k进制快速幂或者把快速幂分块)解决.②求出模P意义下的递推结果的循环节,然后给矩阵分块加速递推. 看到大佬说方法一因为受到二次剩余的局限(求出的根号可能在模P意义下开不了)并不是十分通用,这里就只提到了第二张办法. 首先是怎么求广义斐波那

【LeetCode】Search in Rotated Sorted Array——旋转有序数列找目标值

[题目] Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. If found in the array return its index, otherwise return -1. You may assume no d

51NOD 1491 黄金系统 &amp;&amp; Codeforces 458 A. Golden System(斐波那契数列 + 找规律)

传送门 q = 5√+12在黄金系统下面a0a1...an等于 ∑ni=0ai?qn?i,其中ai 是 0 或者 1. 现在给出两个黄金系统下面的数字,请比较他们的大小. Input 单组测试数据. 第一行有一个字符串 a . 第二行有一个字符串 b . 他们都是非空串,可能有前导 0,并且只有 0 和 1组成,长度不超过 100000. Output 如果 a>b,输出 >: 如果 a= b,输出 =: 如果 a<b,输出 <: Input示例 00100 11 Output示例

【luogu P3901 数列找不同】 题解

对于区间查询的问题,提供一种思路: 莫队. 莫队是处理区间问题的乱搞神器,尤其是对于离线查询问题,当然也可以做在线查询,比如带修莫队. 对于有的题,莫队是乱搞骗分,而在某些地方,莫队是正解. 这道题来说,可以当做是萌新初学莫队的一个板子,而且莫队也好理 解.线段树树状数组这类也可以做,但是相比莫队而言麻烦些.(个 人见解,不喜勿喷.谢谢) 1st.关于莫队的思想: 先明白一点,莫队可以理解成: 优雅的暴力. 暴力算法几乎人人都会,所以莫队理解起来好理解. 如果让你暴力的话呢? 我们用一个cnt[

P3901 【数列找不同】

这个题我们可以使用树状数组做 啥? 树状数组? 那个不是维护前缀和的东西吗? 各位看官,让我慢慢道来. 首先我们可以想到,对于一个询问$ [l,r] \(,只有\)[1,r]$中的数可能对这个询问有影响. 这就启示我们可以按照询问的右端点进行一波升序排序. 不过这和树状数组有什么关系呢? 对于同一个数\(x\),假设他在\([1,r]\) 出现了若干次. 对于我们的询问\([l,r]\)来说,只有最靠近\(r\)的\(x\)才最有可能影响到右端点为\(r\)的询问. 所以,我们就只用记录最靠近\