首页 > 其他分享 >P7230 [COCI2015-2016#3] NEKAMELEONI

P7230 [COCI2015-2016#3] NEKAMELEONI

时间:2024-09-10 13:14:30浏览次数:7  
标签:NEKAMELEONI val int COCI2015 pos 常数 2016 我们 define

这个做法与 \(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,r
	int 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";
	}
}

标签:NEKAMELEONI,val,int,COCI2015,pos,常数,2016,我们,define
From: https://www.cnblogs.com/Nityacke/p/18406203

相关文章

  • vulhub spring 远程命令执行漏洞(CVE-2016-4977)
    步骤一:执行以下命令启动靶场环境并在浏览器访问cd/vulhub/spring/CVE-2016-4977#进入漏洞环境所在目录docker-compose up-d#启动靶场 docker ps#查看容器信息步骤二:访问环境步骤三:192.168.0.107:8080/oauth/authorize?response_type=${2*2}&client_id=acme&scope=o......
  • Exchange 2016部署实施案例篇-04.Ex基础配置篇(中)
    昨天更新了基础配置的上篇《Exchange2016部署实施案例篇-04.Ex基础配置篇(上)》,欢迎各位老铁多多提出宝贵意见,非常感谢。虚拟目录自动发现配置有的朋友可能知道,虽然在虚拟目录里有自动发现这个选项,但自动发现记录在图形化界面无法配置自动发现地址,如图所示 其实自动......
  • Exchange 2016部署实施案例篇-03.Exchange部署篇(下)
    昨天我们一起准备完成了ExchangeServer2016的先决条件,今天我们一起来看下如何部署ExchangeServer2016.最近想了想,决定该篇使用2种方式部署ExchangeServer2016,这样可能会让大家对ExchangeServer2016的部署更了解些,废话不多说,开始今天的内容。图形化界面部署......
  • Exchange 2016部署实施案例篇-03.Exchange部署篇(中)
    上一章《Exchange2016部署实施案例篇-03.Exchange部署篇(上)》我们对部署ExchangeServer2016的先决条件做了简单的讲解,接下来我们进入先决条件准备工作。先简单说下环境:服务器名称IP地址系统作用ADSrv01192.168.1.10Win2016GC(已部署完成)ADSrv02192.168.1.20......
  • Exchange 2016部署实施案例篇-03.Exchange部署篇(上)
    距离上一篇《Exchange2016部署实施案例篇-02.活动目录部署篇》博文更新已经过去快一周了,最近一直在忙项目上的事情和软考,整的真心有点身心俱疲啊,最近看了下上一篇博文不知道为什么访问量一直上不去,真心有点心寒啊。希望大家能多多提出宝贵意见,看看如何能让访问量上去。......
  • Exchange 2016部署实施案例篇-02.活动目录部署篇
    其实在写这篇博文之前纠结了好久,到底是该写部署1台AD演示下,还是部署2台活动目录那,比较这个专家还是以Exchang为主,但思来想去最终决定还是部署一主一辅吧,毕竟部署主与辅助还是稍微在步骤上有些不同的,废话不多说,接下来我们开始我们今天的话题,活动目录部署,请大家耐心读奥,有福利奥......
  • Exchange 2016部署实施案例篇-01.架构设计篇(下)
    相信看过上篇Blog《Exchange2016部署实施案例篇-01.架构设计篇(上)》的老铁们可能知道,小弟在上篇Blog中编写了一个需求,不知是否有老铁们已经设计出相对于的架构了,今天我就给大家介绍下我设计的架构。  需求分析我在上篇已经做过了,欢迎各位老铁查阅上一篇博客《Exchange2016......
  • Exchange 2016部署实施案例篇-01.架构设计篇(上)
       前言:此博客为转载,最开始发布这个博客的博主已经看不到了,而网上的一般又不太全,所以我整理起来发布在这里,如果需要删除的化请私信我  年前就答应大家要给大家写一个关于Exchange规划部署的文章,一直忙到现在也没有倒出时间来写这个东西。特别是节后,更是开工不利啊,各种奇......
  • 【Ynoi 2016】掉进兔子洞
    LuoguP4688掉进兔子洞题意给定一个长度为\(n\)的序列\(a\)。有\(m\)次询问:每次询问给定三个区间,问将三个区间内同时出现的数删掉后,还剩下多少个数。每次询问独立。数据范围与约定\(1\len,m\le10^5\),\(1\lea_i\le10^9\)。题解首先发现,每次询问的答案形式为:\(......
  • [蓝桥杯 2016 省 A] 密码脱落--最长公共子序列题解
    题目复述:题目链接:[蓝桥杯2016省A]密码脱落-洛谷#[蓝桥杯2016省A]密码脱落##题目描述X星球的考古学家发现了一批古代留下来的密码。这些密码是由A、B、C、D四种植物的种子串成的序列。仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的回文串)。......