实质模型是括号配对问题,但是会不断的去掉两边的括号,同时变换内部括号。
模拟什么都行……
我的做法是离散化后再模拟,这样可以省事…… 因为是模拟比赛的样子在做题,所以程序特别丑,1Y, 这种水题也没啥得意的了。
真的需要讲解么----
离散化后得到 -1 1 -1 1 -1 1 1 1 1这样的序列
最左边-1,最右边的1先去掉, 然后只剩下1 -1 1 -1 1 1 1 , 出现1 -1连在一起的情况,就让他们一起变为-1 1即可。
#include <iostream>
#include <map>
#include <cstdio>
#include <cstring>
using namespace std;
int n;
map<int,int>G;
struct node
{
int wz;
int dir;
int ganmao;
}a[200];
int b[200]={0};
int ganmao[200]={0};
int main()
{
int tmp, flag;
cin >> n;
cin >> tmp;
if (tmp > 0)flag = 1;
else flag = -1;
tmp *= flag;
a[0].dir = flag;
a[0].wz = tmp;
a[0].ganmao = 1;
for (int i = 1; i != n; ++ i)
{
cin >> tmp;
if (tmp >0)flag=1;
else flag = -1;
tmp *= flag;
a[i].wz = tmp;
a[i].dir = flag;
a[i].ganmao = 0;
}
for (int i = 0; i != n ; ++ i)
{
G[a[i].wz] = 0;
}
int count = 0;
map<int , int >::iterator it;
for (it = G.begin(); it!=G.end(); ++ it)
{
it -> second = ++ count;
}
for (int i = 0; i != n; ++ i)
{
int now = G[a[i].wz];
b[now] = a[i].dir;
ganmao[now] = a[i].ganmao;
}
int L = 1, R = count;
int ans = 0;
while (L <= R)
{
if (b[L]==-1)
{
if (ganmao[L]) ++ans;
++L;
}
if (b[R]==1)
{
if (ganmao[R]) ++ans;
--R;
}
for (int i = L; i < R; ++ i)
{
if (b[i] == 1 && b[i + 1] == -1)
{
b[i] = -1;
b[i + 1] = 1;
ganmao[i] |= ganmao[i + 1];
ganmao[i + 1] |= ganmao[i];
}
}
}
cout<<ans<<endl;
}