题意:如果领导会在所有有人的时候在线,问谁可能是领导。
思路:太乱了,主要是要有自己的思路。我的比较乱……大家不要介意。
AC代码如下:
#include<cstdio>
#include<cstring>
using namespace std;
int st[100010],t[100100][2],vis[100100],ans[100100],n,m;
char s[5];
void solve(int p)
{ int i,j,k;
k=t[p][1];
for(i=1;i<=n;i++)
if(st[i]!=0 && i!=k)
vis[i]=1;
if(vis[k]==1)
return;
int num=1,num2=0;
for(i=p+1;i<=m;i++)
{ if(t[i][1]==k)
{ if(t[i][0]=='1')
num++;
else
{ num--;
if(num==0 && num2>0)
{ vis[k]=1;
return;
}
}
}
else if(t[i][0]==1)
{ num2++;
if(num==0 && num2>0)
{ vis[k]=1;
return;
}
}
else
num2--;
}
}
int main()
{ int i,j,k,num=0,num2=0,num3=0,len=0;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{ scanf("%s%d",s,&k);
if(s[0]=='+')
t[i][0]=1;
else
t[i][0]=2;
t[i][1]=k;
}
for(i=1;i<=m;i++)
if(st[t[i][1]]==0)
st[t[i][1]]=t[i][0];
for(i=1;i<=n;i++)
if(st[i]==2)
num++;
num2=0;
if(num>0){
for(i=1;i<=n;i++)
if(st[i]==1)
vis[i]=1;
for(i=1;i<=m;i++)
{ if(t[i][0]==1)
{ num++;
if(num==1)
{ solve(i);
break;
}
if(vis[t[i][1]]==1)
num2++;
}
else
{ if(vis[t[i][1]]==1)
{ num--;
num2--;
}
else
{ num--;
if(num-num2>0 || (num-num2==0 && num>0))
vis[t[i][1]]=1;
}
}
}
}
else
solve(1);
for(i=1;i<=n;i++)
if(vis[i]==0)
ans[++len]=i;
printf("%d\n",len);
if(len){
printf("%d",ans[1]);
for(i=2;i<=len;i++)
printf(" %d",ans[i]);
printf("\n");}
}