Spring VI H

链接: http://codeforces.com/group/NVaJtLaLjS/contest/241382/problem/H
题意: 给你一断连续的日志,该日志不一定完整,定义身为领导者必须在任何人登陆时都在线,问多少个可能为领导者
思路: 一开始我的思路是把所有的情况都判断出来,嵌套了许多 i f e l s e if-else ,结果把自己绕晕了,看了题解用 s e t set 维护做出来,死于自己的码力
几种情况, s e t set 不会计算重复

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;
}

猜你喜欢

转载自blog.csdn.net/qq_42819598/article/details/88858873
vi