[cf]Codeforces Round #527 (Div. 3) D1 Great Vova Wall (Version 1)

前言

t a g : tag : tag: 思维 难题 数据结构 *2200
传送门 :

题意

给定一个长度为 n n n的围墙,围墙第 i i i位置有 a [ i ] a[i] a[i]的高度

你可以放置一个 2 ∗ 1 2*1 21的砖块,横竖 都可以摆放,询问是否可以将墙统一高度

(放置的砖不可以超出 1 , n 1,n 1,n)


换句话说就是 , 给定一个长度为 n n n的数组 a [ ] a[] a[]

你可以让连续两个元素 + 1 +1 +1

或者让一个元素 + 2 +2 +2,询问 a [ ] a[] a[]是否可能 相等

思路

分析操作的性质

  • 对于 + 2 +2 +2,他会改变当前数的奇偶性
  • 而对于 + 1 +1 +1,不会改变当前数的 奇偶性

也就是如果存在两个连续奇偶性相同的数,那么这这两个数是可以被移除的

例如 [ 1 , 2 , 2 , 3 ] [1,2,2,3] [1,2,2,3]显然 [ 2 , 2 ] [2,2] [2,2]是可以被移除的,因为 2 , 2 2,2 2,2最后可以转换为 3 3 3这样子对后面的数是没有影响的

因此渐渐的,这个题目就明了了,因为存在可消去操作,又变回了栈匹配问题

最后需要注意的是 s t k . s i z e ( ) = = 1 stk.size()==1 stk.size()==1也是可行的,因为所有数都可以此基础上加到 x x x

Code

map<int,int> mp;
// const int N =
void solve(){
	int n;cin>>n;
	stack<int> stk;
	
	for(int i=1;i<=n;i++){
		int x;cin>>x;
		x = x%2;
		
		if(stk.empty())stk.push(x);
		else if(stk.top() == x) stk.pop();
		else stk.push(x);
	}
	if(stk.size()<=1)cout<<"YES"<<endl;
	else cout<<"NO"<<endl;
	
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值