链接: http://codeforces.com/group/NVaJtLaLjS/contest/241382/problem/H
题意: 给你一断连续的日志,该日志不一定完整,定义身为领导者必须在任何人登陆时都在线,问多少个可能为领导者
思路: 一开始我的思路是把所有的情况都判断出来,嵌套了许多
,结果把自己绕晕了,看了题解用
维护做出来,死于自己的码力
几种情况,
不会计算重复
A
+ 1
- 2
1 2均不可能,因为2比1先在线,却比1先下线
B
+ 1
- 1
- 3
+ 3
+ 4
- 4
可能 2 3 5
C
+ 1
- 2
+ 2
- 1
1 2 均不可能
等等……
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int id[N];
char op[N];
set<int>tmp,online;
bool vis[N];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>op[i]>>id[i];
}
for(int i=1;i<=m;i++)
{
if(op[i]=='-')
{
if(!vis[id[i]])
{
online.insert(id[i]);
}
}
vis[id[i]]=1;
}
memset(vis,0,sizeof vis);
for(int i=1;i<=m;i++)
{
if(op[i]=='+')
{
if(online.size()>0)
vis[id[i]]=1;
else
tmp.insert(id[i]);
online.insert(id[i]);
}
else
{
if(online.size()>1)
vis[id[i]]=1;
else
tmp.insert(id[i]);
online.erase(id[i]);
}
}
if(tmp.size()>1)
{
for(auto it: tmp)
{
vis[it]=1;
}
}
int cnt=0;
for(int i=1;i<=n;i++)
{
if(!vis[i])
cnt++;
}
cout<<cnt<<endl;
for(int i=1;i<=n;i++)
{
if(!vis[i])
cout<<i<<' ';
}
cout<<endl;
return 0;
}