码迷,mamicode.com
首页 > 其他好文 > 详细

B - Silly Mistake

时间:2019-11-22 23:58:14      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:else   bool   退出   set   初始化   print   一个   cout   直接   

被一个DIV2--b题目卡到哭;

总结:用到标记数组时,如果需要多次初始化,首先判断数据范围,如果特别大的话,不要用memset,,用map<int ,bool>做标记。

思路:以sum=0,做判断标准,跑数组的时候同时判断时候满足条件,不满足直接退出。

#include<bits/stdc++.h>
using namespace std;
const int N=1E6+7;
map<int ,bool >mp;
int arr[N];
int pre[N];
void solve(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)  scanf("%d",&arr[i]);
    if(n&1){
        puts("-1");
        return ;
    }
    int ans=0;
    for(int i=1;i<=n;){
        if(arr[i]<0) {
            puts("-1");
            return ;
        }
        else {
            mp.clear();
            mp[arr[i]]=1;
            int j;
            int sum=arr[i];
            int pos=0;
            for(j=i+1;sum!=0&&j<=n;j++){
                sum+=arr[j];
                if(arr[j]<0){
                    int a=-arr[j];
                    if(mp[a]) continue ;
                    else {
                        puts("-1");
                        return ;
                    }
                }
                else {
                    if(mp[arr[j]]){
                        puts("-1");
                        return ;
                    }
                    else mp[arr[j]]=1;
                }
            }
            if(sum==0) {
                ans++;
                pre[ans]=j-i;
                i=j;
            }
            else {
                puts("-1");
                return ;
            }
        }
    }
    cout<<ans<<endl;
    for(int i=1;i<=ans;i++)    printf("%d ",pre[i]);
    cout<<endl;
}
int main(){
    solve();
    return 0;
}

 

B - Silly Mistake

标签:else   bool   退出   set   初始化   print   一个   cout   直接   

原文地址:https://www.cnblogs.com/Accepting/p/11914783.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!