The Number of Products(CF)
这个题几年之前做的时候就是不知道咋做 现在看起来就是一道简单的dp
首先枚举区间肯定是不行的 但是这个题目比较狡猾 数据范围给你2e5 迷惑你不往线性递推方面想
我开始想对每个点分析 分析他对答案会有什么贡献 以往有些题目就是这样的 但是发现没法分析
换个想法 考虑区间[L,R]固定R,依次dp就好
dp[i,0]表示 以i为结尾 结果为负
dp[i,1]表示 以i为结尾 结果为正
转移还是很简单的
a[i]>0
dp[i,1]=dp[i-1,1]+1,dp[i,0]=dp[i-1,0];
a[i]<0
dp[i,0]=dp[i-1,1]+1,dp[i,1]=dp[i-1,0];
#include
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=2e5+5;
ll n,x,ans1,ans2;
int dp[maxn][2];//1--->正 0---->负
int main(){
cin>>n;
cin>>x;
if(x<0)dp[1][0]=1,ans1++;
else dp[1][1]=1,ans2++;
for(int i=2;i<=n;i++){
cin>>x;
if(x<0){
dp[i][0]=dp[i-1][1]+1;
dp[i][1]=dp[i-1][0];
}
else {
dp[i][1]=dp[i-1][1]+1;
dp[i][0]=dp[i-1][0];
}
ans1+=dp[i][0];
ans2+=dp[i][1];
}
cout<