題目出處:cf 1215b
題目描述
給你乙個序列包含 \(n\) 個元素的序列 \(a_1, a_2, \dots , a_n\) (每個元素 \(a_i \ne 0\))。
你需要計算如下兩個值:
有多少對數 \((l, r) (l \le r)\) 滿足 \(a_l \cdot a_ \dots a_ \cdot a_r\) 的結果為正;
有多少對數 \((l, r) (l \le r)\) 滿足 \(a_l \cdot a_ \dots a_ \cdot a_r\) 的結果為負。
即:這個序列中有多少子串(子串即連續子串行)的乘積為正,有多少子串的乘積為負。
輸入格式
輸入的第一行包含乙個整數 \(n (1 \le n \le 2 \cdot 10^)\) —— 用於表示序列中元素的個數。
輸入的第二行包含 \(n\) 個整數 \(a_1, a_2, \dots , a_n (-10^ \le a_i \le 10^; a_i \neq 0)\) ,用於表示序列中的元素。
輸出格式
輸出兩個正數,以乙個空格分隔。分別表示乘積為正的子串的個數,以及乘積為負的子串的個數。
樣例輸入1
5
5 -3 3 -1 1
樣例輸出18 7
樣例輸入210
4 2 -4 3 1 2 -4 3 2 3
樣例輸出228 27
樣例輸入35
-1 -2 -3 -4 -5
樣例輸出39 6
問題分析
本體涉及演算法:動態規劃。
這道題目是乙個動態規劃入門題。
我們定義狀態:
可以得到狀態轉移方程為:
當 \(a_i \gt 0\) 時:
實現**如下:
#include using namespace std;
const int maxn = 200020;
int n, a[maxn];
long long f[maxn][2], sum[2]; // f[i][0]表示以a[i]結尾整數數量, meanwhile f[i][2]負數。
int main()
else
for (int j = 0; j < 2; j ++) sum[j] += f[i][j];
}cout << sum[1] << " " << sum[0] << endl;
return 0;
}
MySQL 基礎題練習題 查詢篇 7
資料在本專欄的第一篇部落格裡 sql99標準的連線查詢,左連線就很方便 8.1.查詢編號 3的女神的男朋友資訊,如果有則列出詳細的資訊,如果沒有,則用null填充select be.id,be.name,bo.from beauty be left join boys bo on be.boyfri...
C 練習題 尋找子字串
今天遇到這樣一道題 題目描述 給出字串a和字串b,保證b是a的乙個子串,請你輸出b在a中第一次出現的位置。輸入描述 僅一行包含兩個字串a和b 輸出描述 僅一行乙個整數 樣例輸入 abcd bc 樣例輸出2 兩個字串之間可能包含多個空格。程式 include include using namespa...
訊精選練習題46 最長回文子串
給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb class solution 獲取s 0,index 的最大回文子串 如果s 0,index 本身就是回文,那麼...