社区讨论
前五个对,6-9错,10超时,求调
P1253扶苏的问题参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mhjs4ig5
- 此快照首次捕获于
- 2025/11/04 07:36 4 个月前
- 此快照最后确认于
- 2025/11/04 07:36 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf -1145141919810
struct node{
ll date,lazy1,lazy2 = inf;
};
node tree[4010000];
ll date[1011110];
int n,m;
void creattree(int left,int right,int pos){
if(left == right){
tree[pos].date = date[left];
return;
}
int mid = (left + right) / 2;
creattree(left , mid, pos*2);
creattree(mid+1, right, pos*2+1);
tree[pos].date = max(tree[pos*2].date, tree[pos*2+1].date);
}
void pushdown(int pos){
if(tree[pos].lazy1 || tree[pos].lazy2 != inf){
if(tree[pos].lazy2 != inf){
tree[pos*2].date = tree[pos].lazy1 + tree[pos].lazy2;
tree[pos*2+1].date = tree[pos].lazy1 + tree[pos].lazy2;
tree[pos*2].lazy1 = tree[pos].lazy1;
tree[pos*2].lazy2 = tree[pos].lazy2;
tree[pos*2+1].lazy1 = tree[pos].lazy1;
tree[pos*2+1].lazy2 = tree[pos].lazy2;
tree[pos].lazy1 = 0;
tree[pos].lazy2 = inf;
}else if(tree[pos].lazy1){
tree[pos*2+1].date += tree[pos].lazy1;
tree[pos*2].date += tree[pos].lazy1;
tree[pos*2].lazy1 +=tree[pos].lazy1;
tree[pos*2+1].lazy1 += tree[pos].lazy1;
tree[pos].lazy1 = 0;
}
}
}
ll findmax(int left,int right,int l,int r,int pos){
if(left > r || right < l) return INT_MIN;
if(left >= l && right <= r){
return tree[pos].date;
}
int mid = (left + right) / 2;
pushdown(pos);
ll leftmax = findmax(left , mid, l , r, pos*2);
ll rightmax = findmax(mid+1 , right , l , r ,pos*2+1);
return max(leftmax , rightmax);
}
void updateranger1(int left, int right , int l , int r , int pos, ll lazy1){
if(left > r || right < l) return ;
if(left >= l && right <= r){
tree[pos].date += lazy1;
tree[pos].lazy1 += lazy1;
return;
}
int mid = (left + right) / 2;
pushdown(pos);
updateranger1(left, mid, l , r, pos*2 , lazy1);
updateranger1(mid+1, right, l , r, pos*2+1 , lazy1);
tree[pos].date = max(tree[pos*2].date , tree[pos*2+1].date);
}
void updateranger2(int left, int right , int l , int r , int pos, ll lazy2){
if(left > r || right < l) return ;
if(left >= l && right <= r){
tree[pos].date = lazy2;
tree[pos].lazy1 = 0;
tree[pos].lazy2 = lazy2;
return;
}
int mid = (left + right) / 2;
pushdown(pos);
updateranger2(left, mid, l , r, pos*2 , lazy2);
updateranger2(mid+1, right, l , r, pos*2+1 , lazy2);
tree[pos].date = max(tree[pos*2].date , tree[pos*2+1].date);
}
int main(){
cin >> n >> m;
for(int i=1; i<=n ; i++){
cin >> date[i];
}
creattree(1,n,1);
while(m--){
int a;
cin >> a;
if(a == 1){
int b,c;
ll d;
cin >> b >> c >> d;
updateranger2(1,n,b,c,1,d);
}else if(a == 2){
int b,c;
ll d;
cin >> b >> c >> d;
updateranger1(1,n,b,c,1,d);
}else{
int b,c;
cin >> b >> c ;
cout << findmax(1,n,b,c,1) << "\n";
}
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...