P7230 [COCI2015-2016#3] NEKAMELEONI

news/2024/10/1 23:45:06

这个做法与 \(k\) 无关。

非常好常数,爱来自 Hanghang。

Hanghang 给出了一个空间 \(O(n)\),常数很小,代码很短的单侧递归做法。

我们考虑维护哪些区间是不符合要求的,对于一个数 \(a_x\),下一个 \(a_x\) 下标是 \(d_x\),则满足 \(x<l\le r<d_x\) 的区间 \((l,r)\) 是不符合要求的。

然后我们将 \((i,d_i)\) 画在二维平面上,则我们发现限制形如:

image

红色的是限制,表示我们不能选这个三角形内部的点,除此之外的点都可以选取,我们需要令 \(r-l+1\) 最小。

我们观察后得到,我们的答案只可能存在于蓝色部分的点,即 \(d_i\) 的前缀最大值之处。

然后我们拿一颗线段树维护,需要左区间的 \(\max\),和当前的下标,这个你发现可以单侧递归维护。

然后就做完了, \(O(n\log n+m\log^2 n)\),常数很小。

代码中 res 维护的左边对于右边贡献得到的答案,然后 ans 表示这个区间的答案。

常数很小,目前是最优解。

Code
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,INF=0x3f3f3f3f;
int n,m,q,a[N],d[N];
set<int>S[N];
multiset<int>E;
namespace ST{#define k1 (k<<1)#define k2 (k<<1|1)#define mid ((l+r)>>1)#define ls k1,l,mid#define rs k2,mid+1,rint mx[N<<2],ans[N<<2],res[N<<2];inline int calc(int v,int k,int l,int r){if(mx[k]<v||v==n+1) return INF;if(l==r) return v-l+1;if(v<mx[k1]) return min(res[k],calc(v,ls));else return calc(v,rs);}inline void up(int k,int l,int r){mx[k]=max(mx[k1],mx[k2]),ans[k]=min(ans[k1],res[k]=calc(mx[k1],rs));}inline void build(int k=1,int l=0,int r=n){if(l==r) return mx[k]=d[l],ans[k]=INF,void();build(ls),build(rs),up(k,l,r);}inline void change(int x,int v,int k=1,int l=0,int r=n){if(l==r) return mx[k]=v,void();if(x<=mid) change(x,v,ls);else change(x,v,rs);up(k,l,r);}
}
inline void del(int x,int y){auto it=S[y].find(x),pre=prev(it),nxt=next(it);if(!(*pre)) E.erase(E.find(x)),E.insert(*nxt),d[0]=*E.rbegin();else d[*pre]=*nxt;ST::change(*pre,d[*pre]),S[y].erase(*it);
}
inline void add(int x,int y){auto nxt=S[y].lower_bound(x),pre=prev(nxt);if(!(*pre)) E.erase(E.find(*nxt)),E.insert(x),d[0]=*E.rbegin();else d[*pre]=x;d[x]=*nxt,ST::change(x,d[x]),ST::change(*pre,d[*pre]),S[y].insert(x);
}
signed main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n>>m>>q;for(int i=1;i<=m;++i) S[i].insert(n+1);for(int i=1;i<=n;++i) cin>>a[i],S[a[i]].insert(i);for(int i=1;i<=n;++i) d[i]=*S[a[i]].upper_bound(i);for(int i=1;i<=m;++i) E.insert(*S[i].begin()),d[0]=max(d[0],*S[i].begin());for(int i=1;i<=m;++i) S[i].insert(0);ST::build();for(int i=1,pos,val;i<=q;++i){cin>>pos>>val;if(a[pos]!=val) del(pos,a[pos]),add(pos,a[pos]=val);if(ST::ans[1]>n) cout<<"-1\n";else cout<<ST::ans[1]<<"\n";}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/58670.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Docker 容器与数据卷

卷就是目录或文件,存在于一个或多个容器中,由 Docker 挂载到容器,提供一些用于持续存储或共享数据的特性上一篇启动 registry 的时候,用了 -v 和--privileged 参数,本文就讲解这两个参数的含义 ‍ privileged 参数 在 CentOS7 中,安全模块会比之前系统版本加强,不安全的…

FALCON:打破界限,粗粒度标签的无监督细粒度类别推断,已开源| ICML24

在许多实际应用中,相对于反映类别之间微妙差异的细粒度标签,我们更容易获取粗粒度标签。然而,现有方法无法利用粗标签以无监督的方式推断细粒度标签。为了填补这个空白,论文提出了FALCON,一种从粗粒度标记数据中无需细粒度级别的监督就能发现细粒度类别的方法。FALCON同时…

大模型应用开发实战

https://www.cnblogs.com/yubaolee/p/18390767 在接触AI应用开发的这段时间,我以为会像以前学.net,学java,学vue一样。先整个hello world,再一步一步学搭功能,学搭框架直到搭一个系统出来。然而,理想总是很丰满,现实很骨感。在实践的过程中各种千奇百怪的问题:概念太多…

服务器系统安装

环境:1.Windows环境:Windows11    2.Linux环境:Ubuntu-22.04    3.U盘厂商:Kingston    4.rufus版本:rufus-4.5    5.ventoy版本:ventoy-1.0.99 一、使用rufus制作引导盘1.下载rufus因为我的操作系统是win11,所以我需要到rufus官网下载rufus-4.5.exe,你…

在 Web 中判断页面是不是刷新

在 Web 开发中,我们经常需要区分用户是否通过刷新操作重新加载了页面。这一操作可能是由用户手动刷新(如按下 F5 键或点击浏览器刷新按钮)或通过浏览器自动重新加载。判断页面是否刷新有助于开发者优化用户体验,例如在使用 vue 的时候需要进行权限控制,就需要判断在刷新后…

【整理】【java开发】JavaWeb之JSP、Cookie、Session(一)

一、JSP介绍及原理1.1 JSP简介1.2 JSP简单入门1.3 JSP原理介绍二、JSP脚本2.1 JSP 脚本形式2.2 JSP EL表达式2.3 JSP JSTL标签三、会话跟踪技术3.1 Cookie3.2 Session原创 0xNvyao 安全随笔声明 请勿利用本公众号文章内的相关技术、工具从事非法测试,如因此造成一切不良后果与…

功率电感的额定电流

功率电感的额定电流 功率电感的各参数:两个额定电流Isat , Irms 如何理解? 功率电感一般分为以下四种外形(如图)。而在DC/DC升压降压电路中,电感是仅次于IC的最核心元器件。 选择好的功率电感,可获得较高的转换效率。功率电感的选型,一般需要参考以下几个参数:L(电感值),…