题目:https://codeforces.com/problemset/problem/1562/D1
题目:
给你长度为n的字符串包含+和-,和q次的查询,输出最少删除多少个字符满足,删除后的字符串
,或者(偶数位乘-1,所有和相加等于0)
题解:直接模拟,并且使用前缀和。
例:+-+-需要删除2,4或者1,3
+-+-+-,需要删除3,6。+--+会相互抵掉。
+-+-+-+-,也只需要删除4,8。-++-也会抵消。
一个字符串前缀和>2的情况下,存在+-+-或者-+-+的情况,而这种情况最多也只需要删除2个字符串,因为是成队存在的,我们每次操作都对答案-2;
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long int ll;
const int N = 3e5 + 5;
// memset(book, 0, sizeof(book));
int a[N];
int sum[N];
int main()
{
int t;
cin >> t;
while (t--)
{
int n, q;
cin >> n >> q;
for (int i = 1; i <= n; i++)
{
char x;
cin >> x;
if (x == '+') a[i] = 1;
else a[i] = -1;
}
for (int i = 1; i <= n; i++)
{
if (i == 1)
sum[i] = a[i];
else
{
if (i & 1) sum[i] = sum[i - 1] + a[i];
else sum[i] = sum[i - 1] - a[i];
}
}
while (q--)
{
int l, r;
cin >> l >> r;
int ans = sum[l - 1] - sum[r];
if (ans < 0) ans = -ans;
while (ans > 2) ans -= 2;
cout << ans << endl;
}
}
}