首页 > 其他分享 >局部最值性质

局部最值性质

时间:2023-06-22 20:36:50浏览次数:40  
标签:return int 局部 最小值 && b3 最值 性质

E. Fill the Matrix

Problem - E - Codeforces

题意:给定一个长为a的数组,你需要找到一个子序列使得其b1-b2+b3-b3+-----的值最大,同时有q个询问,每次交换a中两个元素的位置,问交换后如何最大值是多少。

n,q<=3e5,1<=ai<=n.

题解:我们显然是要寻找某种性质,使得转移过程中复杂度低于线性。

我们贪心地想,取每一个局部最大值为奇数位,局部最小值为偶数位,即取遍数组中每座峰到底的长度,容易证明这样做是正确的。那么,当我们改变两个位置时,局部最大/小值的改变只会发生在l-1,l,l+1,r-1,r,r+16个位置上,我们暴力判断这6个位置是否变成了局部最大最小值,若是假如即可(最大最小值成对)。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+10;
int a[N],n;
int check(int i){
	if(i<=0||i>n) return 0;
	if(a[i]>a[i-1]&&a[i]>a[i+1]){
			return 1;
		}
	else if(a[i]<a[i-1]&&a[i]<a[i+1]) return -1;
	else return 0;
}
void solve(){
	int q;cin>>n>>q;
	int ans=0;
	for(int i=1;i<=n;i++) cin>>a[i];
	a[0]=-1e9,a[n+1]=-1e9;
	for(int i=1;i<=n;i++){
		if(a[i]>a[i-1]&&a[i]>a[i+1]){
			ans+=a[i];
		}
		else if(a[i]<a[i-1]&&a[i]<a[i+1]) ans-=a[i];
	}
	cout<<ans<<endl;
	for(int i=1;i<=q;i++){
		int l,r;cin>>l>>r;
		set<int> st;
		for(int j=-1;j<=1;j++){
			st.insert(l+j);
			st.insert(r+j);
		}
		for(auto it=st.begin();it!=st.end();it++){
			int w=*it;
			if(check(w)==1) ans-=a[w];
			else if(check(w)==-1) ans+=a[w];
		}
		swap(a[l],a[r]);
		for(auto it=st.begin();it!=st.end();it++){
			int w=*it;
			if(check(w)==1) ans+=a[w];
			else if(check(w)==-1) ans-=a[w];
		}
		cout<<ans<<endl;
	}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
	int T;cin>>T;
	while(T--) 
	solve();
}

标签:return,int,局部,最小值,&&,b3,最值,性质
From: https://www.cnblogs.com/wjhqwq/p/17498263.html

相关文章

  • P5710 【深基3.例2】数的性质
    【深基3.例2】数的性质题目描述一些整数可能拥有以下的性质:性质1:是偶数;性质2:大于$4$且不大于$12$。小A喜欢这两个性质同时成立的整数;Uim喜欢这至少符合其中一种性质的整数;八尾勇喜欢刚好有符合其中一个性质的整数;正妹喜欢不符合这两个性质的整数。现在给出一个整数......
  • 【算法】编写一个函数,返回数字数组的“峰值”(或局部最大值)的位置和值。
    编写一个函数,返回数字数组的“峰值”(或局部最大值)的位置和值。例如,数组arr=[0,1,2,5,1,0]在位置3处具有值为5的峰值(因为arr[3]等于5)。输出将以Dictionary<string,List<int>的形式返回,其中包含两个键值对:“pos”和“peaks”。如果给定的数组中没有峰值,只需返回{“pos”=>newList<int>(),“pea......
  • 【计算机算法设计与分析】最优子结构和贪心选择性质的证明
    最优子结构性质(反证法)计算某问题的最优解包含的计算该问题的子问题也是最优解。事实上,如果找到子问题的更优解,则可以替换当前子问题的解,得到一个比最优解更优的解,这是一个矛盾。贪心选择性质(数学归纳法)先设一个最优解(为所给定的总元素集合,且和均按照某种有利于算法贪心进行的顺序......
  • 古堡朝圣问题与椭圆的光学性质
    古堡朝圣问题是我初三时一个同学从一道与之几乎无关的初中数学题中提取出来给我说的.当时我不知道这个问题的名字,并且对于椭圆都没什么了解,只是想着能推出多少算多少,最后推出了一个似乎不能很好地解决该问题的方法.到了高中意外的发现居然可以由它推出椭圆的光学性质,便打算记......
  • 场景局部拥挤不应该造成整服都卡
    场景局部拥挤不应该造成整服都卡网游中经常出现的情况是,某个地图的局部人数众多,例如大型的群架,抢Boss,开活动等,因为玩家聚集,9屏广播量巨增,网关来不及处理,造成过载网关上的所有人都很卡。目前的对策是防止网关过载,多开网关,远远超过正常需要的数量。假设某个网关极限可处理100人集中......
  • 数学 多元函数微分学 多元函数的极值与最值
    一,无条件极值1.极值/极值点的定义:f(x,y)在某点的某邻域内值最大/最小,则称f(x,y)在这点取得极大值/极小值(极值指的是函数值),这一点(x0,y0)称为极值点。极大值/极小值统称为极值。2.多元函数取极值的必要条件:多元函数取得极值=>该点处偏导数若存在则必为0驻点的概念:偏导数等于零......
  • 操作系统(5.1.1)--常规存储管理方式的特征和局部性原理
    1.常规存储器管理方式的特征(1)一次性。即作业在运行前需一次性地全部装入内存。(2)驻留性。即作业装入内存后,便一直驻留在内存中,直至作业运行结束。由此可以看出,上述的一次性及驻留性,使许多在程序运行中不用或暂不用的程序(数据)占据了大量的内存空间,使得一些需要运行的作业无法装入......
  • java开发C语言编译器:jvm的return指令以及局部变量的操作
    jvm运行字节码时,代码的运行必须围绕两种数据结构,一种是堆栈,一种是队列,如果jvm执行某条指令时,该指令需要对数据进行操作,那么被操作的数据在指令执行前,必须要压倒堆栈上。如果堆栈上的数据需要暂时保持起来时,它就会被加载到局部变量队列上。java代码中,每个方法里面的局部变量包括函数......
  • 2373.矩阵中的局部最大值
    问题描述2373.矩阵中的局部最大值(Easy)给你一个大小为nxn的整数矩阵grid。生成一个大小为(n-2)x(n-2)的整数矩阵maxLocal,并满足:maxLocal[i][j]等于grid中以i+1行和j+1列为中心的3x3矩阵中的最大值。换句话说,我们希望找出grid中每个......
  • 84 局部变量 在get set等方法中 ;成员变量在属性中
    packagecom.fqs.demo061302;publicclassGirl{//属性//成员变量Stringname;privateintage;publicvoidsetAge(intage){//【局部变量】名称可以和上面的【成员变量】一样//赋值if(age<50&&age>18){this......