社区讨论
求助佬大
P1253扶苏的问题参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @m64ku3v1
- 此快照首次捕获于
- 2025/01/20 12:59 去年
- 此快照最后确认于
- 2025/11/04 11:13 4 个月前
50pts
WA6789 RE10
CPP#include<bits/stdc++.h>
#define int long long
#define INF -0x7fffffffffffffff
using std::cin;
using std::cout;
int n,m;
int b[1000086];
struct sb{
int max,sum,cha,tag;//cha->change
}a[1000086];
void build(int w,int l,int r){
a[w].cha=INF;
if(l==r){
a[w].sum=b[l];
a[w].max=b[l];
return;
}
int mid=(l+r)/2;
build(2*w,l,mid);
build(2*w+1,mid+1,r);
a[w].sum=a[2*w].sum+a[2*w+1].sum;
a[w].max=std::max(a[2*w].max,a[2*w+1].max);
}
void spread(int w,int l,int r){
if(a[w].cha!=INF){
int mid=(l+r)/2;
a[2*w].sum=a[w].cha*(mid-l+1);
a[2*w].cha=a[w].cha;
a[2*w].max=a[w].max;
a[2*w].tag=0;
a[2*w+1].sum=a[w].cha*(r-mid);
a[2*w+1].cha=a[w].cha;
a[2*w+1].max=a[w].max;
a[2*w+1].tag=0;
a[w].cha=0;
}
if(a[w].tag){
int mid=(l+r)/2;
a[2*w].sum+=a[w].tag*(mid-l+1);
a[2*w].tag+=a[w].tag;
a[2*w].max+=a[w].tag;
a[2*w+1].sum+=a[w].tag*(r-mid);
a[2*w+1].tag+=a[w].tag;
a[2*w+1].max+=a[w].tag;
a[w].tag=0;
}
}
void add(int w,int l,int r,int ql,int qr,int k){
if(ql<=l&&qr>=r){
a[w].tag+=k;
a[w].sum+=k*(r-l+1);
a[w].max+=k;
return;
}
spread(w,l,r);
int mid=(l+r)/2;
if(ql<=mid)add(2*w,l,mid,ql,qr,k);
if(qr>mid)add(2*w+1,mid+1,r,ql,qr,k);
a[w].sum=a[2*w].sum+a[2*w+1].sum;
a[w].max=std::max(a[2*w].max,a[2*w+1].max);
}
void change(int w,int l,int r,int ql,int qr,int k){
if(ql<=l&&qr>=r){
a[w].cha=k;
a[w].sum=k*(r-l+1);
a[w].tag=0;
a[w].max=k;
return;
}
spread(w,l,r);
int mid=(l+r)/2;
if(ql<=mid)change(2*w,l,mid,ql,qr,k);
if(qr>mid)change(2*w+1,mid+1,r,ql,qr,k);
a[w].sum=a[2*w].sum+a[2*w+1].sum;
a[w].max=std::max(a[2*w].max,a[2*w+1].max);
}
int getmax(int w,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r)return a[w].max;
spread(w,l,r);
int mid=(l+r)/2,ans=0;
if(ql<=mid)ans=std::max(ans,getmax(2*w,l,mid,ql,qr));
if(qr>mid)ans=std::max(ans,getmax(2*w+1,mid+1,r,ql,qr));
return ans;
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>b[i];
build(1,1,n);
while(m--){
int op,l,r,k;
cin>>op>>l>>r;
if(!(op-1)){
cin>>k;
change(1,1,n,l,r,k);
}
else if(!(op-2)){
cin>>k;
add(1,1,n,l,r,k);
}
else{
cout<<getmax(1,1,n,l,r)<<"\n";
}
// cout<<getmax(1,1,n,1,n)<<"----\n";
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...