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
23 21 2 3
3 1
1 2 3
sample output
35
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乙個性質,...