CF940F Machine Learning(带修莫队)

博客介绍了数组离散化后带修莫队求mex的方法。通过记录数出现次数及出现次数的出现次数,暴力扫最小出现次数为0的正整数求mex,复杂度为O(√n)。还分析了数组分块的块大小,得出块大小为O(n2/3)时最优,复杂度为O(n5/3)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先显然应该把数组离散化,然后发现是个带修莫队裸题,但是求mex比较讨厌,怎么办?其实可以这样求:记录每个数出现的次数,以及出现次数的出现次数。至于求mex,直接暴力扫最小的出现次数的出现次数为0的正整数,就一句话,这样看似会超时,实际上是O(√n)的复杂度。为什么?假设存在出现1,2,...,x的出现次数,则Σi(1<=i<=x)<=n,即x*(x+1)<=2*n,所以x至多是√n级别。很多人再把出现次数分块,根本没必要。然后考虑把数组分块的块大小,每次移动左指针,为O(n*块大小),移动右指针,为O(n*块大小+n*块个数),移动修改标记,为O(n*块个数2),然后显然块大小为O(n2/3)最优,复杂度O(n5/3)

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+7;
struct query{int l,r,t,id;}q[N];
struct mdf{int pos,pre,now;}d[N];
int n,m,B,l=1,r,cnt,qcnt,mcnt,a[N],b[N],c[N],tmp[N],tot[N],num[N],ans[N];
bool cmp(query a,query b)
{
    if((a.l-1)/B!=(b.l-1)/B)return a.l<b.l;
    return(a.r-1)/B==(b.r-1)/B?a.t<b.t:a.r<b.r;
}
void add(int x,int v){tot[num[x]]--,num[x]+=v,tot[num[x]]++;}
void modify(int i,int f)
{
    if(d[i].pos>=l&&d[i].pos<=r)add(a[d[i].pos],-1);
    a[d[i].pos]=f==1?d[i].now:d[i].pre;
    if(d[i].pos>=l&&d[i].pos<=r)add(a[d[i].pos],1);
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]),tmp[++cnt]=a[i];
    for(int i=1;i<=m;i++)
    {
        int op,x,y;scanf("%d%d%d",&op,&x,&y);
        if(op==1)q[++qcnt]=(query){x,y,mcnt,qcnt};
        else d[++mcnt]=(mdf){x,0,y},tmp[++cnt]=y;
    }
    sort(tmp+1,tmp+cnt+1);
    cnt=unique(tmp+1,tmp+cnt+1)-tmp-1;
    for(int i=1;i<=n;i++)a[i]=b[i]=lower_bound(tmp+1,tmp+cnt+1,a[i])-tmp;
    for(int i=1;i<=mcnt;i++)
    {
        d[i].now=lower_bound(tmp+1,tmp+cnt+1,d[i].now)-tmp;
        d[i].pre=b[d[i].pos],b[d[i].pos]=d[i].now;
    }
    B=pow(n,0.67);
    sort(q+1,q+qcnt+1,cmp);
    for(int i=1,tm=0;i<=qcnt;i++)
    {
        while(tm<q[i].t)modify(++tm,1);
        while(tm>q[i].t)modify(tm--,-1);
        while(r<q[i].r)add(a[++r],1);
        while(l>q[i].l)add(a[--l],1);
        while(r>q[i].r)add(a[r--],-1);
        while(l<q[i].l)add(a[l++],-1);
        ans[q[i].id]=1;
        while(tot[ans[q[i].id]])ans[q[i].id]++;
    }
    for(int i=1;i<=qcnt;i++)printf("%d\n",ans[i]);
}
View Code

 

转载于:https://www.cnblogs.com/hfctf0210/p/11179323.html

内容概要:该PPT详细介绍了企业架构设计的方法论,涵盖业务架构、数据架构、应用架构和技术架构四大核心模块。首先分析了企业架构现状,包括业务、数据、应用和技术四大架构的内容和关系,明确了企业架构设计的重要性。接着,阐述了新版企业架构总体框架(CSG-EAF 2.0)的形成过程,强调其融合了传统架构设计(TOGAF)和领域驱动设计(DDD)的优势,以适应数字化转型需求。业务架构部分通过梳理企业级和专业级价值流,细化业务能力、流程和对象,确保业务战略的有效落地。数据架构部分则遵循五大原则,确保数据的准确、一致和高效使用。应用架构方面,提出了分层解耦和服务化的设计原则,以提高灵活性和响应速度。最后,技术架构部分围绕技术框架、组件、平台和部署节点进行了详细设计,确保技术架构的稳定性和扩展性。 适合人群:适用于具有一定企业架构设计经验的IT架构师、项目经理和业务分析师,特别是那些希望深入了解如何将企业架构设计与数字化转型相结合的专业人士。 使用场景及目标:①帮助企业和组织梳理业务流程,优化业务能力,实现战略目标;②指导数据管理和应用开发,确保数据的一致性和应用的高效性;③为技术选型和系统部署提供科学依据,确保技术架构的稳定性和扩展性。 阅读建议:此资源内容详尽,涵盖企业架构设计的各个方面。建议读者在学习过程中,结合实际案例进行理解和实践,重点关注各架构模块之间的关联和协同,以便更好地应用于实际工作中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值