大爷的字符串题(莫队)

大爷的字符串题

莫队板子题。。。因为离散化的 n n nn nn不小心写成了 n n n,卡了两小时。。。

题意:贪心后正确的题意:

求区间众数的数量。

思路:没啥思路,就想水一篇博客,hhh!

  1. 莫队正常的统计每个数字的出现次数(整体加一个常数,不然过程中可能是负数)
  2. 另开一个数组统计某种出现次数有几种数
  3. 记录众数即可

代码

#include "bits/stdc++.h"
#define hhh printf("hhh\n")
#define see(x) (cerr<<(#x)<<'='<<(x)<<endl)
using namespace std;
typedef long long ll;
typedef pair<int,int> pr;
inline int read() {int x=0;char c=getchar();while(c<'0'||c>'9')c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x;}

const int maxn = 2e5+10;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
const double eps = 1e-7;

int n, m, nn, cur, len;
int a[maxn], b[maxn], cnt[maxn], vis[maxn*2], ans[maxn];

struct Q{
    int l, r, id;
    friend bool operator < (const Q &a, const Q &b) {
        if((a.l-1)/len!=(b.l-1)/len) return a.l<b.l;
        if((a.l-1)/len%2) return a.r>b.r;
        return a.r<b.r;
    }
}q[maxn];

int main() {
    //ios::sync_with_stdio(false); cin.tie(0);
    n=read(), m=read();
    for(int i=1; i<=n; ++i) a[i]=b[i]=read();
    sort(b+1,b+1+n); nn=unique(b+1,b+1+n)-b-1;
    for(int i=1; i<=n; ++i) a[i]=lower_bound(b+1,b+1+nn,a[i])-b;
    for(int i=1; i<=m; ++i) q[i]=(Q){read(),read(),i};
    len=sqrt(n);
    sort(q+1,q+1+m);
    const int p=200000;
    for(int i=1; i<=nn; ++i) cnt[i]=p;
    int l=1, r=0, mx=p;
    for(int i=1; i<=m; ++i) {
        while(l<q[i].l) {
            int c1=cnt[a[l++]]--, c2=c1-1;
            vis[c1]--, vis[c2]++;
            if(vis[c1]==0&&c1==mx) mx--;
        }
        while(l>q[i].l) {
            int c1=cnt[a[--l]]++, c2=c1+1;
            vis[c1]--, vis[c2]++;
            if(c1==mx) mx++;
        }
        while(r<q[i].r) {
            int c1=cnt[a[++r]]++, c2=c1+1;
            vis[c1]--, vis[c2]++;
            if(c1==mx) mx++;
        }
        while(r>q[i].r) {
            int c1=cnt[a[r--]]--, c2=c1-1;
            vis[c1]--, vis[c2]++;
            if(vis[c1]==0&&c1==mx) mx--;
        }
        ans[q[i].id]=p-mx;
    }
    for(int i=1; i<=m; ++i) printf("%d\n", ans[i]);
}
全部评论

相关推荐

诨号无敌鸭:恭喜佬,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务