(1)首先要想到貪心,若想要滿足最小數最大,那麼我們盡量選區間長度長的修改方法修改,這樣同是加a,但是長度長的加的更多,明顯比較優越。
(2)如何找到最大區間,我們可以在輸入後對其左端點排序(原因等會說),令最小的左端點排在前面,然後要用時再依次插入優先佇列,而優先佇列即是要用來將左端點滿足條件且最大區間排在前面
(3)我們可以二分列舉最小的最大值,然後再從1——n迴圈,如果a[i]還小於mid,就說明還未到最大,可以繼續修改區間使其最大,如果大於或等於就說明a[i]經過修改區間後不是最大的最小值,跳到下乙個a[i], 如果最後都沒有,就加大mid。
(4)這裡要用到區間修改,其次每修改一次還要查詢最小值,所以是樹狀陣列的區間修改,單點查詢
(1)排序:
首先排序時如果判到兩個數的左端點相同,那麼就按右端點排,反正就把區間大的放前。同樣優先佇列的運算子過載也一樣,如果右端點一樣,就把左端點最小的放前面。
int
cmp(jj x, jj y)
struct node2
else}}
;
(2)為何排左端點:while
(o[j]
.qi <= i && j <= m)
如上方**我們可以知道,我們的起點必須要小於等於i,因為這樣才可以令每次改變都可以改變第i個數,從而達到第i個數一定最大,而按左端點排後,如果當前j號方法起點不滿足<=i,那麼後面的方法一定也不行(因為左端點從小到大排過),所以直接跳出迴圈。
(3)二分的左右端點:
最小值假設最大的最小值不會改變受區間任何改變,那麼就是a[1
—n
]a[1—n]
a[1—n]
最小值。最大值假設每一次都要改變最大的最小值,那麼則是a[1
—n
]a[1—n]
a[1—n]
最小值 + k * a(即k次它都加了a)
long
long l =
1, r =
0x3f3f3f3f
;for
(int i =
1; i <= n; i++
)r = r + a * k;
(3)還有就是在迴圈cheak裡面的一些細節,詳細看注釋:
bool
cheak
(long
long s)
priority_queue q;
// q放入的是目前要改變的區間,此區間滿足最大
int ans =0;
//改變了幾個區間
int j =1;
//選第幾個改變區間方法
for(
int i =
1; i <= n; i++
)while
(sum
(i)< s)
node2 ll = q.
top();
q.pop();
update
(ll.l, a)
;update
(ll.r +1,
-a);
ans++
;//改變次數++}}
return1;
}
#include
#include
#include
#include
#include
using
namespace std;
int n, m, k, a, a[
200005
], _max, bit[
200005];
struct jj o[
200005];
intcmp
( jj x,
jj y)
struct node2
else}}
;int
lowbit
(int x)
void
update
(int k,
int shu)
}long
long
sum(
int zhong)
return da;
}bool
cheak
(long
long s)
priority_queue q;
// q放入的是目前要改變的區間,此區間滿足最大
int ans =0;
int j =1;
for(
int i =
1; i <= n; i++
)while
(sum
(i)< s)
node2 ll = q.
top();
q.pop();
update
(ll.l, a)
;update
(ll.r +1,
-a);
ans++;}
}return1;
}int
main()
r = r + a * k;
for(
int i =
1; i <= m; i++
)sort
(o +
1, o +
1+ m, cmp)
;while
(l <= r)
else
}printf
("%lld\n"
, l -1)
;}return0;
}
貪心 堆 樹狀陣列 JXOI2017 加法 題解
有乙個序列 和 m 個區間,你可以選 k個區間,選擇區間 l r 可以使 a 中的 l r 都加上 a 找出乙個方案使得 a中最小值最大。由於是求最小值的最大值,所以我們想到二分答案 mi d 這樣我們就知道序列中每個數還需要加多少次才能 mid 設第 i 個數的次數為 ti i 那麼接下來我們要做...
P4064 JXOI2017 加法 題解
link 可憐有乙個長度為 n 的正整數序列 a 但是她覺得 a 中的數字太小了,這讓她很不開心。於是她選擇了 m 個區間 l i,r i 和兩個正整數 a,k 她打算從這 m 個區間裡選出恰好 k 個區間,並對每個區間執行一次區間加 a 的操作。每個區間最多只能選擇一次。對區間 l,r 進行一次加...
解題報告 JXOI2017 數列 DP
給定乙個長度為 n 的整數數列 構造數列 滿足以下條件 求滿足上述條件的數列 的數量.n le 50,r i le 150 計數題,考慮 dp 設 f i l r 為 考慮到 a i l 為 a 中小於等於 a i 的最大值,r 為 a 中大於等於 a i 的最小值時,數列 的數量.首先明確一點,當...