社区讨论
过不了大样例,求调
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 条回复,欢迎继续交流。
正在加载回复...