全部RE,为什么呢
查看原帖
全部RE,为什么呢
765446
MichaelWong楼主2023/5/12 13:53
#include<bits/stdc++.h>
#define ll long long
const int N=1e5+5;
int n,q,a[N],diff[N];
template<typename _Tp> _Tp min(_Tp a,_Tp b,_Tp c) {_Tp &tmp=a<b?a:b; return tmp<c?tmp:c;}
struct node {
	int L,R,lval,rval,lazy,s[4];//[l,r],[l,r),(l,r],(l,r)
	node operator+ (node x) {
		node ans;
		ans.lval=lval,ans.rval=x.rval;
		ans.s[0]=min(s[0]+x.s[0]-(rval==x.lval),s[1]+x.s[0],s[0]+x.s[2]);
		ans.s[1]=min(s[0]+x.s[1]-(rval==x.lval),s[1]+x.s[1],s[0]+x.s[3]);
		ans.s[2]=min(s[2]+x.s[0]-(rval==x.lval),s[3]+x.s[0],s[2]+x.s[2]);
		ans.s[3]=min(s[2]+x.s[1]-(rval==x.lval),s[3]+x.s[1],s[2]+x.s[3]);
		return ans;
	}
};
class segment_tree {
	#define ls (x<<1)
	#define rs (x<<1|1)
	node nd[N*4];
	inline void pushup(int x) {nd[x]=nd[ls]+nd[rs];}
	inline void pushdown(int x) {
		if(!nd[x].lazy) return;
		nd[ls].lazy+=nd[x].lazy,nd[rs].lazy+=nd[x].lazy;
		nd[ls].lval+=nd[x].lazy,nd[ls].rval+=nd[x].lazy;
		nd[rs].lval+=nd[x].lazy,nd[rs].rval+=nd[x].lazy;
		nd[x].lazy=0;
	}
	
public:	
	segment_tree(int n) {build(1,n);}
	inline void build(int l,int r,const int x=1) {
		nd[x].L=l,nd[x].R=r;
		if(l==r) {nd[x].lval=nd[x].rval=diff[l],nd[x].s[0]=nd[x].s[1]=nd[x].s[2]=1,nd[x].s[3]=0; return;}
		int mid=(l+r)>>1;
		build(l,mid,ls),build(mid+1,r,rs);
		pushup(x);
	}
	inline void change(int l,int r,int k,const int x=1) {
		if(l==nd[x].L && r==nd[x].R) {nd[x].lazy+=k,nd[x].lval+=k,nd[x].rval+=k; return;}
		int mid=(nd[x].L+nd[x].R)>>1; pushdown(x);
		if(r<=mid) change(l,r,k,ls);
		else if(l>=mid+1) change(l,r,k,rs);
		else change(l,mid,k,ls),change(mid+1,r,k,rs);
		pushup(x);
	}
	inline node query(int l,int r,const int x=1) {
		if(l==nd[x].L && r==nd[x].R) {return nd[x];}
		int mid=(nd[x].L+nd[x].R)>>1; pushdown(x);
		if(r<=mid) return query(l,r,ls);
		else if(l>=mid+1) return query(l,r,rs);
		else return query(l,mid,ls)+query(mid+1,r,rs);
	}
};
int main() {
//	std::ios::sync_with_stdio(0);
//	std::cin.tie(0);std::cout.tie(0);
	std::cin>>n;
	segment_tree sgt {n};
	for(int i=1;i<=n;++i) std::cin>>a[i];
	for(int i=1;i<=n;++i) diff[i]=a[i]-a[i-1];
	std::cin>>q;
	while(q--) {
		char opt;
		std::cin>>opt;
		if(opt=='A') {
			int s,t,a,b;
			std::cin>>s>>t>>a>>b;
			sgt.change(s,s,a),sgt.change(s+1,t,b);
		}
		else {
			int s,t;
			std::cin>>s>>t;
			node ans=sgt.query(s,t);
			std::cout<<ans.s[2]<<'\n';
		}
	}
	return 0;
}

好像编译完就RE了,都没来得及读数据,怎么回事呢

2023/5/12 13:53
加载中...