題意:有多少個區間,區間內最大的數減去最小的數差小於k
對每個數它所在的區間,可以只往前找(類似dp的無後效性) 比如對位置3的數,可以往前找的區間是[3, 3], [2, 3], [1, 3], [0, 3]這樣
這樣 遍歷a[i] 對每個a[i]往前 就可以得到所有的區間
比如案例
10 5
0 3 4 5 2 1 6 7 8 9
(最小值,最大值)的形式
每個數增加乙個(自己,自己)
一旦不滿足條件了就不必再進行下去
那麼很容易想到這是乙個類似佇列的情況
對於這個案例 跑一下佇列就是
(把隊中元素的個數加起來就是結果)
那麼問題就轉化成了怎麼知道佇列中存在乙個數是要彈出的(也就是上述案例6的時候,怎麼知道1在佇列中)
我先用優先佇列處理了一下每個數前面需要彈出的數的位置的最大值
再用佇列模擬上述過程即可
1 #include 2hdoj 5289using
namespace
std;
3 typedef long
long
ll;4
#define lson l, m
5#define rson m+1, r
6const
int n=1e5+5;7
const ll mod=1e9+7
;8 typedef pairpi;
9pi a[n];
10int
minn[n], maxn[n];
11void
out(priority_queue, greater>q)
1218 puts(""
);19}20
21int
main()
2237 memset(minn, -1, sizeof
(minn));
38 memset(maxn, -1, sizeof
(maxn));
39 priority_queue, greater>q1;
40while(!q1.empty())
41q1.pop();
42 q1.push(a[0
]);43
for(int i=1;i)
4450
q1.push(a[i]);
51//
out(q1);52}
53 priority_queue, less>q2;
54while(!q2.empty())
55q2.pop();
56 q2.push(a[0
]);57
for(int i=1;i)
5864
q2.push(a[i]);65}
66//
for(int i=0;i67
//printf("%d %d\n", minn[i], maxn[i]);
6869 ll ans=0
;70 queueq;
71while(!q.empty())
72q.pop();
73int cur=0;74
for(int i=0;i)
7589
q.push(a[i].second);
90 ans+=q.size();91}
92 printf("
%i64d\n
", ans);93}
94return0;
95 }
hdoj1874 (優先佇列 Dijkstra)
hdoj1874 分析 一看題目,就是求最短路,這道題用的是dijkstra 優先佇列。先說一下dijkstra演算法 每次擴充套件乙個距離最短的節點,更新與其相鄰點的距離。當所有邊權都為正時,由於不會存在乙個距離更短的沒有擴充套件的點,所以這個點的距離不會在改變,保證了演算法的正確性。演算法步驟如...
優先佇列 HDOJ5360 Hiking
題意 有n個人,每個人有兩個引數 l 和 r 邀請他們去hiking,當 當前已經邀請到的人數大於等於 l 並且小於等於 r 那麼這個人就會去 問最多能邀請到幾個人 並輸出 依次要邀請的人的編號 編號1 n 先要按 l 排序 l 小的在前 因為所有 l 小於等於當前已經邀請到的人數的人才能被邀請 對...
HDOJ 2544 最短路(DIJ 優先佇列)
最短路 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status description 在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運...