列表

详情


NC232180. 玛卡巴卡玩游戏

描述

玛卡巴卡正在玩一个游戏,在他面前有若干堆石子,他可以选择一对相邻的石子堆,并且分别在这两堆石子中取走一个石子。如果一个石子堆被取完,那么原本与之相邻的石子堆在这堆石子取完后相邻

现在有  个石子堆,玛卡巴卡想知道有多少对 ,满足将编号为  到  的石子堆单独取出进行游戏时他能取完所有的石子。

输入描述

第一行一个数 

接下来一行  个正整数 ,表示每堆石子的石子数。

输出描述

一个整数,表示答案。

示例1

输入:

6
1912 4369 4246 801 8234 4608

输出:

6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 61ms, 内存消耗: 4304K, 提交时间: 2022-11-24 11:25:00

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
int n,ans,a[N],b[N],s[N],f[N][2];
signed main(){
	cin>>n;
	for(int i=1;i<=n;++i){
		cin>>a[i];
		s[i] = s[i-1] + a[i];
		f[i][0] = f[i-1][0];
		f[i][1] = f[i-1][1];
		f[i][s[i]&1]++;
	}
	for(int i=n;i>=1;--i) b[i] = max(b[i+1],a[i]);
	int tot = 0;
	for(int i=1;i<=n;++i){
		int mx=0;
		for(int j=i;j<=n;++j){
			mx = max(mx,a[j]);
			if(s[j]-s[i-1]>=b[i]*2){
				ans += f[n][s[i-1]&1] - f[j-1][s[i-1]&1];
				break;
			}
			if(s[j]%2==s[i-1]%2&&(s[j]-s[i-1])>=mx*2) ans++;		
		}
	}
	cout<<ans<<endl;
	return 0;
}

上一题