題意:給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。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?輸入包括...