题目大意:
秋实大哥命令所有士兵从左到右排成了一行来抵挡敌人的攻击。敌方每一次会攻击一个士兵,这个士兵就会阵亡,整个阵列就会从这个位置断开;同时有的时候已阵亡的士兵会受人赢气息感染而复活。秋实大哥想知道某一时刻某一个士兵所在的阵列的长度是多少。
代码实现:
暴力:
#include<cstdio>
#include<cstring>
using namespace std;
const int N=100005;
int row[N],n,m,death[N];
int main(){
while(~scanf("%d%d",&n,&m)){
memset(row,0,sizeof(row));
int op,x;
for(int i=1;i<=m;++i){
scanf("%d%d",&op,&x);
if(op==0) row[x]=1;
else if(op==1) row[x]=0;
else{
if(row[x]){
printf("0\n");
continue;
}
int sum=0;
for(int j=x;j>0;--j){
if(row[j]) break;
sum++;
}
for(int j=x+1;j<=n;++j){
if(row[j]) break;
sum++;
}
printf("%d\n",sum);
}
}
}
}
set:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<iostream>
#define each(it,v) for(__typeof((v).begin()) it=(v).begin();it!=(v).end();++it)
using namespace std;
const int N=100005;
int row[N],n,m,death[N],sum;
set<int> s;
set<int>::iterator it1,it2;
int main(){
while(~scanf("%d%d",&n,&m)){
s.clear();
s.insert(0),s.insert(n+1);
int op,x,sum;
for(int i=0;i<m;++i){
scanf("%d%d",&op,&x);
if(op==0) s.insert(x);
else if(op==1) s.erase(x);
else {
if(s.count(x)){
printf("0\n");
continue;
}
it1=s.upper_bound(x);
it2=it1;
it2--;
printf("%d\n",*it1-*it2-1);
}
}
}
}