社区讨论
10pts求条玄关
P3246[HNOI2016] 序列参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m68223xe
- 此快照首次捕获于
- 2025/01/22 23:24 去年
- 此快照最后确认于
- 2025/11/04 10:59 4 个月前
rt,只过了#3,怀疑整个实现都有问题但是注意到样例并不能给我拍出来,写的线段树,目前的小数据对拍均以失败告终,拍不出哪里有问题但就是只有10pts
CPP#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100050;
int a[N],aft[N];
struct que{
int l,r,id;
ll ans;
};
que q[N];
bool cmp(que x,que y){
if(x.r==y.r)return x.l<y.l;
return x.r<y.r;
}
bool bk(que x,que y){
return x.id<y.id;
}
struct sgt{
int l,r;
ll num,hdel;//hdel为历史和与当前版本的差值,hsum=hdel+t*num
ll tg;
};
sgt s[N*4];
void pup(int tt){
s[tt].num=s[tt*2].num+s[tt*2+1].num;
s[tt].hdel=s[tt*2].hdel+s[tt*2+1].hdel;
return ;
}
void pdown(int tt,int t){
if(s[tt].tg==0)return ;
s[tt*2].tg+=s[tt].tg;
s[tt*2+1].tg+=s[tt].tg;
ll del1,del2;
del1=s[tt].tg*(s[tt*2].r-s[tt*2].l+1)-s[tt*2].num;
s[tt*2].num+=del1;
s[tt*2].hdel-=(ll)(t-1)*del1;
del2=s[tt].tg*(s[tt*2+1].r-s[tt*2+1].l+1)-s[tt*2+1].num;
s[tt*2+1].num+=del2;
s[tt*2+1].hdel-=(ll)(t-1)*del2;
s[tt].tg=0;
return ;
}
void build(int l,int r,int tt){
s[tt].l=l,s[tt].r=r;
if(l==r)return ;
int mid=(l+r)/2;
build(l,mid,tt*2);
build(mid+1,r,tt*2+1);
pup(tt);
return ;
}
void cov(int l,int r,int tt,int k,int t){
if(l<=s[tt].l&&s[tt].r<=r){
ll del=(ll)k*(s[tt].r-s[tt].l+1)-s[tt].num;
s[tt].num+=del;
s[tt].hdel-=(ll)(t-1)*del;
s[tt].tg=k;
return ;
}
pdown(tt,t);
int mid=(s[tt].l+s[tt].r)/2;
if(l<=mid)cov(l,r,tt*2,k,t);
if(mid<r)cov(l,r,tt*2+1,k,t);
pup(tt);
return ;
}
ll ask_num(int l,int r,int tt,int t){
if(l<=s[tt].l&&s[tt].r<=r)return s[tt].num;
pdown(tt,t);
int mid=(s[tt].l+s[tt].r)/2;
ll ans=0;
if(l<=mid)ans+=ask_num(l,r,tt*2,t);
if(mid<r)ans+=ask_num(l,r,tt*2+1,t);
return ans;
}
ll ask_hdel(int l,int r,int tt,int t){
if(l<=s[tt].l&&s[tt].r<=r)return s[tt].hdel;
pdown(tt,t);
int mid=(s[tt].l+s[tt].r)/2;
ll ans=0;
if(l<=mid)ans+=ask_hdel(l,r,tt*2,t);
if(mid<r)ans+=ask_hdel(l,r,tt*2+1,t);
return ans;
}
stack<int>st;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
build(1,n,1);
for(int i=1;i<=n;i++){
while(st.size()&&a[st.top()]>a[i])st.pop();
if(st.size())aft[i]=st.top()+1;
else aft[i]=1;
st.push(i);
}
for(int i=1;i<=m;i++){
scanf("%d%d",&q[i].l,&q[i].r);
q[i].id=i,q[i].ans=0;
}
sort(q+1,q+m+1,cmp);
int tp=1;
for(int i=1;i<=n;i++){
cov(aft[i],i,1,a[i],i);
while(q[tp].r==i){
q[tp].ans=(ll)i*ask_num(q[tp].l,q[tp].r,1,i)+ask_hdel(q[tp].l,q[tp].r,1,i);
tp++;
}
int pjsk=ask_num(1,1,1,i);
}
sort(q+1,q+m+1,bk);
for(int i=1;i<=m;i++)printf("%lld\n",q[i].ans);
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...