ACM學習感悟 暴力專場E 暴力dp

2021-07-01 21:33:09 字數 1669 閱讀 8216

problem description

小晴天:「我有乙個數列!」

小晴天:「我還要有很多很多的數列!」

於是小晴天就把這個數列的所有連續子數列寫出來。

然後小晴天把每個連續子數列中的最大的數寫出來。

那麼,有多少個比k大呢?

input

多組資料,首先是乙個正整數t(t<=100),表示資料的組數

對於每組資料,首先是兩個整數n(1<=n<=200000),k(0<=k<=10^9).,但所有資料中的n之和不超過1000000.

接下來是n個整數a[i](1<=a[i]<=10^9)

output

對於每組資料,輸出乙個整數,表示最大元素大於k的連續子串行的個數。

sample input

2

3 21 2 3

3 1

1 2 3

sample output

3

5

hint

對於樣例一,共有6個連續子串行(注意不滿足題意,因為不連續)

其中最大元素大於2的共有3個

對於樣例二,大於1的連續子串行共有5個,

因為這道題是中文,所以題意還是很明顯的,所謂的連續子串行就是數列中下標連續的一段,而並不是值連續。這道題可以用dp做,但是狀態轉移方程還是經過別人的指點才明白。設dp[i]表示以a[i]為結尾的符合題意的序列的總和,那麼

if (a[i]>k) maxidx=i;

d[i]=d[i-1]+i-(i-maxidx)==>d[i]=d[i-1]+maxidx;

其中maxidx指的是最靠近當前位置的滿足a[maxidx]>k的下標。有點難以理解,我們可以這麼想當資料規模擴大從i-1擴大到i的時候,總的連續子串行的和就多了i個,但是a[i]未必就k大,所以說要減去不符合要求的數列,那麼這些是多少個呢?試想,a[i]大於k,那麼以a[i]為結尾的所有數列都是符合要求的,如果a[i]小於k,maxidx不會更行,也就是說離這個位置最近的有乙個比k大的數,那麼從這個數之後的乙個數到當前位置這個數列是不符合要求的,那麼他的連續子串行也不符合要求,所以一共有i-maxidx個,就要減去這麼多,由此上面的方程還是挺清晰的。

//  created by  cquwel			                       

#include #include #include #include #include #include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f

#define cir(i,a,b) for (int i=a;i<=b;i++)

#define cir(j,a,b) for (int j=a;j>=b;j--)

#define clr(x) memset(x,0,sizeof(x))

typedef long long ll;

using namespace std;

long long a[200005],d[200005];

long long n,k;

int t;

int main()

printf("%d\n",d[n]);

} return 0;

}

ACM學習感悟 暴力專場B(dfs)

problem description 小晴天非常漂亮的後花園,打算以後退休之後在裡面種種花,養養草,所以現在小晴天打算為他的後花園圍上柵欄。小晴天的後花園可以看成是乙個m n的矩形,但是其中有一些地方種了樹,這些地方都不能安裝柵欄,現在小晴天把後花園的平面圖告訴你了,請你幫忙設計乙個最大的矩形柵欄...

ACM入門演算法之 遞迴專場

遞迴演算法就是在函式或子過程的內部,直接或者間接地呼叫自己的演算法,在acm中它是乙個入門級的演算法,題目一般非常簡單。它一般解決三類問題 1 資料的定義是按遞迴定義的。fibonacci函式 2 問題解法按遞迴演算法實現。回溯 3 資料的結構形式是按遞迴定義的。樹的遍歷,圖的搜尋 遞迴演算法解決問...

ACM交流賽感悟

a題很水,字串匹配,提交好幾次都沒通過,後來老何提醒後,發現題意理解錯了,改過來之後,還是沒過 在敲 之前,一定要三個人統一一下思路,思路一樣的話,開敲 f題是簡單題,不過也提交了多次才過,這個是多組資料,題目說是一組測試資料,其實是多組測試資料 這個還有情可原 e題是最簡單的題,跟a b乙個性質,...