[Violet]蒲公英

题链:https://www.luogu.org/problemnew/show/P4168

 

这是一道神仙题

首先分块,答案可能是夹在中间的块或者是两边的数

预处理出任意一段块的众数

再每块用前缀和

每次询问暴力就好了

 

有点语无伦次,看代码

#include
#include
#include
#include
using namespace std;
 
const int M=305,N=1e5+5;
int n,m,S,T,a[N],c[N],d[N],t[N];
int Num,ans,f[M][M],s[M][N];
 
struct A{int x,id; }b[N];
bool cmp(A i,A j){return i.xNum)
            {
                Num=d[j];
                Mx=j;
            }
        }
        f[i][i]=Mx;
        for(int j=i+1;j<=T;j++)
        {
            for(int k=(j-1)*S+1;k<=min(j*S,n);k++)
            {
                d[a[k]]++;
                if(d[a[k]]>Num||d[a[k]]==Num&&a[k]r) swap(l,r);
        int lb=(l-1)/S+2,rb=r/S;
        if(rbNum||d[a[i]]==Num&&a[i]Num||
                   t[a[i]]+s[rb][a[i]]-s[lb-1][a[i]]==Num&&a[i]Num||
                   t[a[i]]+s[rb][a[i]]-s[lb-1][a[i]]==Num&&a[i]

 

你可能感兴趣的:(分块)