UESTC 1061 SET的妙用

来源:互联网 发布:淘宝网店手机拍照 编辑:程序博客网 时间:2024/06/05 14:58

E - 秋实大哥与战争
Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu
Submit Status Practice UESTC 1061

Description

男儿何不带吴钩,收取关山五十州。

征战天下是秋实大哥一生的梦想,所以今天他又在练习一个对战游戏。

秋实大哥命令所有士兵从左到右排成了一行来抵挡敌人的攻击。

敌方每一次会攻击一个士兵,这个士兵就会阵亡,整个阵列就会从这个位置断开;同时有的时候已阵亡的士兵会受人赢气息感染而复活。

秋实大哥想知道某一时刻某一个士兵所在的阵列的长度是多少。

Input

第一行包含两个整数,表示秋实大哥的士兵数目和接下来发生的事件数目。

接下来行,每一行是以下三种事件之一:

0 x : 表示x位置的士兵受到攻击阵亡1 x : 表示x位置的士兵受人赢气息感染复活2 x : 秋实大哥想知道第x个士兵所在阵列的长度

Output

对于每一个 事件,输出对应的答案占一行。

Sample Input

5 3 
2 2 
0 3 
2 2

Sample Output


2





题解:这一题可以说非常巧妙地使用了set,可以将死的士兵插入进去,如果查询就进行二分查找,这个数字的左右区间,答案相减即可。注意有一种情况是如果查询的那个恰好是死的士兵那就不去二分查找了,直接输出0。


亦可以用线段树写。表示太难了惊恐


#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;#include<set>set<int>s;int main(){    int n,m,a,b;    scanf("%d%d",&n,&m);    s.insert(0);    s.insert(n+1);    while(m--)    {        scanf("%d%d",&a,&b);        if(a==0)        {           s.insert(b);        }        else if(a==1)        {            if(s.count(b))            {                s.erase(b);            }        }        else        {            if(s.count(b))            {                puts("0");            }            else            {               int R=*(s.lower_bound(b));               int L= *(--s.lower_bound(b));               printf("%d\n",R-L-1);            }        }    }    return 0;}








0 0
原创粉丝点击