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

这题就是把加号抽象成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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法和数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问组成,选手需要根据给定的问描述和测试用例,编写程序来解决这些问。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值