51nod1495 中國好區間 思維

2021-07-09 13:37:16 字數 1317 閱讀 5644

題目大意:

阿爾法在玩乙個遊戲,阿爾法給出了乙個長度為n的序列,他認為,一段好的區間,它的長度是》=k的,且該區間的第k大的那個數,一定大於等於t。那麼問題來了,阿爾法想知道有多少好的區間。

由於阿爾法的序列長度實在是太大了,無法在規定時間內讀入。

他想了乙個絕妙的方法。

讀入a[0],b,c,p,則a[i]=(a[i-1]*b+c)mod p。

樣例解釋:

a1~a5分別為47,135,247,35,147

對應的7個區間分別為[1,3],[2,3],[1,4],[2,4],[1,5],[2,5],[3,5]

對於重複的數字1,2,2 第一大是2,第二大也是2,第三大是1。

input

讀入一行,7個數字,表示n(n<=10000000),k(k<=n),t,a[0],b,c,p。

所有數字均為正整數且小於等於10^9。

output

輸出一行表示好區間的個數。
input示例

5 2 100 10 124 7 300
output示例

7

思路:可以求出所有的ai,dt[i]記錄前i個數中大於等於t的個數,顯然若(a[i]>=t)則dt[i] = dt[i-1] + 1;否則dt[i] = dt[i-1];接下來計算沒個數對答案的貢獻,因為要求區間第k大數大於等於t,所以每個區間至少包含k個大於等於t的數,所以對於沒個數a[i] ,只需要dt[i]>=k時,找到前面比t大的數有dt[i]-k+1的第乙個大於等於t的數出現的a[j]的位置就是該數貢獻的答案。跑一邊就可以了,o(n).

#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define maxn 10000005

#define mod 1000000007

#define mem(a , b) memset(a , b , sizeof(a))

#define ll long long

#define inf 1000000000

int a[maxn];

int vis[maxn] , dt[maxn];

int n , k , t , b , c , p;

ll ans = 0;

void init()

}int main()

return 0;

}

51Nod 1495 中國好區間

acm模版 這個題真的很讓人出乎意料 沒成想,1e7的資料醬紫搞竟然能在0.7s內搞定。首先,我們暴力獲得陣列 a 然後使用尺取法,先獲取乙個滿足題意的 l 1,r cn t k 的區間,接著呢,很明顯只要右區間大於 r 都是好區間,然後尺取法往後繼續查詢剛好滿足 l r cn t k的區間,累計好...

51nod 1495 中國好區間

這道題給我說了尺取法我也不會,沒辦法只能看別人的部落格 感覺弄得好巧妙啊 首先,條件是選取的長度大於等於 k k 這個好理解,就他的兩個指標 r l 1 k role presentation r l 1 kr l 1 k就行了。但是要求從大到小第 k k 大的數要大於 t role present...

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