Codeforces Round #585 (Div. 2) B. The Number of Products

题目链接: http://codeforces.com/problemset/problem/1215/B

题目大意:在n个不含0的数中,求有多少连续的子串的乘积小于零,有多少连续的子串的乘积大于零。

题解:

设: dp_pos[i]表示 以a[i]为区间末尾 区间 积为正的 区间 左端点数目
       dp_neg[i]表示 以a[i]为区间结尾 区间 积为负的 区间 左端点数目
 
当第i个数 x > 0 时:
            dp_pos[i] = dp_pos[i - 1] + 1;   
                                dp_neg[i] = dp_neg[i - 1]; 
当第i个数 x ‹ 0 时:
            dp_pos[i] = dp_neg[i - 1]; 
            dp_neg[i] = dp_pos[i - 1] + 1; 
每次更新答案即可。
 1 #include 
 2 #include 
 3 using namespace std;
 4 
 5 const int maxn = 2e5 + 10;
 6 
 7 int n;
 8 long long dp_pos[maxn], dp_neg[maxn];
 9 // dp_pos[i]表示 以a[i]为区间末尾 区间积为正的 区间左端点数目
10 // dp_neg[i]表示 以a[i]为区间结尾 区间积为负的 区间左端点数目
11 
12 int main(){
13     scanf("%d", &n);
14     dp_pos[0] = 0; dp_neg[0] = 0;
15     long long ans_pos = 0, ans_neg = 0;
16     for(int i = 1; i <= n; i++){
17         int x;
18         scanf("%d", &x);
19         if(x > 0){
20             dp_pos[i] = dp_pos[i - 1] + 1;
21             dp_neg[i] = dp_neg[i - 1];
22         }
23         if(x < 0){
24             dp_pos[i] = dp_neg[i - 1];
25             dp_neg[i] = dp_pos[i - 1] + 1;
26         }
27         ans_pos += dp_pos[i];
28         ans_neg += dp_neg[i];
29     }
30     // for(int i = 1; i <= n; i++){
31     //     printf("pos: %lld, neg: %lld\n", dp_pos[i], dp_neg[i]);
32     // }
33     printf("%lld %lld\n", ans_neg, ans_pos);
34     return 0;
35 }

 

你可能感兴趣的:(Codeforces Round #585 (Div. 2) B. The Number of Products)