神秘RE了,求调
查看原帖
神秘RE了,求调
794701
wo_hen_la楼主2024/7/29 16:46

只能过样例

#include <bits/stdc++.h>
using namespace std;

#define sp putchar(' ')
#define en putchar('\n')
#define pb push_back
#define int long long
#define P 998244353
#define HP 1000000000000002097
#define N (int)2e5+5

int read(){ char ch=getchar();int x=0,f=1;while(ch>'9' || ch<'0'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return x*f; }
void print(int x){ if(x<0) putchar('-'),x=-x;if(x>9)print(x/10);putchar(x%10+'0'); }

int n,q;
int a[N];
struct node
{
	int l,r,mx1,mx2,s1,s2;//严格最大,次大值,出现次数 
}tr[N*4];

void up(int k)
{
	int l=k<<1,r=k<<1|1;
	if(tr[l].mx1>tr[r].mx1){
		tr[k].mx1=tr[l].mx1;
		tr[k].s1=tr[l].s1;
		if(tr[l].mx2>tr[r].mx1){
			tr[k].mx2=tr[l].mx2;
			tr[k].s2=tr[l].s2;
		}
		else if(tr[l].mx2==tr[r].mx1){
			tr[k].mx2=tr[l].mx2;
			tr[k].s2=tr[l].s2+tr[r].s1;
		}
		else{
			tr[k].mx2=tr[r].mx1;
			tr[k].s2=tr[r].s1;
		}
	}
	else if(tr[l].mx1==tr[r].mx1){
		tr[k].mx1=tr[l].mx1;
		tr[k].s1=tr[l].s1+tr[r].s1;
		if(tr[l].mx2>tr[r].mx2){
			tr[k].mx2=tr[l].mx2;
			tr[k].s2=tr[l].s2;
		}
		else if(tr[l].mx2==tr[r].mx2){
			tr[k].mx2=tr[l].mx2;
			tr[k].s2=tr[l].s2+tr[r].s2;
		}
		else{
			tr[k].mx2=tr[r].mx2;
			tr[k].s2=tr[r].s2;
		}
	}
	else{
		tr[k].mx1=tr[r].mx1;
		tr[k].s1=tr[r].s1;
		if(tr[r].mx2>tr[l].mx1){
			tr[k].mx2=tr[r].mx2;
			tr[k].s2=tr[r].s2;
		}
		else if(tr[r].mx2==tr[l].mx1){
			tr[k].mx2=tr[l].mx1;
			tr[k].s2=tr[l].s1+tr[r].s2;
		}
		else{
			tr[k].mx2=tr[l].mx1;
			tr[k].s2=tr[l].s1;
		}
	}
}
void build(int k,int l,int r)
{
	tr[k]={l,r,0,0,0,0};
	if(l==r){
		tr[k].mx1=a[l];
		tr[k].s1=1;
		return;
	}	
	int mid=(l+r)>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	up(k);
} 
void modify(int k,int l,int r,int val)
{
	if(tr[k].l>=l && tr[k].r<=r){
		tr[k].mx1=val;
		tr[k].s1=1;
		return;
	}
	if(tr[k<<1].r>=l) modify(k<<1,l,r,val); 
	if(tr[k<<1|1].l<=r) modify(k<<1|1,l,r,val);
	up(k);
}
node query(int k,int l,int r)
{
	if(tr[k].l>=l && tr[k].r<=r){
		return tr[k];
	}
	node trl,trr,tre;
	if(tr[k<<1].r>=l) trl=query(k<<1,l,r);
	if(tr[k<<1|1].l<=r) trr=query(k<<1|1,l,r);
	if(tr[k<<1].r>=l && tr[k<<1|1].l<=r){
		if(trl.mx1>trr.mx1){
			tre.mx1=trl.mx1;
			tre.s1=trl.s1;
			if(trl.mx2>trr.mx1){
				tre.mx2=trl.mx2;
				tre.s2=trl.s2;
			}
			else if(trl.mx2==trr.mx1){
				tre.mx2=trl.mx2;
				tre.s2=trl.s2+trr.s1;
			}
			else{
				tre.mx2=trr.mx1;
				tre.s2=trr.s1;
			}
		}
		else if(trl.mx1==trr.mx1){
			tre.mx1=trl.mx1;
			tre.s1=trl.s1+trr.s1;
			if(trl.mx2>trr.mx2){
				tre.mx2=trl.mx2;
				tre.s2=trl.s2;
			}
			else if(trl.mx2==trr.mx2){
				tre.mx2=trl.mx2;
				tre.s2=trl.s2+trr.s2;
			}
			else{
				tre.mx2=trr.mx2;
				tre.s2=trr.s2;
			}
		}
		else{
			tre.mx1=trr.mx1;
			tre.s1=trr.s1;
			if(trr.mx2>trl.mx1){
				tre.mx2=trr.mx2;
				tre.s2=trr.s2;
			}
			else if(trr.mx2==trl.mx1){
				tre.mx2=trl.mx1;
				tre.s2=trl.s1+trr.s2;
			}
			else{
				tre.mx2=trl.mx1;
				tre.s2=trl.s1;
			}
		}
		return tre;
	}
	else if(tr[k<<1].r>=l) return trl;
	else if(tr[k<<1|1].l<=r) return trr;
}
main()
{
	ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	while(q--){
		int op,x,y;
		cin>>op>>x>>y;
		if(op==1){
			modify(1,x,x,y);
		}
		else{
			node ans=query(1,x,y);
			cout<<ans.s2<<"\n";
		}
	}
	return 0;
}

2024/7/29 16:46
加载中...