被一个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; }