题解:CF2004F Make a Palindrome
wangshuhang · · 题解
题意简述
给定一个长为
- 将相邻两个数合并,合并的数为两个数的和。
- 将一个数
x 拆解,使得拆解的两个数均为正数且和为x 。
求将
思路
考虑单个区间,显然的,一个长为
那什么时候可以做优化呢?
注意到,当一个前缀
可是我们发现,在
发现第一种操作次数减少
这样就好做了,考虑把贡献拆开,每次只要遇到
#include<bits/stdc++.h>
using namespace std;
int t;
int n;
int a[2005];
map<int,int>mp;
int main()
{
scanf("%d",&t);
while(t--)
{
mp.clear();
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int ans=0;
for(int i=1;i<=n;i++)
{
int sum=0;
for(int j=i;j<=n;j++)
{
sum+=a[j];
ans+=j-i-mp[sum];
mp[sum]++;
}
}
printf("%d\n",ans);
}
}