luogu 3901 Difference

Difference

题目描述

现有数列A_1,A_2,\cdots,A_NA?1??,A?2??,?,A?N??,Q 个询问(L_i,R_i)(L?i??,R?i??),A_{Li} ,A_{Li+1},\cdots,A_{Ri}A?Li??,A?Li+1??,?,A?Ri?? 是否互不相同

输入输出格式

输入格式:

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

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

Q 行,每行2 个整数L_i,R_iL?i??,R?i??

输出格式:

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

输入输出样例

输入样例#1:

4 2
1 2 3 2
1 3
2 4

输出样例#1:

Yes
No

说明

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

? 对于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≤10?5??,1≤A?i??≤N,1≤L?i??≤R?i??≤N

题解:

裸的莫队,真的很简单。
按询问排序,按左端点位置分成sqrt(n)份,每份按右端点从小到大排序即可。
然后尺取法就可以了:
代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,a[100001],vis[100001],tot,lim,ans[100001];
struct ask
{
    int l,r,id;
}b[100001];
bool cmp(const ask a,const ask b)
{
    if(a.l/lim!=b.l/lim)return a.l/lim<b.l/lim;else return a.r<b.r;
}
int main()
{
    int i,j;
    scanf("%d%d",&n,&m);
    lim=sqrt(n);
    for(i=1;i<=n;i++)
    scanf("%d",&a[i]);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&b[i].l,&b[i].r);
        b[i].id=i;
    }
    sort(b+1,b+m+1,cmp);
    int left=1,right=0;
    for(i=1;i<=m;i++)
    {
        while(left<b[i].l){if(--vis[a[left]]==0)tot--;left++;}
        while(left>b[i].l){left--;if(++vis[a[left]]==1)tot++;}
        while(right<b[i].r){right++;if(++vis[a[right]]==1)tot++;}
        while(right>b[i].r){if(--vis[a[right]]==0)tot--;right--;}
        ans[b[i].id]=tot==b[i].r-b[i].l+1;
    }
    for(i=1;i<=m;i++)
    {
        if(ans[i])printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}
时间: 2024-10-29 10:47:35

luogu 3901 Difference的相关文章

luogu P3799 妖梦拼木棒

二次联通门 : luogu P3799 妖梦拼木棒 /* luogu P3799 妖梦拼木棒 用一个桶存下所有的木棒 美剧两根短的木棒长度 后随便乘一乘就 好了.. */ #include <algorithm> #include <cstdio> #define Mod 1000000007 #define Max 5000 void read (int &now) { now = 0; register char word = getchar (); while (wo

[luogu P1967][NOIp2013]P1967 货车运输

题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物. 输入输出格式 输入格式: 输入文件名为 truck.in. 输入文件第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条道 路. 接下来 m 行每行 3 个整数 x. y. z,每两个整数之间用一个空格隔开,表示从 x 号城市到 y 号城市有一条限重为 z

python: the difference between append and extend

Data Analysis: indoor localization using received signal strength (RSS) An error about list operation in python: append and extend elements We define a list A to storage objects, which the length is unknown, and list B and C to storage the final resu

luogu 3126 回文的路径

https://www.luogu.org/problem/show?pid=3126 考虑dp,从两头走到中间. f[i][j][k][l]表示从左上角走到(i,j),从右下角走到(k,l),路径长度相等,所经过路径相同的方案数. 方程不再赘述. 考虑步数要相同,所以只要枚举步数和行就好. f[i][j][k]表示第一个点在第j行,第2个点在第k行,走i步的方案数. 所以得出方程f[i][j][k]=(f[i-1][j-1][k]+f[i-1][j][k+1]+f[i-1][j-1][k+1]

luogu P2018 消息传递

二次联通门 : luogu P2018 消息传递 /* luogu P2018 消息传递 树形dp 原来用优先队列做了一下, T了俩点 MMP 去看正解.. 复杂度一样好不好.. 每次到达一个点,记录其子树中所有的dp值 优先向大的一边转移 */ #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #define INF 1e8 const int BUF

luogu P1966 火柴排队

二次联通门 : luogu P1966 火柴排队 /* luogu P1966 火柴排队 神TM逆序对... noip怎么这么坑啊.. 暴力都没得打 此题模拟考试时爆了0 做法 将A数组排序,由于B数组与A数组是一一对应的 那么B数组的位置也会发生相应的变化 此时B数组逆序数对数即为答案 */ #include <cstdio> #include <iostream> #include <algorithm> const int BUF = 123123123; cha

luogu P1941 飞扬的小鸟

二次联通门 : luogu P1941 飞扬的小鸟 /* luogu P1941 飞扬的小鸟 dp 向上飞是完全背包,向下掉就是01背包 分情况讨论一下 最后合并一下 */ #include <cstdio> #include <iostream> #include <cstring> const int BUF = 123123123; char Buf[BUF], *buf = Buf; inline void read (int &now) { for (

luogu P2863 [USACO06JAN]牛的舞会The Cow Prom

https://www.luogu.org/problem/show?pid=2863#sub 题目描述 The N (2 <= N <= 10,000) cows are so excited: it's prom night! They are dressed in their finest gowns, complete with corsages and new shoes. They know that tonight they will each try to perform th

数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline __attri\ bute__( ( optimize( "-O2" ) ) ) Inline void read (int &now) { now = 0; register char word = getchar (); bool temp = false; while (wor