我都删成这样了,还是RE
查看原帖
我都删成这样了,还是RE
794701
wo_hen_la楼主2024/7/30 12:44

主函数部分只剩build了,但RE

// LUOGU_RID: 169289318
#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 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)
{
	if(l==r){
		tr[k].mx1=a[l];
		tr[k].s1=1;
		tr[k].mx2=0;
		tr[k].s2=-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 ql,int qr,int val)
{
	if(l>=ql && r<=qr){
		tr[k].mx1=val;
		tr[k].s1=1;
		return;
	}
	int mid=(l+r)>>1;
	if(ql<=mid) modify(k<<1,l,mid,ql,qr,val); 
	if(qr>mid) modify(k<<1|1,mid+1,r,ql,qr,val);
	up(k);
}
node query(int k,int l,int r,int ql,int qr)
{
	if(l>=ql && r<=qr){
		return tr[k];
	}
	node trl,trr,tre;
	int mid=(l+r)>>1;
	if(ql<=mid) trl=query(k<<1,l,mid,ql,qr);
	if(qr>mid) trr=query(k<<1|1,mid+1,r,ql,qr);
	if(ql<=mid && qr>mid){
		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(ql<=mid) return trl;
	else 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,1,n,x,x,y);
		}
		else{
			//node ans=query(1,1,n,x,y);
			//cout<<ans.s2<<"\n";
		}
	}
	return 0;
}

2024/7/30 12:44
加载中...