1. 程式人生 > 其它 >Educational Codeforces Round 102 (Rated for Div. 2) D題 Program

Educational Codeforces Round 102 (Rated for Div. 2) D題 Program

技術標籤:codeforcesACM-ICPC演算法

這題就是把加號抽象成1,減號抽象成-1,記做陣列a(1~n標號),然後求出陣列a的字首和陣列為s。(s[0] = 0)
然後對於區間[l,r],答案就是然後分別在字首和陣列s上對區間[0,l-1],[r+1,n]查詢最小值,最大值,分別記為minl1,maxl1,minl2,maxl2。那麼此時的答案就是 max(maxl1,maxl2)-min(minl1,minl2)+1。
AC原始碼如下:

//Dlove's template
#include <iostream>
#include <algorithm>
#include
<string>
#include <cstdio> #include <cmath> #include <cstdlib> #include <cstring> #include <ctime> #include <map> #include <queue> #include <set> #include <stack> #include <vector> #define R register #define ll long long #define ull unsigned long long
#define db double #define ld long double #define Ls root << 1 #define Rs Ls | 1 #define sqr(_x) ((_x) * (_x)) #define Cmax(_a, _b) ((_a) < (_b) ? (_a) = (_b), 1 : 0) #define Cmin(_a, _b) ((_a) > (_b) ? (_a) = (_b), 1 : 0) #define Max(_a, _b) ((_a) > (_b) ? (_a) : (_b)) #define Min(_a, _b) ((_a) < (_b) ? (_a) : (_b))
#define Abs(_x) (_x < 0 ? (-(_x)) : (_x)) using namespace std; //#define getchar() (_S == _T && (_T = (_S =_B) + fread(_B, 1, 1 << 15, stdin), _S == _T) ? 0 : *_S++) //char _B[1 << 15], *_S = _B, *_T = _B; inline int read() { R int a = 0, b = 1; R char c = getchar(); for(; c < '0' || c > '9'; c = getchar()) (c == '-') ? b = -1 : 0; for(; c >= '0' && c <= '9'; c = getchar()) a = (a << 1) + (a << 3) + c - '0'; return a * b; } inline ll lread() { R ll a = 0, b = 1; R char c = getchar(); for(; c < '0' || c > '9'; c = getchar()) (c == '-') ? b = -1 : 0; for(; c >= '0' && c <= '9'; c = getchar()) a = (a << 1) + (a << 3) + c - '0'; return a * b; } const int maxn = 200010; int a[maxn]; int s[maxn]; int c[maxn]; int d[maxn]; ll lowbit(ll x) { return x&(-x); } void change(int r) { c[r]=s[r]; for(int i=1;i<lowbit(r);i<<=1){ c[r]=max(c[r],c[r-i]); } } int getmax(int l,int r) { int ret=s[r]; while(l<=r){ ret=max(ret,s[r]); for(--r;r-l>=lowbit(r);r-=lowbit(r)){ ret=max(ret,c[r]); } } return ret; } void change2(int r) { d[r]=s[r]; for(int i=1;i<lowbit(r);i<<=1){ d[r]=min(d[r],d[r-i]); } } int getmin(int l,int r) { int ret=s[r]; while(l<=r){ ret=min(ret,s[r]); for(--r;r-l>=lowbit(r);r-=lowbit(r)){ ret=min(ret,d[r]); } } return ret; } int main() { int t; cin >> t; while(t--){ memset(c,0,sizeof(c)); memset(d,0,sizeof(d)); int n,m; cin >> n >> m; string ss; cin >> ss; for(int i = 0;i<n;i++){ if(ss[i] == '+') a[i+1] = 1; else a[i+1] = -1; } s[0] = 0; for(int i = 1;i <= n;i++){ s[i] = s[i-1]+a[i]; change(i); change2(i); } int l,r; for(int i = 0;i<m;i++){ cin >> l >> r; int x = s[r]-s[l-1]; int maxl = max(max(getmax(1,l-1),0),getmax(r+1,n)-x); int minl = min(min(getmin(1,l-1),0),getmin(r+1,n)-x); cout << maxl-minl+1 << endl; } } // printf("%d\n", read() + read()); return 0; }