社区讨论

过不了大样例,求调

P8868[NOIP2022] 比赛参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mi0vdt2u
此快照首次捕获于
2025/11/16 06:40
3 个月前
此快照最后确认于
2025/11/17 09:13
3 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define repn(x) rep(x,1,n)
#define pii pair<int,int>
#define fir first
#define lc (p<<1)
#define rc (p<<1|1)
#define sec second
const int N=2.5e5+7;
int T,n,q,a[N],la[N],lb[N],b[N];
ull ans[N];
vector<pii> Q[N];
struct node{
	int l,r;
	ull sa,sb,sab,sh;
	ull la,lb,lt;
}tr[N*4];
void build(int p,int l,int r){
	tr[p]={l,r,0,0,0,0,0,0,0};
	if(l==r) return;
	int mid=l+r>>1;
	build(lc,l,mid);
	build(rc,mid+1,r);
}
void apply_a(int p,ull v){
	if(v==0) return;
	tr[p].la=v;
	tr[p].sa=v*(tr[p].r-tr[p].l+1);
	tr[p].sab=v*tr[p].sb;
}
void apply_b(int p,ull v){
	if(!v) return;
	tr[p].lb=v;
	tr[p].sb=v*(tr[p].r-tr[p].l+1);
	tr[p].sab=v*tr[p].sa;
}
void apply_t(int p,ull t){
	if(!t) return;
	tr[p].sh+=t*tr[p].sab;
	tr[p].lt+=t;
}
void pushdown(int p){
	if(tr[p].l==tr[p].r) return;
	if(tr[p].lt){
		apply_t(lc,tr[p].lt);
		apply_t(rc,tr[p].lt);
		tr[p].lt=0;
	}
	if(tr[p].la){
		apply_a(lc,tr[p].la);
		apply_a(rc,tr[p].la);
		tr[p].la=0;
	}
	if(tr[p].lb){
		apply_b(lc,tr[p].lb);
		apply_b(rc,tr[p].lb);
		tr[p].lb=0;
	}
}
void pushup(int p){
	tr[p].sa=tr[lc].sa+tr[rc].sa;
	tr[p].sb=tr[lc].sb+tr[rc].sb;
	tr[p].sh=tr[lc].sh+tr[rc].sh;
	tr[p].sab=tr[lc].sab+tr[rc].sab;
}
void upd_a(int p,int l,int r,ull v){
	if(l<=tr[p].l&&tr[p].r<=r){
		apply_a(p,v);
		return;
	}
	pushdown(p);
	int mid=(tr[p].l+tr[p].r)>>1;
	if(l<=mid) upd_a(lc,l,r,v);
	if(r>mid) upd_a(rc,l,r,v);
	pushup(p);
}
void upd_b(int p,int l,int r,ull v){
	if(l<=tr[p].l&&tr[p].r<=r){
		apply_b(p,v);
		return;
	}
	pushdown(p);
	int mid=(tr[p].l+tr[p].r)>>1;
	if(l<=mid) upd_b(lc,l,r,v);
	if(r>mid) upd_b(rc,l,r,v);
	pushup(p);
}
ull query(int p,int l,int r){
	if(l<=tr[p].l&&tr[p].r<=r) return tr[p].sh;
	pushdown(p);
	int mid=(tr[p].l+tr[p].r)>>1;
	ull res=0;
	if(l<=mid) res+=query(lc,l,r);
	if(r>mid) res+=query(rc,l,r);
	return res;
}
void init(){
	stack<int> s;
	rep(i,1,n){
		while(!s.empty()&&a[s.top()]<a[i]) s.pop();
		la[i]=s.empty()?0:s.top();
		s.push(i);
	}
	while(!s.empty()) s.pop();
	rep(i,1,n){
		while(!s.empty()&&b[s.top()]<b[i]) s.pop();
		lb[i]=s.empty()?0:s.top();
		s.push(i);
	}
}
int main()
{
	freopen("match3.in","r",stdin);
	freopen("match.out","w",stdout);
	cin>>T>>n;
	repn(i) cin>>a[i];
	repn(i) cin>>b[i];
	cin>>q;
	rep(i,1,q){
		int l,r;
		cin>>l>>r;
		Q[r].push_back({l,i});
	}
	init();
	build(1,1,n);
	rep(r,1,n){
		upd_a(1,la[r]+1,r,a[r]);
		upd_b(1,lb[r]+1,r,b[r]);
		apply_t(1,1);
		for(auto v:Q[r]){
			ans[v.sec]=query(1,v.fir,r);
		}
	}
	rep(i,1,q){
		cout<<ans[i]<<"\n";
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...