1. 程式人生 > 其它 >[cf] 1473 D. Program

[cf] 1473 D. Program

題目

給一組長為 n n n的數列,輸入 m m m個修改 l 、 r l、r lr,每次計算除開 l 、 r l、r lr中的數,其他數的最大字首和-最小字首和+1
題目連結:http://codeforces.com/contest/1473/problem/D

思路

p r e pre pre陣列記錄字首和
p m a x 、 p m i n pmax、pmin pmaxpmin分別記錄字首最大最小
u m a x 、 u m i n umax、umin umaxumin分別記錄從i開始字尾最大最小
除開 l 、 r l、r lr的最大值為 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[l1],pre[l1]+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; }