[cf] 1473 D. Program
阿新 • • 發佈:2021-01-20
題目
給一組長為
n
n
n的數列,輸入
m
m
m個修改
l
、
r
l、r
l、r,每次計算除開
l
、
r
l、r
l、r中的數,其他數的最大字首和-最小字首和+1
題目連結:http://codeforces.com/contest/1473/problem/D
思路
p
r
e
pre
pre陣列記錄字首和
p
m
a
x
、
p
m
i
n
pmax、pmin
pmax、pmin分別記錄字首最大最小
u
m
a
x
、
u
m
i
n
umax、umin
umax、umin分別記錄從i開始字尾最大最小
除開
l
、
r
l、r
l、r的最大值為
m
a
x
(
p
m
a
x
[
l
−
1
]
,
p
r
e
[
l
−
1
]
+
u
m
a
x
[
r
+
1
]
>
0
?
u
m
a
x
[
r
+
1
]
:
0
)
max(pmax[l-1],pre[l-1]+umax[r+1]>0?umax[r+1]:0)
max(pmax[l−1],pre[l−1]+umax[r+1]>0?umax[r+1]:0)
最小值一樣的
程式碼
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cctype>
#include<ctime>
#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<iomanip>
#include<list>
#include<bitset>
#include<sstream>
#include<fstream>
#include<complex>
#include<algorithm>
#if __cplusplus >= 201103L
#include <unordered_map>
#include <unordered_set>
#endif
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
int pre[200010],pmax[200010],pmin[200010],umax[200010],umin[200010];
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
string s;
cin>>s;
pre[0]=(s[0]=='+'?1:-1);
pmax[0]=(s[0]=='+'?1:0);
pmin[0]=(s[0]=='-'?-1:0);
for(int i=1;i<n;i++){
pre[i]=pre[i-1]+(s[i]=='+'?1:-1);
pmax[i]=max(pmax[i-1],pre[i]);
pmin[i]=min(pmin[i-1],pre[i]);
}
umax[n]=0;
umin[n]=0;
for(int i=n-1;i>=0;i--){
umax[i]=max(0,umax[i+1]+(s[i]=='+'?1:-1));
umin[i]=min(0,umin[i+1]+(s[i]=='+'?1:-1));
}
for(int i=1;i<=m;i++){
int l,r;
cin>>l>>r;
//r++;
l-=2;
// cout<<pmax[l]<<" "<<pre[l]<<" "<<(umax[r]>0?umax[r]:0)<<" "<<pmin[l]<<" "<<pre[l]<<" "<<(umin[r]<0?umin[r]:0)<<endl;
cout<<(1+max(pmax[l],pre[l]+(umax[r]>0?umax[r]:0))-min(pmin[l],pre[l]+(umin[r]<0?umin[r]:0)))<<endl;
}
}
return 0;
}