算法 19. 横竖填坑
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
long long int lake[2000005];
stack <long long int> s;
int main()
{
long long int n;
long long int max,sub;
long long int count;
while(scanf("%lld",&n)!=EOF)
{
max=0;
count=0;
memset(lake,0,sizeof(lake[0]));
while(!s.empty())
{
s.pop();
}
for(long long int i=0;i<n;i++)
{
scanf("%lld",&lake[i]);
if(lake[i]>max)
{
max=lake[i];
}
}
for(long long int i=0;i<n;i++)
{
sub=max-lake[i];
if(sub%2==0)
{
lake[i]=0;
}
else
{
lake[i]=1;
}
}
for(long long int i=0;i<n;i++)
{
if(count==0)
{
s.push(lake[i]);
count++;
}
else
{
if(s.top()==lake[i])
{
count--;
s.pop();
}
else
{
s.push(lake[i]);
count++;
}
}
}
if(count>1)
{
printf("NO\n");
}
else
{
printf("YES\n");
}
}
return 0;
}