【Luogu】P3709大爷的字符串题(莫队算法)

  题目链接

  语文题啊……

  看题解发现是让求区间中最多的数的个数,于是果断理解了一会题解……莫队套上完事。

  sum[i]表示i这个数出现的次数,cnt[i]表示出现i次的数有几个,然后乱搞搞……就好了

  

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<cmath>
#define maxn 300000
using namespace std;

inline long long read(){
    long long num=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)){
        if(ch==‘-‘)    f=-1;
        ch=getchar();
    }
    while(isdigit(ch)){
        num=num*10+ch-‘0‘;
        ch=getchar();
    }
    return num*f;
}

int s[maxn];
int q[maxn];
int d[maxn];
int ans[maxn];
struct Que{
    int x,y,id;
    bool operator <(const Que a)const{
        if(s[x]!=s[a.x])    return s[x]<s[a.x];
        return y<a.y;
    }
}que[maxn];

int sum[maxn],cnt[maxn];

int main(){
    int n=read(),m=read();
    int sqt=sqrt(n);
    for(int i=1;i<=n;++i){
        q[i]=d[i]=read();
        s[i]=(i-1)/sqt+1;
    }
    sort(q+1,q+n+1);
    int size=unique(q+1,q+n+1)-q-1;
    for(int i=1;i<=n;++i)    d[i]=lower_bound(q+1,q+size+1,d[i])-q;
    for(int i=1;i<=m;++i)    que[i]=(Que){read(),read(),i};
    sort(que+1,que+m+1);
    int l=0,r=0,now=1;cnt[0]=1;
    for(int i=1;i<=m;++i){
        int x=que[i].x,y=que[i].y;
        while(r<y){
            r++;
            int &o=sum[d[r]];
            if(now==o)    now++;
            cnt[o]--;    o++;    cnt[o]++;
        }
        while(r>y){
            int &o=sum[d[r]];
            cnt[o]--;    if(now==o&&cnt[o]==0)    now--;
            o--;    cnt[o]++;
            r--;
        }
        while(l<x){
            int &o=sum[d[l]];
            cnt[o]--;    if(now==o&&cnt[o]==0)    now--;
            o--;    cnt[o]++;
            l++;
        }
        while(l>x){
            l--;
            int &o=sum[d[l]];
            cnt[o]--;    if(now==o)    now++;
            o++;    cnt[o]++;
        }

        ans[que[i].id]=now;
    }
    for(int i=1;i<=n;++i)    printf("%d\n",-ans[i]);
    return 0;
}

原文地址:https://www.cnblogs.com/cellular-automaton/p/8318846.html

时间: 2024-10-27 17:23:47

【Luogu】P3709大爷的字符串题(莫队算法)的相关文章

luogu P3709 大爷的字符串题

二次联通门 : luogu P3709 大爷的字符串题 /* luogu P3709 大爷的字符串题 莫队 看了半天题目 + 题解 才弄懂了要求什么... 维护两个数组 一个记录数字i出现了几次 一个记录出现了i次的有几个数.. */ #include <algorithm> #include <cstdlib> #include <cstdio> #include <cmath> #define Max 200090 void read (int &

大爷的字符串题 莫队

大爷的字符串题 莫队 首先这不是一道字符串题.需要仔细研究题的性质,我们会发现答案即为区间众数的个数,因为我们可以将区间分为众数个递增数列,这样为最优. 所以问题转换为求区间众数个数.使用莫队. #include <cstdio> #include <algorithm> #include <cmath> #define MAXN 400020 using namespace std; int ans,a[MAXN],cnt[MAXN],sum[MAXN]; inlin

luogu P3709大爷的字符串题

lxl出的又一道毒瘤题,题目本身让人读不懂,然而实际上题面用一句话就可以总结: 给你n个数,m次询问区间[l,r]中众数的出现次数 然后就用普通的莫队就好啦~~(数据也没有那么毒瘤) #include<algorithm> #include<cmath> #include<cstdio> using namespace std; const int maxn = 200200; int pos[maxn], num[maxn]; int ans[maxn]; int f

[voj 1551]E - Pairs 2014年武汉大学邀请赛E题 莫队算法

题目大意 有n个数,m个查询,对于每个查询,询问指定区间,有多少个数对的绝对值小于等于2. 解题思路 莫队O^1.5 首先将询问离线处理左端点进行编号,每sqrt(n)个为一组 sort结构体 当左端点编号相同时,比较右端点大小.小的放在前面. 对于每组询问暴力处理,只需处理当前新加入(删除的数字在当前区间内有多少点和它的绝对值只差小于2即可) 唯一要注意的是加点是先更新答案再计数,删点是先计数器-1再更新答案 因为对于每个询问,左端点的修改量不超过sqrt(n) 右端点每一组最坏的复杂度是修改

洛谷 P3709 大爷的字符串题

https://www.luogu.org/problem/show?pid=3709 题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区间中随机拿出一个字符x,然后把x从这个区间中删除,你要维护一个集合S 如果S为空,你rp减1 如果S中有一个元素不小于x,则你rp减1,清空S 之后将x插入S 由于你是大爷,平时做过的题考试都会考到,所以每次询问

P3709 大爷的字符串题(50分)

题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区间中随机拿出一个字符x,然后把x从这个区间中删除,你要维护一个集合S 如果S为空,你rp减1 如果S中有一个元素不小于x,则你rp减1,清空S 之后将x插入S 由于你是大爷,平时做过的题考试都会考到,所以每次询问你搞完这段区间的字符之后最多还有多少rp?rp初始为0 询问之间不互相影响~ 输入输出格

[P3709] 大爷的字符串题

Link: P3709 传送门 Solution: lxl出的语文题 其实转化一下就是求将当前区间最少拆分成多少个严格单调上升序列(可不连续) 再转化一下就是求区间内的众数个数 本来求众数的套路是主席树+二分 但此题不要求在线,用莫队同时维护$i$的出现次数$cnt[i]$和出现次数为$i$的数的个数$sum[i]$ 这样常规套路更新结果就好了 Code: #include <bits/stdc++.h> using namespace std; const int MAXN=5e5+10;

Luogu 1494 - 小Z的袜子 - [莫队算法模板题][分块]

题目链接:https://www.luogu.org/problemnew/show/P1494 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务便是告诉小Z,他有多大的概率抽到两只颜

Luogu 1494 - 小Z的袜子 - [莫队算法模板题]

题目链接:https://www.luogu.org/problemnew/show/P1494 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务便是告诉小Z,他有多大的概率抽到两只颜