51nod 1495 中國好區間

2021-08-19 05:10:15 字數 1341 閱讀 3074

這道題給我說了尺取法我也不會,沒辦法只能看別人的部落格(;´д`)ゞ

感覺弄得好巧妙啊~

①首先,條件是選取的長度大於等於

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...