原題:
題意:乙個數列,1e7數量。對每個區間(i,i + m - 1)都有操作。操作要查詢該區間的最大值和該區間的最長的嚴格上公升的序列的長度。
正這不好計算,倒著來比較好。用雙端的單調佇列維護資訊。
倒著來的話,就把要加進來的數和隊尾比較,大於等於隊尾的話,說明隊尾那個數沒用了。 隊頭就是區間的最大值,佇列長度就是序列的長度。
#include
using namespace std;
int t;
int n,m,k;
int p,q,r;
long long mod;
int a[10000005];
int dq[10000005];
// 結果要開ll
long long a,b;
// 倒序的來處理比較巧妙
int main()
// 強制型別轉換快點
for(long long i = k + 1; i <= n; i++)
// 處理最開始的最後面的m個數。
for(int i = n; i >= n - m + 1; i--)
// 第乙個數必然會放進佇列
dq[tail++] = i;
}a = 0;
b = 0;
// 對第一段的統計
a += a[dq[head]] ^ (n - m + 1);
b += (tail - head) ^ (n - m + 1);
// 開始乙個乙個加,乙個乙個統計
for(int i = n - m; i >= 1; i--)
}// 和之前的一樣
while(tail > head && a[i] >= a[dq[tail - 1]])
dq[tail++] = i;
//統計答案
a += a[dq[head]] ^ i;
b += (tail - head) ^ i;
}printf("%lld
%lld\n",a,b);
}return
0;}
hdu 6319(單調佇列思維題
題意 給一組數列,輸出從左到右的最大值及i的異或和,以及最大值更新次數的異或和 思路 最大值顯然可以用單調佇列來維護,但是最大值的更新次怎麼辦呢,容易想到倒序做一遍單調佇列,佇列中其實倒序儲存著更新的最大值,所以佇列的個數即是最大值的更新次數,單調佇列的又乙個應用,求最大值更新次數 include ...
hdu 6319 逆序建單調佇列
題目傳送門 res tp hdu 維護遞增單調佇列 根據資料範圍推測應為o n 的.我們需要維護乙個區間的資訊,區間內資訊是 有序 的,同時需要在o 1 的時間進行相鄰區間的資訊轉移.若是主數列從頭到尾轉移無法有解題突破口,就反過來從尾到頭再思考.include include include in...
HDU 6319題解 資料結構之雙端佇列)
題意 給定乙個序列a 1.n 對於每個長度為m的連續子區間,求出區間a的最大值以及從左往右掃瞄該區間時a 的最大值的變化次數。實際上不是輸出這個,具體的看原題吧 1 m n 107 題解 使用雙端佇列,由右向左維護乙個單調非遞減佇列。由區間 l,l m 滑動到 l 1,l m 1 時,如果a l 1...