首页 > 其他分享 >P1110

P1110

时间:2024-09-12 19:17:19浏览次数:1  
标签:P1110 ch int ed pos srt delta

delicious

#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
multiset<int>delta,full;
int st[500100],ed[500100];
int srt=inf;
int n,m;
void update_srt(int x){
	multiset<int>::iteratorit=full.lower_bound(x);
	intnw=*it-x;
	--it;
	nw=min(nw,x-*it);
	srt=min(srt,nw);
	full.insert(x);
}
void replac(int pos,int x){
	delta.insert(abs(x-ed[pos]));
	if(pos!=n) delta.erase(delta.find(abs(st[pos+1]-ed[pos]))), delta.insert(abs(st[pos+1]-x));
	ed[pos]=x;
}
int getint(){
	intret=0,fix=1;
	charch=getchar();
	while(!isdigit(ch)){
		if(ch=='-')fix=-1;
		ch=getchar();
	}
	while(isdigit(ch))ret=ret*10+(ch-'0'),ch=getchar();
	return ret*fix;
}
int main(){
	static char str[1<<5];
	n=getint(),m=getint();
	for(int i=1;i<=n;i++)st[i]=ed[i]=getint();
	full.insert(inf),full.insert(-inf);
	for(int i=1;i<n;i++)delta.insert(abs(st[i+1]-ed[i]));
	for(int i=1;i<=n;i++)update_srt(st[i]);
	for(int i=1,pos,x;i<=m;i++){
		scanf("%s",str);
		if(*str=='I'){
			pos=getint(),x=getint();
			update_srt(x);
			replac(pos,x);
		}else if(str[4]=='S')printf("%d\n",srt);
		else printf("%d\n",*delta.begin());
	}
	return 0;
}

标签:P1110,ch,int,ed,pos,srt,delta
From: https://www.cnblogs.com/zan-mei-tai-yang/p/18410851

相关文章

  • P1110
    delicious#include<bits/stdc++.h>usingnamespacestd;constintinf=0x3f3f3f3f;multiset<int>delta,full;intst[500100],ed[500100];intsrt=inf;intn,m;voidupdate_srt(intx){ multiset<int>::iteratorit=full.lower_bound(x); intnw=*it......
  • Luogu P1110 [ZJOI2007] 报表统计
    题目描述给定一个长度为\(n\)的整数序列\(a\),有以下三种操作:INSERTix:\(i\)位置后面添加一个新元素\(x\),下一个元素挂在这个元素后面。MIN_GAP:查询相邻元素差值的最小值。MIN_SORT_GAP:查询元素中最接近的两个元素的差值。题目解析平衡树经典题目。建立\(2\)棵平衡......
  • P1110 [ZJOI2007] 报表统计 题解
    考察点:STL的熟练运用。记:\(l_i\)表示序列中不超过\(a_i\)的最大数,\(r_i\)表示序列中超过\(a_i\)的最小数。开一个vectorinsert[N]存储\(a_i\)后面插入的所有数字。首先,我们使用一个multisets1来存储相邻元素的差的绝对值,然后再开一个multisets2来存储当前出......
  • P1110 (平衡树实现)
    难度1还是比较板的一道题,考的是对平衡树各功能的灵活使用。首先看要求的操作,发现操作三在每次插入时求下前驱后继即可,因为如果答案不是有这个更新的,那么这个答案必定在之前计算过,所以能保证正确性。然后看操作二,发现在每次插入时,有一个原来的差不能再对答案做出贡献,并且有两个新......
  • P1110题解
    首先我们考虑第一种情况怎么处理,显然我们可以给原数列的每个数开一个\(vector\),每加一个数丢到对应的\(vector\)后面就行了。再看第二个操作,你考虑新加一个数会有什么影响。原来的两个\(vector\)是这样的:新加一个数进去以后:原来的\(|y-x|\)要删除,新增了\(|x-z|\)和\(|z-y|\)......