题意:
有n个村子,m个操作。
两种操作:
1. D x:将x村庄破坏;
2. Q x:询问包含 x 连续的未被破坏的村庄有多少个。
解析:
线段树实在不懂 T T。
搞了一种set的方法来做,把被破坏的村子往set里面插,然后要询问的时候直接lower_bound()求出刚好大于元素 x 的被破坏的村庄。
然后迭代器往后减1就是刚好小于元素 x 的被破坏的村庄,相减就行了。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <climits>
#include <cassert>
#define LL long long
#define lson lo, mi, rt << 1
#define rson mi + 1, hi, rt << 1 | 1
using namespace std;
const int maxn = 50000 + 10;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const double pi = acos(-1.0);
const double ee = exp(1.0);
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
int n, m;
while (~scanf("%d%d", &n, &m))
{
set<int> destroyed;
stack<int> s;
destroyed.insert(0);
destroyed.insert(n + 1);
while (m--)
{
char op[4];
scanf("%s", op);
if (op[0] == 'R')
{
int x = s.top();
s.pop();
destroyed.erase(x);
}
if (op[0] == 'D')
{
int x;
scanf("%d", &x);
destroyed.insert(x);
s.push(x);
}
if (op[0] == 'Q')
{
int x;
scanf("%d", &x);
if (destroyed.count(x))
{
printf("0\n");
}
else
{
set<int>::iterator it = lower_bound(destroyed.begin(), destroyed.end(), x);
int ans = *(it);
it--;
ans -= *(it);
printf("%d\n", ans - 1);
}
}
}
}
return 0;
}