這道題給我說了尺取法我也不會,沒辦法只能看別人的部落格(;´д`)ゞ
感覺弄得好巧妙啊~
①首先,條件是選取的長度大於等於
k k
這個好理解,就他的兩個指標 r−
l+1>=
k' role="presentation">r−l
+1>=kr
−l+1
>=
k就行了。
②但是要求從大到小第
k k
大的數要大於
t' role="presentation">t
t,哇~這個就挺巧妙的了,轉換成比
t t
大的有k' role="presentation">k
k個,然後就又是字首和,用乙個su
m[i]
s um
[i
]表示從
1 1
到i' role="presentation">i
i大於等於
t t
的個數,那麼[l
,r]' role="presentation">[l,
r][l
,r]中的就是su
m[r]
−sum
[l−1
] sum
[r]−
sum[
l−1]
,只要su
m[r]
−sum
[l−1
]>=
k sum
[r]−
sum[
l−1]
>=
k就滿足條件
③然後計算答案時,就是用的尺取法的關鍵了,只要哪乙個[l
,r] [l,
r]
滿足條件那麼後面的[l
,r+1
],[l
,r+2
],,,
, [l,
r+1]
,[l,
r+2]
,,,,
一直到[l
,n] [l,
n]
都是滿足條件的,於是就闊以直接算出有n−
r+1 n−r
+1
個了
#include"iostream"
using namespace std;
const int maxn=1e7+5;
long
long a[maxn],sum[maxn];//sum用來記錄前i個大於t的有多少個
int main()
int l=1,r=1;
while(1)
cout<}
}
51Nod 1495 中國好區間
acm模版 這個題真的很讓人出乎意料 沒成想,1e7的資料醬紫搞竟然能在0.7s內搞定。首先,我們暴力獲得陣列 a 然後使用尺取法,先獲取乙個滿足題意的 l 1,r cn t k 的區間,接著呢,很明顯只要右區間大於 r 都是好區間,然後尺取法往後繼續查詢剛好滿足 l r cn t k的區間,累計好...
51nod1495 中國好區間
雙指標掃一遍 include include include includeusing namespace std define rep i,s,t for int i s i t i define dwn i,s,t for int i s i t i define clr x,c memset ...
51nod1495 中國好區間 思維
題目大意 阿爾法在玩乙個遊戲,阿爾法給出了乙個長度為n的序列,他認為,一段好的區間,它的長度是 k的,且該區間的第k大的那個數,一定大於等於t。那麼問題來了,阿爾法想知道有多少好的區間。由於阿爾法的序列長度實在是太大了,無法在規定時間內讀入。他想了乙個絕妙的方法。讀入a 0 b,c,p,則a i a...