大爺的字符串題
莫隊板子題。。。因爲離散化的不小心寫成了,卡了兩小時。。。
題意:貪心後正確的題意:
求區間衆數的數量。
思路:沒啥思路,就想水一篇博客,hhh!
- 莫隊正常的統計每個數字的出現次數(整體加一個常數,不然過程中可能是負數)
- 另開一個數組統計某種出現次數有幾種數
- 記錄衆數即可
代碼
#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]);
}