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; }