求调ABCF题
  • 板块学术版
  • 楼主Enoch006
  • 当前回复8
  • 已保存回复8
  • 发布时间2024/3/2 21:40
  • 上次更新2024/3/3 08:30:39
查看原帖
求调ABCF题
538683
Enoch006楼主2024/3/2 21:40

线段树没过,怎么回事呢?

#include <bits/stdc++.h>
#define int long long
#define maxm 2000005
#define maxn 1005
#define inf 0x3f3f3f3f3f3f3f
using namespace std;
int n,m,sum;
int a[maxm];
struct Seg{
	int l,r,mxf,cntf,mxs,cnts;
}t[maxm],ans;
#define lc 2*k
#define rc 2*k+1
void Pushup(int k){
	t[k].mxf=max(t[lc].mxf,t[rc].mxf);
	if(t[lc].mxf!=t[rc].mxf)t[k].mxs=min(t[lc].mxf,t[rc].mxf);
	else t[k].mxs=max(t[lc].mxs,t[rc].mxs);
	if(t[lc].mxf==t[rc].mxf)t[k].cntf=t[lc].cntf+t[rc].cntf;
	else if(t[lc].mxf==t[k].mxf)t[k].cntf=t[lc].cntf;
	else if(t[rc].mxf==t[k].mxf)t[k].cntf=t[rc].cntf;
	t[k].cnts=0;
	if(t[k].mxs!=-1){
		if(t[lc].mxf==t[k].mxs)t[k].cnts+=t[lc].cntf;
		if(t[rc].mxf==t[k].mxs)t[k].cnts+=t[rc].cntf;
		if(t[rc].mxs==t[k].mxs)t[k].cnts+=t[rc].cnts;
		if(t[lc].mxs==t[k].mxs)t[k].cnts+=t[lc].cnts;
	}
}
void Build(int k,int l,int r){
	t[k]=(Seg){l,r,0,0,-1,0};
	if(l==r){
		t[k].mxf=a[l];
		t[k].cntf=1;
		return;
	}
	int mid=l+r>>1;
	Build(lc,l,mid);
	Build(rc,mid+1,r);
	Pushup(k);
}
void Add(int k,int x,int z){
	if(t[k].l>x||t[k].r<x)return ;
	if(t[k].l==t[k].r){
		t[k].cntf=1;
		t[k].mxf=z;
		t[k].mxs=-1;
		t[k].cnts=0;
		return;
	}
	Add(lc,x,z);
	Add(rc,x,z);	
	Pushup(k);
}
void AskS(int k,int l,int r){
	if(t[k].l>r||t[k].r<l)return ;
	if(t[k].l>=l&&t[k].r<=r){
		if(ans.mxf<t[k].mxf){
			ans.mxs=ans.mxf;
			ans.mxf=t[k].mxf;
			if(ans.mxs<t[k].mxs)ans.mxs=t[k].mxs;
		}
		else if(ans.mxs<t[k].mxf&&t[k].mxf!=ans.mxf)ans.mxs=t[k].mxf;
		else if(ans.mxs<t[k].mxs&&t[k].mxs!=ans.mxf)ans.mxs=t[k].mxs;
		return;
	}
	AskS(lc,l,r);
	AskS(rc,l,r);	
}
void Ask(int k,int l,int r,int x){
	//cout<<t[k].l<<" "<<t[k].r<<" "<<t[k].mxf<<" "<<t[k].mxs<<" "<<t[k].cntf<<"\n";
	if(t[k].l>r||t[k].r<l||t[k].mxf<x)return ;
	if(t[k].l>=l&&t[k].r<=r&&t[k].mxf==x){
		sum+=t[k].cntf;
		return;
	}
	if(t[k].l>=l&&t[k].r<=r&&t[k].mxs==x){
		sum+=t[k].cnts;
		return;
	}	
	if(t[k].l==t[k].r)return;
	Ask(lc,l,r,x);
	Ask(rc,l,r,x);	
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	Build(1,1,n);
	for(int i=1;i<=m;i++){
		int op,x,y,z;
		cin>>op>>x>>y;
		if(op==1)Add(1,x,y);
		else{
			sum=0;
			ans=(Seg){0,0,-1,-1,-1,-1};
			AskS(1,x,y);
			if(ans.mxs==-1){
				cout<<"0\n";
				continue;
			} 
			//cout<<"second"<<ans.mxs<<"\n";
			Ask(1,x,y,ans.mxs);
			cout<<sum<<"\n";
		}
	}
    return 0;
}
2024/3/2 21:40
加载中...