B - Silly Mistake set +思维

传送门
思路:思维 + 模拟,中心思想是用先判断是否符合有效条件,如果有效,放到集合当中,每次一个有效数组(当前集合长度等于有效数组长度)出现,我们就储存起来,并更新集合和cnt。
在这里插入图片描述

#include<iostream>
#include<set>
using namespace std;
int vis[100005];
set<int>s;
int a[100005];
int main()
{
    int n;
    cin >> n;
    int flag = 0, ans = 0;
    for(int i = 1; i <= n; i++)
        cin >> a[i];
        int cnt = 0;
    for(int i = 1;i <= n;i++)
    {
        if(a[i] < 0 && s.count(-a[i]) != 1)
        {
            flag = 1;
            //cout << 111 << endl;
            break;
        }
        if(a[i] > 0 && s.count(a[i]) == 1)
        {
            flag = 1;
          //   cout << 1112 << endl;
            break;
        }
        s.insert(a[i]);
        if(a[i] < 0 && s.count(-a[i]) == 1)
        {
             //cout << 114 << endl;
            cnt += 2;///更新
            //cout << cnt << " "<< s.size() << endl;
            if(cnt == s.size())
            {
                vis[++ans] = cnt;
                cnt = 0;
                s.clear();
            }
        }
    }
    //cout << ans << endl;
    if(ans == 0 || flag || n & 1 == 1 || s.size() != 0)
        cout << -1 << endl;
    else
    {
        cout << ans << endl;
        for(int i = 1;i <= ans;i++)
            cout << vis[i] << " ";
        cout << endl;
    }
    return 0;
}

发布了241 篇原创文章 · 获赞 8 · 访问量 4863

猜你喜欢

转载自blog.csdn.net/weixin_43960370/article/details/103315050