首页 > 其他分享 >[Violet] 蒲公英(分块)

[Violet] 蒲公英(分块)

时间:2024-10-01 13:00:23浏览次数:6  
标签:PII typedef return 分块 int Violet vx inline 蒲公英

区间众数要求即有次数又要数字最小

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef vector<string> VS;
typedef vector<int> VI;
typedef vector<vector<int>> VVI;
inline int log_2(int x) {return 31-__builtin_clz(x);}
inline int popcount(int x) {return __builtin_popcount(x);}
inline int lowbit(int x) {return x&-x;}
vector<int> vx;
void divide(){sort(vx.begin(),vx.end());vx.erase(unique(vx.begin(),vx.end()),vx.end());}
inline int mp(int x) {return upper_bound(vx.begin(),vx.end(),x)-vx.begin();}
const int N = 40010 , B = 300;
//f[i][j]表示i块到j块的众数出现次数和是谁
int a[N],s[B][N],st[B],en[B],c[N];
PII f[B][B];
inline void up(PII &a,int v,int x) 
{
	if(a.x < v) a.x = v, a.y = x;
	else if(a.x == v) a.y = min(x,a.y);
}
int n,q;
inline int sum(int L,int R,int x) {return s[R][x] - s[L-1][x];}
void pre_f()
{
	int m = n/B;
    for(int i=0;i<=m;++i)
    {
        PII ans = {0,0};
        for(int j=i;j<=m;++j)
        {
        	for(int k=st[j];k<=en[j];++k)
         	c[a[k]]++, up(ans,c[a[k]],a[k]);
         	f[i][j] = ans;
        } 
        memset(c,0,sizeof c);
    }
}
void pre_s()
{
	memset(s,0,sizeof s);
	int m = n/B;
	for(int i=1;i<=n;++i) s[i/B][a[i]] ++;
	for(int i=1;i<=m;++i)
	 for(int j=1;j<=n;++j)
	 s[i][j] += s[i-1][j];
}
PII query(int l,int r)
{
    int L = l/B, R = r/B;
    //一定要注意此处是L+1>=R,符号不要写反了
    if(L+1>=R)
    {
        PII ans = {0,0};
        for(int i=l;i<=r;++i) c[a[i]]++, up(ans,c[a[i]],a[i]);
        for(int i=l;i<=r;++i) c[a[i]] = 0;
        return ans;
    }
    PII ans = f[L+1][R-1];
    for(int i=l;i<=en[L];++i) c[a[i]]++, up(ans,c[a[i]]+sum(L+1,R-1,a[i]),a[i]);
    for(int i=st[R];i<=r;++i) c[a[i]]++, up(ans,c[a[i]]+sum(L+1,R-1,a[i]),a[i]);
    for(int i=l;i<=en[L];++i) c[a[i]] = 0;
    for(int i=st[R];i<=r;++i) c[a[i]] = 0;
    return ans;
}
void solve()
{
    vx.clear();
    memset(s,0,sizeof s);
    cin>>n>>q;
    for(int i=1;i<=n;++i) en[i/B] = i;
    for(int i=n; i;--i) st[i/B] = i;
    for(int i=1;i<=n;++i) 
    {
        cin>>a[i];
        vx.push_back(a[i]);
    }
    //离散化
    divide();
    for(int i=1;i<=n;++i) a[i] = mp(a[i]);
    
    pre_f(), pre_s();
    memset(c,0,sizeof c);
    PII ans = {0,0};
    int res = 0;
    while(q--)
    {
        int l,r;
        cin>>l>>r;
        l = (l+res-1+n)%n + 1, r = (r+res-1+n)%n + 1;
        if(l>r) swap(l,r);
        ans = query(l,r);
        res = vx[ans.y-1];
        cout<<res<<'\n';
    } 
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T = 1;
    //cin>>T;
    while(T--)
    {
        solve();
    }
}
 

标签:PII,typedef,return,分块,int,Violet,vx,inline,蒲公英
From: https://www.cnblogs.com/ruoye123456/p/18442824

相关文章

  • 分块/莫队学习笔记(一)(2024.8.23)
    分块基本概念分块的基本思想是,通过对原数据的适当划分,并在划分后的每一个块上预处理部分信息,从而较一般的暴力算法取得更优的时间复杂度。分块的时间复杂度主要取决于分块的块长,一般可以通过均值不等式求出某个问题下的最优块长,以及相应的时间复杂度。LOJ小分块#6277.数列分......
  • P3863 序列(分块)
    感觉是一个比较厉害的trick,并且从来没见过,记录一下。题意给定\(n\)个数和\(q\)次操作:1lrx:区间\([l,r]\)加\(x\)。2xv:查询在询问之前有多少时刻\(a_x\gev\)。一次操作定义为一个时刻,初始为\(0\)时刻。\(n,q\le10^5\)分析如果\(x\ge0\),那么\(a_i\)的......
  • P3730 曼哈顿交易(经典题,莫队+值域分块)
    记录这一类很典的题目。题意给定\(n\)个数,\(q\)次询问区间\([l,r]\)内出现次数第\(k\)小的数的出现次数。若区间内不同数的个数小于\(k\)输出-1。\(n,q\le10^5\)。分析发现正常的数据结构以及分块都很难维护这种信息,考虑莫队。莫队加入数时,我们需要更新一个数的......
  • 分块算法
    #include<algorithm>usingnamespacestd;intadd[1000];intst[1000],ed[1000],pos[1000];longlonga[10000];longlongsum[1000]={0};//初始化块voidinit(intn){ intblock=sqrt(n); intt=n/block; if(n%block)t++;//t表示块的数量,如果不是整......
  • 数列分块入门
    分块是一种优秀的思想。“数据”是分块的目的。不同于大多数树形数据结构,分块中访问数据是容易的,因此,它可以用比前者更简单的方式支持复杂的操作。“标记”是分块最重要的过程。不同于大多数树形数据结构,分块大多数时候不需要支持标记与标记合并,因此,它能完成一些前者不能完成的......
  • 分块式内存管理理论理解
    一,引入             分块式内存管理是一种内存管理策略,它将内存划分为若干个大小相等的块(称为“分区”、“段”或“块”),然后为不同的程序分配这些块。这种策略可以有效地解决内存碎片问题,提高内存利用率。分块式内存管理通常有两种实现方式:固定大小块和可变......
  • 语义分块:改进 AI 信息检索
    RAG系统及其挑战检索增强生成的流行是有充分理由的。它允许AI系统通过结合信息检索和语言生成来回答问题。标准的RAG管道通过摄取数据、检索相关信息并使用它来生成响应来实现这一点。然而,随着数据变得越来越复杂,查询也越来越复杂,传统的RAG系统可能会面临限制。这就是语......
  • 学习笔记:数论分块
    数论分块1.0可以快速计算一些含有除法向下取整的和式(形如$\sum_{i=1}^ng(i)\left\lfloor\frac{n}{i}\right\rfloor$)。2.0引理1:\(\left\lfloor\frac{n}{i}\right\rfloor\)的取值最多只有\(2\times\sqrtn\)种。证明:对于\(i\le\left\lfloor\sqrtn\rig......
  • 数论分块扩展
    【OI-wiki#5805】feat(math/number-theory/sqrt-decomposition.md):增加数论分块的拓展&改动部分格式以计算含有\(\left\lfloor\sqrt{\frac{n}{d}}\right\rfloor\)的和式为例。考虑对于一个正整数\(n\),如何求出集合\[S=\left\{\left\lfloor\sqrt{\frac{n}{d}}\right\rf......
  • 分块莫队
    莫队序言其实我不是很赞成把分块和莫队放到一起的(可能是我太菜了),原本这周先学的树上合并,树分治扫描线那些的,但是没怎么懂,先写一个记忆最新的吧。简介莫队算法是由莫涛提出的算法,莫队算法可以解决一类离线区间询问问题,适用性极为广泛。同时将其加以扩展,便能轻松处理树上路径询......