HDU 5289 Assignment 單調佇列

2021-09-07 10:59:29 字數 1326 閱讀 7893

題意:給t足資料,然後每組乙個n和k,表示n個數,k表示最大同意的能力差,接下來n個數表示n個人的能力,求能力差在k之內的區間有幾個

分析:維護乙個區間的最大值和最小值,使得他們的差小於k,於是採用單調佇列

普通單調佇列做法:

#include#include#include#includeusing namespace std;

const int maxn = 1e6+5;

int a[maxn];

struct nodeqd[maxn];

node qx[maxn];

int main()

int st1,st2,ed1,ed2;

st1=st2=ed1=ed2=1;

long long sum=0;

int j=1;

for(int i=1;i<=n&&j<=n;i++)

else

qd[++ed1].v=a[i]; //a[i]入佇列

qd[ed1].index=i;

while(st2<=ed2)

qx[++ed2].v=a[i]; //a[i]入佇列

qx[ed2].index=i;

while(qd[st1].v-qx[st2].v>=k&&st1<=ed1&&st2<=ed2) //計數}}

while(j<=n)

printf("%i64d\n",sum);

}}

二分單調佇列做法:

#include#include#include#includeusing namespace std;

const int maxn = 1e6+5;

int a[maxn];

struct nodeqd[maxn];

node qx[maxn];

int maxc(int l,int r,int d)

return l;

}int minc(int l,int r,int d)}}

while(j<=n)

printf("%i64d\n",sum);

}}

hdu5289多校第一場第二題

題目大意 給你一串數字,問有幾個連續的序其最大值與最小值之差不大於k。借用雙指標的思想,i,j初始化都為0,然後j往後移動,遇到第乙個使區間不符合條件的位置停下,ans加上此時的區間數目,因為是連續的且以i為起點,所以區間只有j i個 然後i往後移動,每移動乙個位置,加乙個j i,直到與j那個位置有...

HDU 1274展開字串 HDU 2072單詞數

需要簡單的遞迴呼叫,主要是string用的有點糾結,還是不熟練啊 include include include define n 255 char str n std string stri std string strn int num std string iterator process s...

HDU 2544 單源最短路

最短路 time limit 1000ms memory limit 65536k 在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?輸入包括...