2022.2.28 练习 CSP 202109-2 非零段划分
参考博客:非零段划分(CSP202109-2)
心得:第二题,要想尽一切办法减少时间复杂度!
#include <bits/stdc++.h>
using namespace std;
const int MAX = 5*1*1e5+5;
int flag[MAX];
vector<int> b[MAX];
int main()
{
int n;
cin>>n;
int a;
int maxnum=-1;
int flag0=0;
for(int i=1;i<=n;i++)
{
cin>>a;
if(a!=0)
flag0=1;
b[a].push_back(i);
maxnum=max(maxnum,a);
}
int res=1;
int maxn=-1;
flag[0]=flag[n+1]=1;
for(int i=0;i<=maxnum;i++)
{
if(b[i].size()==0)
continue;
else
{
int tmp=res;
//cout<<"tmp:"<<tmp<<endl;
for(int j=0;j<b[i].size();j++)
{
int index=b[i][j];
flag[index]=1;
if(flag[index-1]==0 && flag[index+1]==0)
{
tmp++;
}
else if(flag[index-1]==1 && flag[index+1]==1)
{
tmp--;
}
//cout<<"index: "<<index<<" tmp: "<<tmp<<endl;
}
//cout<<"---------------"<<endl;
res=tmp;
maxn=max(maxn,res);
}
}
if(flag0==0)
cout<<0;
else
{
cout<<maxn;
}
return 0;
}