CF1883D
2023-11-01 22:26:40 # OI # Problem

题面

Link

题意:每次有两种操作,一种是加入一条线段,一种是去掉一条线段,保证操作均合法。

思路

由于删除线段时一定保证该线段存在,所以我们可以分别开两个 multiset,分别维护线段的左端点最大值和右端点最小值,然后就可以判断了。

注意判断集合为空时答案为 NO\text{NO}

代码

#include <bits/stdc++.h>
using namespace std;

multiset<int> ml, mr;

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        char op[2];
        scanf("%s", op);
        int l, r;
        scanf("%d%d", &l, &r);
        if(*op == '-')
        {
            ml.erase(ml.find(l));
            mr.erase(mr.find(r));
        }
        else
        {
            ml.insert(l);
            mr.insert(r);
        }
        if(!ml.size())
        {
            cout << "NO" << endl;
        }
        else if(*(prev(ml.end())) > *mr.begin())
        {
            cout << "YES" << endl;
        }
        else
        {
            cout << "NO" << endl;
        }
    }
    return 0;
}