首页 > 其他分享 >CF 1904 D. Set To Max

CF 1904 D. Set To Max

时间:2023-12-14 23:46:45浏览次数:33  
标签:Set 200005 int Max Hard Version Easy 1904 include

Easy Version
Hard Version

Hard Version的做法可以从Easy Version 用数据结构优化得到。

首先我们想一下,什么情况需要进行操作?显然是\(a_i!=b_i\)的时候,并且当\(a_i>b_i\)的时候将会无解。

那么当\(a_i<b_i\)的时候,应该怎么办呢,显然应该寻找左边和右边最近的\(j\),.满足\(a_j=b_i\),
并且在\(j\)到\(i\)之间不存在一个点\(k\),使\(a_k>b_i\)或者\(b_k<b_i\),

那么对于Easy version,只要暴力循环检查就可以了.

对于Hard version,可以注意到最近的点可以用二分查找快速找到,而对于是否合法,可以用ST表快速得到区间最值来检查。

在这里仅展示Hard version的做法

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<ctime>
#include<bitset>
using namespace std;
int t;
int n;
int a[200005];
int b[200005];
int lg[200005];
int f[200005][22];
int g[200005][22];
void cal(){
	for(int j=0;j<20;++j){
		for(int i=1;i+(1<<j)-1<=n;++i){
			if(!j) f[i][j]=a[i],g[i][j]=b[i];
			else{
				f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
				g[i][j]=min(g[i][j-1],g[i+(1<<(j-1))][j-1]);
			}
		}
	}
}
void ini(){
	lg[1]=0;
	for(int i=2;i<=200000;++i)
		lg[i]=lg[i>>1]+1;
}
int qmax(int l,int r){
	int k=lg[r-l+1];
	return max(f[l][k],f[r-(1<<k)+1][k]);
}
int qmin(int l,int r){
	int k=lg[r-l+1];
	return min(g[l][k],g[r-(1<<k)+1][k]);
}
void solve(){
	for(int i=1;i<=n;++i)
		if(a[i]>b[i]){
			puts("NO");
			return ;
		}
	cal();
	vector<vector<int>>p(n+1);
	for(int i=1;i<=n;++i)
		p[i].push_back(0);
	for(int i=1;i<=n;++i)
		p[a[i]].push_back(i);
	for(int i=1;i<=n;++i)
		p[i].push_back(n+1);
	int f=1;
	for(int i=1;i<=n;++i){
		int x=b[i];
		if(b[i]==a[i]) continue;
		int ff=0;
		int r=upper_bound(p[x].begin(),p[x].end(),i)-p[x].begin();
		int l=r-1;
		r=p[x][r];
		l=p[x][l];
		if(l!=0){
			if(qmax(l,i)==x&&qmin(l,i)==x) 
				ff=1;
		}
		if(r!=n+1){
			if(qmax(i,r)==x&&qmin(i,r)==x) 
				ff=1;
		}
		if(!ff){
			puts("NO");
			return ;
		}
	}
	puts("YES");
	return ;
}
int main(){
	ini();
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		for(int i=1;i<=n;++i)
			scanf("%d",&a[i]);
		for(int i=1;i<=n;++i)
			scanf("%d",&b[i]);
		solve();
	}
	return 0;
}

标签:Set,200005,int,Max,Hard,Version,Easy,1904,include
From: https://www.cnblogs.com/For-Miku/p/17902472.html

相关文章

  • 【异常】File encoding has not been set, using platform encoding UTF-8, i.e. buil
    From: https://www.cnblogs.com/duanxianyouyang/p/14679926.htmlFileencodinghasnotbeenset,usingplatformencodingUTF-8,i.e.buildisplatformdependent!Usingplatformencoding(UTF-8actually)tocopyfilteredresources,i.e.buildisplatformdepen......
  • Solution Set 2023.12.14
    CF698FCoprimePermutation考虑\(p_i=0\)的情况下怎么做,首先排列\(p_i=i\)一定符合条件,考虑在此基础上生成其他符合要求的排列,考虑什么情况下\(p_i\)和\(p_j\)可以互换,发现其可以互换当且仅当对于所有\(x\neqi\)且\(x\neqj\),均有\(\left[\gcd\left(i,x\rig......
  • 一招MAX降低10倍,现在它是我的了
    一.背景性能优化是一场永无止境的旅程。到家门店系统,作为到家核心基础服务之一,门店C端接口有着调用量高,性能要求高的特点。C端服务经过演进,核心接口先查询本地缓存,如果本地缓存没有命中,再查询Redis。本地缓存命中率99%,服务性能比较平稳。随着门店数据越来越多,本地缓存容量逐......
  • Java之Hashset的原理及解析
     4.数据结构4.1二叉树【理解】二叉树的特点二叉树中,任意一个节点的度要小于等于2节点:在树结构中,每一个元素称之为节点度:每一个节点的子节点数量称之为度二叉树结构图编辑4.2二叉查找树【理解】二叉查找树的特点二叉查找树,又称二叉排序树或者二叉搜索树每一个节点上最多有两......
  • 无涯教程-Java - max()函数
    此方法给出两个参数中的最大值。参数可以是int,float,long,double。max()-语法此方法具有以下变体-doublemax(doublearg1,doublearg2)floatmax(floatarg1,floatarg2)intmax(intarg1,intarg2)longmax(longarg1,longarg2)max()-返回值此方法返回两个参数......
  • ArgoCD ApplicationSet CRD
    ApplicationSet概述ApplicationSetcontroller是一个Kubernetescontroller,添加了对ApplicationSetCustomResourceDefinition(CRD)的支持。该controller/CRD实现了跨大量集群和monorepos内管理ArgoCDApplication的自动化和更大的灵活性,此外,它还使多租户Kubernetes......
  • 除了Promise.all(),使用Promise.allSettled()方式请求,避免使用循环请求
    constgetFilePromises:Promise<any>[]=[];fileIds.forEach((item)=>{getFilePromises.push(getFileInfoApi({id:item}));});Promise.allSettled(getFilePromises).then((res)=>{this.fileList=res.map((item,index)=>......
  • Solution Set 2023.12.13
    CF1736ESwapandTake设在第\(i\)次操作后产生贡献的值为初始序列的\(a_{p_i}\),可以发现产生的贡献的指针移动方式为每次向后移动\(1\),而通过交换数字最多可以使得某个数字每次向后移动\(1\),由此可以得出每次产生贡献的位置单调不减,即\(p_1\lep_2\le\cdots\lep_n\)......
  • vulkan/descriptorSet
    参考Shaderlayout(binding=0)uniformUniformBufferObject{mat4model;mat4view;mat4proj;}ubo;layout(location=0)invec2inPosition;layout(location=1)invec3inColor;layout(location=2)invec2inTexCoord;layout(location=0)......
  • 【交叉链表】Java哈希表——HashSet类/双指针
    leetcode160.相交链表题意:给定两个链表A、B的表头节点,找到链表交叉节点(地址值相同)。链表A长度为m,链表B长度为n,范围在[1,3e4]题解1:根据哈希表去重的原理,使用哈希表集合HashSet来维护链表节点,默认比较节点地址值。将链表A中的节点全部add进HashSet中,然后遍历链表B中的节点,如果......