为啥这样不对?
查看原帖
为啥这样不对?
701387
xiaoliebao1115楼主2025/1/3 12:52
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define fi first
#define se second
const int nn=2e5+5,mm=nn<<2;
int n,q,a[nn],st1[nn],st2[nn],tp1,tp2,ans[nn];//st1 min st2 max
vector<pii> e[nn];
struct sgt{
	int l,r,mn,cnt,add,tg,sum;
};
sgt tree[mm];
inline void pushup(int o){
	tree[o].mn=min(tree[o<<1].mn,tree[o<<1|1].mn);
	tree[o].cnt=tree[o<<1].cnt*(tree[o<<1].mn==tree[o].mn)+tree[o<<1|1].cnt*(tree[o<<1|1].mn==tree[o].mn);
	tree[o].sum=tree[o<<1].sum+tree[o<<1|1].sum;
}
inline void build(int l,int r,int o){
	tree[o].l=l,tree[o].r=r;
	if(l==r){
		tree[o].mn=l,tree[o].cnt=1;
		return ;
	}
	int mid=(l+r)>>1;
	build(l,mid,o<<1),build(mid+1,r,o<<1|1);
	pushup(o);
}
inline void tagadd(int o,int v){tree[o].mn+=v;tree[o].add+=v;}
inline void tagtg(int o,int v){tree[o].sum+=v*tree[o].cnt;tree[o].tg+=v;}
inline void pushdown(int o){
	tagadd(o<<1,tree[o].add),tagadd(o<<1|1,tree[o].add);
	if(tree[o].mn==tree[o<<1].mn) tagtg(o<<1,tree[o].tg);// 为啥不能把这个tree[o].mn换成0
	if(tree[o].mn==tree[o<<1|1].mn) tagtg(o<<1|1,tree[o].tg);// 为啥不能把这个tree[o].mn换成0
//不是只有0的时候需要下传标记吗?
//交上去是错的。
	tree[o].tg=tree[o].add=0;
}
inline void update(int l,int r,int z,int o){
	if(tree[o].l==l&&tree[o].r==r){
		tagadd(o,z);
		return ; 
	}
	pushdown(o);
	int mid=(tree[o].l+tree[o].r)>>1;
	if(l<=mid) update(l,min(mid,r),z,o<<1);
	if(r>=mid+1) update(max(l,mid+1),r,z,o<<1|1);
	pushup(o);
} 
inline int query(int l,int r,int o){
	if(tree[o].l==l&&tree[o].r==r) return tree[o].sum;
	int mid=(tree[o].l+tree[o].r)>>1,ans=0;
	pushdown(o);
	if(l<=mid) ans+=query(l,min(mid,r),o<<1);
	if(r>=mid+1) ans+=query(max(l,mid+1),r,o<<1|1);
	return ans;
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	cin>>q;
	for(int i=1;i<=q;i++){
		int l,r;
		cin>>l>>r;
		e[r].pb(mp(l,i));
	}
	build(1,n,1);
	for(int i=1;i<=n;i++){
		while(tp1&&a[st1[tp1]]>a[i]){
			update(st1[tp1-1]+1,st1[tp1],a[st1[tp1]]-a[i],1);
			tp1--;
		}
		while(tp2&&a[st2[tp2]]<a[i]){
			update(st2[tp2-1]+1,st2[tp2],a[i]-a[st2[tp2]],1);
			tp2--;
		}
		st1[++tp1]=i,st2[++tp2]=i;
		tagadd(1,-1),tagtg(1,1);
		for(auto s:e[i]) ans[s.se]=query(s.fi,i,1);
	}
	for(int i=1;i<=q;i++) cout<<ans[i]<<endl;
	return 0;
} 
2025/1/3 12:52
加载中...