首页 > 其他分享 >CF1707E Replace

CF1707E Replace

时间:2024-06-23 18:12:22浏览次数:7  
标签:tmp rs int mid Replace ls CF1707E query

题目描述

给定一个长为 \(n\) 的序列 \(a_1,\ldots,a_n\),其中对于任意的 \(i\) 满足 \(1 \leq a_i \leq n\)。

定义一个二元组函数如下:

\[f((l,r))=(\min\{a_l,\ldots,a_r\},\max\{a_l,\ldots,a_r\})(l \leq r) \]

你需要回答 \(q\) 次询问,每次给定 \((l_i,r_i)\),问其最少经过多少次 \(f\) 的调用(即 \((l,r) \rightarrow f((l,r))\))使得 \((l_i,r_i)\) 变成 \((1,n)\),若无解请输出 -1

题解

智慧的性质题
首先注意到\(f((l,r))=\bigcup_{i=l}^{r-1}f((i,i+1))\)
发现可以推广到\(f^k((l,r))=\bigcup_{i=l}^{r-1}f^k((i,i+1))\),可以用归纳法证明
接下来的做法就容易可以想出了
设\(F_{i,j}=f^{2^i}((j,j+1))\),然后倍增解决,合并区间可以用线段树

\(\text{code}\)

#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
void read(int &res)
{
	res=0;char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while('0'<=ch&&ch<='9') res=(res<<1)+(res<<3)+(ch^48),ch=getchar();
}
const int N=1e5+100,B=40;
int n,q,a[N+10];
struct seg
{
	int l,r;
}f[B+10][N+10];
int g[B+10][N+10];
seg merge(seg a,seg b){return (seg){min(a.l,b.l),max(a.r,b.r)};}
struct SEG
{
	seg t[N<<2|1];
	#define ls (p<<1)
	#define rs (p<<1|1)
	#define mid ((l+r)>>1)
	void build(seg *f,int p=1,int l=1,int r=n-1)
	{
		if(l==r)
		{
			t[p]=f[l];
			return;
		}
		build(f,ls,l,mid),build(f,rs,mid+1,r);
		t[p]=merge(t[ls],t[rs]);
	}
	seg query(int L,int R,int p=1,int l=1,int r=n-1)
	{
		if(L<=l&&r<=R) return t[p];
		if(R<=mid) return query(L,R,ls,l,mid);
		else if(L>mid) return query(L,R,rs,mid+1,r);
		else return merge(query(L,R,ls,l,mid),query(L,R,rs,mid+1,r));
	}
	#undef ls
	#undef rs
	#undef mid
}t[B+10];
int main()
{
//	freopen("a.in","r",stdin);
	read(n),read(q);
	if(n==1)
	{
		for(;q--;) printf("0\n");
		return 0;
	}
	for(int i=1;i<=n;i++) read(a[i]);
	for(int i=1;i<n;i++) f[0][i]=(seg){min(a[i],a[i+1]),max(a[i],a[i+1])},g[0][i]=a[i];
	t[0].build(f[0]);
	for(int j=1;j<=B;j++)
	{
		for(int i=1;i<n;i++)
		{
			if(f[j-1][i].l==f[j-1][i].r) f[j][i]=(seg){g[j-1][f[j-1][i].l],g[j-1][f[j-1][i].l]};
			else f[j][i]=t[j-1].query(f[j-1][i].l,f[j-1][i].r-1);
		}
		t[j].build(f[j]);
		for(int i=1;i<=n;i++) g[j][i]=g[j-1][g[j-1][i]];
	}
	for(int l,r;q--;)
	{
		read(l),read(r);
		if(l==1&&r==n)
		{
			printf("0\n");
			continue;
		}
		ll ans=0;
		if(l!=r)
			for(int i=B;i>=0;i--)
			{
				seg tmp=t[i].query(l,r-1);
				if(tmp.l!=1||tmp.r!=n)
				{
					l=tmp.l,r=tmp.r;
					ans+=(1ll<<i);
				}
				if(l==r) break;
			}
		if(l==r) printf("-1\n");
		else
		{
			seg tmp=t[0].query(l,r-1);
			if(tmp.l==1&&tmp.r==n) printf("%lld\n",ans+1);
			else printf("-1\n");
		}
	}
	return 0;
}

标签:tmp,rs,int,mid,Replace,ls,CF1707E,query
From: https://www.cnblogs.com/the-blog-of-doctorZ/p/18263734

相关文章

  • Python3 笔记:字符串的 replace() 和 expandtabs()
    1、replace()方法把字符串中的old(旧字符串)替换成new(新字符串),如果指定第三个参数max,则替换不超过max次。语法:str.replace(old,new[,max])参数:old:将被替换的子字符串。new:新字符串,用于替换old子字符串。max:可选参数,如果填写则表示替换不超过max次。str1='old......
  • 【JavaScript】内置对象 - 字符串对象 ⑦ ( String 字符串替换 | replace 函数 | repl
    文章目录一、String字符串替换1、replace函数替换字符串2、使用replace函数替换所有匹配字符串3、replaceAll函数替换字符串二、String字符串转数组1、split函数切割字符串2、代码示例-切割字符串String字符串对象参考文档:https://developer.mozilla.......
  • 网上 copy 的一段 javascript 代码 String.prototype.replaceAll = fucntion(){...}
    早些年,浏览器没有内置字符串的replaceAll()方法,就从网上copy了一段replaceAll()的实现:String.prototype.replaceAll=function(AFindText,ARepText){raRegExp=newRegExp(AFindText,"g");returnthis.replace(raRegExp,ARepText)}今天突然遇到一个问题,定位到了这段代码,我......
  • Git:warning: CALF wilL be replaced by LF in xxxx 问题解决
    warning:CALFwilLbereplacedbyLFinxxxx问题解决办法出现这个问题的原因是像缓存区中提交文件时出现的 原因:windows中的换行符为CRLF,而在Linux下的换行符为LF,所以在执行add.时出现提示也就是,工作区的文件都应该用CRLF来换行。如果 改动文件时引入了LF,提......
  • WDS+MDT网络启动自动部署windows(十九)MDT replace任务序列
    简介MDT的默认任务序列有很多个,我们不能只盯着标准客户序列啊, 不管用不用,我替你们测试一下replace upgrade两个标准序列。sysprepandcapture,这个是做胖镜像的,终端机祛除各种信息,然后抓镜像回来的,介绍的很多,就不讲了。测试replace任务序列 我将随意安装两个软件,并用两......
  • Mysql替换字段中指定字符(replace 函数)
    一、简介函数将字符串中出现的所有子字符串替换为新的子字符串。REPLACE()函数是基于字符的替换,并且替换字符串时是区分大小写的。二、语法这里是MySQLREPLACE()函数的语法:REPLACE(str,from_str,to_str)参数str必需的。原字符串。from_str必需的。被替换的子字符......
  • 人机验证 reCaptcha 无法解锁 使用 Gooreplacer 的解决方案
    解决方案浏览器搜索并安装插件Gooreplacer(参考下方链接),新增设置:匹配模式google.com/recaptcha匹配类型通配符目标地址recaptcha.net/recaptcha如下图:并开启,刷新页面,即可。故障分析及解决思路常见的人机验证(reCaptcha)网址是google.com/recaptcha,而Google由于一些......
  • access数据库批量更新中无法使用replace,出现“表达式中 'replace' 函数未定义”的替代
    如果我们想要批量修改数据库table_name表中aa字段中数据,将“|bbbb”删除sql的批量更新中,通用语法是:UPDATEtable_nameSETaa=REPLACE(aa,'|bbbb','')但是,如果是access数据库,就可能出现以下的报错信息:MicrosoftJETDatabaseEngine错误'80040e14'表达式中'replace'函......
  • 从REPLACEMENT_OPERATOR_NEW_AND_DELETE看UE的堆内存管理及gcc相关实现
    观察为了让庞大代码库看起来更简洁一些,UE使用了不少C/C++黑魔法:宏。把一些重复或者繁琐的实现细节隐藏在了宏里面(例如最为常见且繁琐的GENERATED_BODY宏),尽管代码看起来更简洁,但也隐藏了一些(重要的)细节。在看UE插件实现时,意外的看到IMPLEMENT_MODULE宏定义中,不仅包含了初始化......
  • mysql中replace into用法
    前言replaceinto跟insertinto功能类似,不同点在于:replaceinto首先尝试插入数据到表中如果发现表中已经有相同的数据(根据主键或者唯一索引判断)则先删除原来的数据,然后插入新的。否则,直接插入新数据。注意:插入数据的表必须有主键或者是唯一索引!否则的话,replaceinto会......