AT_abc343_f的题解

(一)

F<E。

显然是线段树,虽然分块也能过。

每个线段树上的节点记录最大值,第二大值,最大值个数,第二大值个数。

合并操作注意值相等的情况。

(二)

AC 代码。

赛事写得有点乱。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q,a[400010];
struct node{
	int fival,fisum,seval,sesum;
}tree[1000010];
node merge(node x,node y){
	node t;
	t.fival=max(x.fival,y.fival);
	if(x.fival==y.fival){
		t.fisum=x.fisum+y.fisum;
		if(x.seval>y.seval)t.seval=x.seval,t.sesum=x.sesum;
		else if(x.seval==y.seval)t.seval=x.seval,t.sesum=x.sesum+y.sesum;
		else t.seval=y.seval,t.sesum=y.sesum;
	}
	else if(x.fival>y.fival){
		t.fisum=x.fisum;
		if(x.seval>y.fival)t.seval=x.seval,t.sesum=x.sesum;
		else if(x.seval==y.fival)t.seval=x.seval,t.sesum=x.sesum+y.fisum;
		else t.seval=y.fival,t.sesum=y.fisum;
	}
	else{
		t.fisum=y.fisum;
		if(y.seval>x.fival)t.seval=y.seval,t.sesum=y.sesum;
		else if(y.seval==x.fival)t.seval=y.seval,t.sesum=y.sesum+x.fisum;
		else t.seval=x.fival,t.sesum=x.fisum;
	}
	return t;
}
void build(int o,int l,int r){
	if(l==r){
		tree[o]=(node){a[l],1ll,-1ll,0};
		return;
	}
	int mid=(l+r)>>1;
	build(o*2,l,mid);
	build(o*2+1,mid+1,r);
	tree[o]=merge(tree[o*2],tree[o*2+1]);	
}
void update(int o,int l,int r,int pos,int val){
	if(l==r){
		tree[o]=(node){val,1ll,-1ll,0};
		return;
	}
	int mid=(l+r)>>1;
	if(pos<=mid)update(o*2,l,mid,pos,val);
	else update(o*2+1,mid+1,r,pos,val);
	tree[o]=merge(tree[o*2],tree[o*2+1]);
}
node query(int o,int l,int r,int L,int R){
	if(L<=l&&r<=R)return tree[o];
	node t={-1ll,0ll,-2ll,0ll};
	int mid=(l+r)>>1ll;
	if(L<=mid)t=merge(t,query(o*2,l,mid,L,R));
	if(R>mid)t=merge(t,query(o*2+1ll,mid+1ll,r,L,R));
	return t;
}
signed main(){
	scanf("%lld%lld",&n,&q);
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
	build(1,1,n);
	while(q--){
		int op,x,y;
		scanf("%lld%lld%lld",&op,&x,&y);
		if(op==1){
			update(1,1,n,x,y);
		}
		else{
			printf("%lld\n",query(1,1,n,x,y).sesum);
		}
	}
	return 0;
}
posted @   Jerry_heng  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示