cf #314 B. Berland National Library (模拟)

给出一个图书馆人员进出情况,问图书馆满足题意的最小容量是多少。

注意在初始之前图书馆里面可能就有人了,也就是说不是所有进入图书馆的人都会被给出。

我的做法是先统计出图书馆里面初始的人数,开一个布尔数组,初始全为false,如果一个人标记为 false  而且从 图书馆里出来了,就说明这个人初始是在图书馆里的。

然后就正常模拟,图书馆的人数由初始的和后来的两部分组成。

/*************************************************************************
	> File Name: code/cf/#314/B.cpp
	> Author: 111qqz
	> Email: rkz2013@126.com 
	> Created Time: 2015年08月06日 星期四 00时23分26秒
 ************************************************************************/

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<stack>
#define y0 abc111qqz
#define y1 hust111qqz
#define yn hez111qqz
#define j1 cute111qqz
#define tm crazy111qqz
#define lr dying111qqz
using namespace std;
#define REP(i, n) for (int i=0;i<int(n);++i)  
typedef long long LL;
typedef unsigned long long ULL;
const int inf = 0x7fffffff;
const int N=1E2+5;moni
int n;
int r[N];
bool vis[1000060];
char ch[N];
int main()
{
    cin>>n;
    char cmd;
    int mx = -1;
    int cur = 0;
    int beforein = 0;
    memset(vis,false,sizeof(vis));
    for ( int i = 0 ; i < n ; i++)
    {
	
	cin>>ch[i]>>r[i];
	if (ch[i]=='+')
	{
	    vis[r[i]] = true;
	}
	if (ch[i]=='-')
	{
	    if (!vis[r[i]])
	    {
		beforein++;
	    }
	    vis[r[i]] = false;
	}
    }
    mx = beforein;
    memset(vis,false,sizeof(vis));
   // cout<<"beforein:"<<beforein<<endl;
    for ( int i = 0 ; i <n ; i++ )
    {
	if (ch[i]=='+')
	{
	    cur++;
	    vis [r[i]] =true;
	}
	else
	{
	    if (vis[r[i]])
	    {
//	    if (vis[1]) cout<<"fuffffffffff"<<endl;
		cur--;
//		cout<<"r[i]:"<<r[i]<<endl;
		vis[r[i]] = false;
	    }
	    else
	    {
		beforein--;
	    }
	}
//	cout<<"cur:"<<cur<<" beforein:"<<beforein<<endl;   
	if (cur+beforein>mx)
	{
	    mx = cur + beforein;
	}

    }
    cout<<mx<<endl;
	return 0;
}