JXOI2017 加法題解

2021-10-08 14:29:52 字數 2788 閱讀 3945

(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 的最小值時,數列 的數量.首先明確一點,當...