莫队水毒瘤题
出题人语文水平极高,题意理解一下
就是求区间众数出现次数(什么毒瘤题目)
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 5211314; int a[maxn], pos[maxn], s[maxn],d[maxn]; int cnt[maxn],ans[maxn],lx,n,m; int re(){ int x=0,w=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)w=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘)x=x*10+ch-‘0‘,ch=getchar(); return x*w; } struct query{ int l,r,id; }q[maxn]; bool cmp(query a,query b){ return (pos[a.l]==pos[b.l])?((pos[a.l]&1)?a.r<b.r:a.r>b.r):pos[a.l]<pos[b.l]; } inline void add(int x){ s[cnt[a[x]]++]--;s[cnt[a[x]]]++;lx=max(lx,cnt[a[x]]); } inline void del(int x){ s[cnt[a[x]]]--;if(cnt[a[x]]==lx&&!s[lx])lx--;s[--cnt[a[x]]]++; } int main() { n=re(),m=re(); int size=sqrt(n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); d[i]=a[i]; pos[i] = (i - 1) / size + 1; } sort(d+1,d+n+1);int len=unique(d+1,d+n+1)-d-1; for(int i=1;i<=n;i++) a[i]=lower_bound(d+1,d+len+1,a[i])-d; for(int i=1;i<=m;i++){ q[i].l=re(),q[i].r=re(); q[i].id=i; } sort(q+1,q+m+1,cmp); int r=0,l=1; for (int i = 1; i <= m; i++) { while(r<q[i].r)add(++r); while(r>q[i].r)del(r--); while(l<q[i].l)del(l++); while(l>q[i].l)add(--l); ans[q[i].id]=lx; } for(int i=1;i<=m;i++)printf("%d\n",-ans[i]); }
原文地址:https://www.cnblogs.com/wilxx/p/11697524.html
时间: 2024-10-09 03:59:13