P4064 JXOI2017 加法 題解

2022-09-20 16:54:11 字數 1764 閱讀 1817

link

「可憐有乙個長度為 \(n\) 的正整數序列\(a\),但是她覺得 \(a\) 中的數字太小了,這讓她很不開心。」

「於是她選擇了 \(m\) 個區間 \([l_i, r_i]\) 和兩個正整數\(a, k\)。她打算從這 \(m\) 個區間裡選出恰好\(k\) 個區間,並對每個區間執行一次區間加 \(a\) 的操作。(每個區間最多只能選擇一次。)」

「對區間 \([l, r]\) 進行一次加 \(a\) 操作可以定義為對於所有 \(i\in [l, r]\),將 \(a_i\) 變成 \(a_i + a\)。現在可憐想要知道怎麼選擇區間才能讓操作後的序列的最小值盡可能的大,即最大化 \(\min_^ \)。」

很明顯,這道題有區間加,有查詢,所以可以想到用樹狀陣列。不應該是線段樹?

接著,我們可以觀察到:

「讓操作後的序列的最小值盡可能的大

因此,我們可以很容易的想到二分(因為二分就是用來解決最小值最大,最大值最小的)。

當然,雖然我們用了二分把時間進行了一次優化,但是對於 \(3000ms\) 來說,還是太慢了。所以我們需要進一步的優化。那麼就需要我們先理解這個思路到底要我們做什麼。我們二分的肯定是答案,即最小值的最大值為多少。因為我們可以對乙個較大的區間去一次尋找中間值,看在滿足使用 \(k\) 個區間及以內這個條件的時候能否滿足此答案。

現在的問題就是:我到底該怎麼選擇這 \(k\) 個區間才能使得選擇方案最優?

不好確定對不對?

既然我們沒法很容易的得出最優方案,所以我們可以嘗試用貪心來想一想。

當然,我們可以乙個元素乙個元素的去解決(使得當前元素滿足答案或者無法滿足),這樣再去思考怎麼選擇區間最優不就容易了嗎?

由於我們是乙個乙個元素思考的,那麼在這個元素左邊的元素一定都符合條件,所以我們為了使得用區間個數盡可能少,一定會由於貪心思想而選擇區間端點最靠右未被用過的,以盡可能減少使用區間的個數。若我們仍然無法滿足二分的答案,那麼就一定做不到這個值了。

當然,還可以使用優先佇列再次優化時間。

#include#define lowbit(x) (x&(-x))

using namespace std;

const int n=2e5+5;

int n,q,k,a;

long long tree[n],m[n],dif[n],sum[n];

bool book[n];

typedef struct questions//存區間

return 1;

}int ef(int l,int r)//二分

int mid=l+r>>1;

if(check(mid))

return ef(mid,r);

return ef(l,mid-1);

}int main()

for(i=1;i<=q;i++)

scanf("%d %d",&sec[i].l,&sec[i].r);

sort(sec+1,sec+1+q,cmp);

printf("%d\n",ef(l,r));

} return 0;

}

認識P2P,利用P2P

是peer to peer的縮寫 好象還看到過文章說是point to point,我也不清楚,網上的資料也不清楚,鬱悶 peer在英語裡有 地位 能力等 同等者 同事 和 夥伴 等意義。這樣一來,p2p也就可以理解為 夥伴對夥伴 的意思,或稱為對等聯網。目前人們認為其在加強網路上人的交流 檔案交換...

P2P網路模型

1 靜態配置模型 靜態配置模型是一種相對靜態而簡單的對等點定位模型。在該模型中,每個對等點都確切地知道存在於其p2p 網路中其它對等點的位置以及它們所提供的共享資源內容。缺點 網路無法應付不能預知的隨機事件和臨時變更,比如對等點隨機進入和退出網路。優點 整個網路在外部攻擊面前表現得很穩固。2 動態配...

P2P路由演算法

p2p路由演算法 資源定位方法 dht distributed hash table 演算法 思想 每乙份資源都由一組關鍵字標示,系統對其中的每乙個關鍵字進行hash,根據hash的結果確定該關鍵字由哪個使用者負責儲存,使用者搜尋的同時,用同樣的演算法計算每乙個字的hash,再根據hash知道該關鍵...