Ascending Rating(單調佇列)

2021-08-21 22:23:49 字數 905 閱讀 2753

題目大意:給出一組數,詢問一組區間,問找每一組區間的最大值時max更新的次數與i的異或和,以及每組區間的最大值與i的異或和

單調佇列:

單調佇列的頭元素一直是佇列中最大的,而且佇列中的值是按照遞減的順序排列的. 允許從佇列的末尾插入乙個元素,從佇列的兩端刪除元素.

1. 插入元素:為了保證佇列的遞減性,在插入元素v的時候,要將隊尾的元素和v比較,如果隊尾的元素不大於v,則刪除隊尾的元素,然後繼續將新的隊尾元素與v比較,直到隊尾的元素大於v,並把v插入隊尾。

2. 刪除隊首元素:隊首元素的下標小於i-k+1.

思路:從最後乙個元素開始進佇列(注意進的是下標,每m個一組.一組結束後 佇列中的元素個數即為交換次數 隊首元素即為最大值 然後求異或和即可。

只有讓元素倒著進佇列 才能保證佇列中元素個數為交換次數

**:

#includeusing namespace std;

typedef long long ll;

int q[10000903];//單調佇列

int a[10000903];//原陣列

int top,front;//top指向隊尾 從此處既入佇列又出佇列;front指向隊頭 從此處出佇列

int main()

//topi+m-1)

front++;

int sum=top-front+1;

count+=sum^i;

maxr+=a[q[front]]^i;}}

printf("%lld %lld\n",maxr,count);

}return 0;

}

這樣的做法可以把複雜度降低到o(n)

bzoj4385 Wilcze do y 單調佇列

趕腳poi要被許可權。趕緊趁現在刷幾道水題 首先令s i 表示 1,i 序列的和。現在考慮一段序列 i,j 如何判斷這段序列是否滿足條件呢?當j i 1 d時顯然滿足 否則,我們肯定是要讓這一段序列中總和最大的一段 x,x d 變為0,換句話說,如果設x,使x滿足i x,x d j且s x d s ...

HDU 5289 Assignment 單調佇列

題意 給t足資料,然後每組乙個n和k,表示n個數,k表示最大同意的能力差,接下來n個數表示n個人的能力,求能力差在k之內的區間有幾個 分析 維護乙個區間的最大值和最小值,使得他們的差小於k,於是採用單調佇列 普通單調佇列做法 include include include includeusing ...

bzoj2500幸福的道路 樹形dp 單調佇列

time limit 20 sec memory limit 256 mb submit 434 solved 170 submit status discuss 小t與小l終於決定走在一起,他們不想浪費在一起的每一分每一秒,所以他們決定每天早上一同晨練來享受在一起的時光.他們畫出了晨練路線的草圖,...