聰明的質監員(二分答案,字首和)

2022-02-27 06:10:12 字數 1929 閱讀 1253

小t是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 nnn 個礦石,從 111 到 nnn 逐一編號,每個礦石都有自己的重量 wiw_iwi​以及價值 viv_ivi​。檢驗礦產的流程是:

1 、給定 m個區間 [li,ri];

2 、選出乙個引數 w;

3 、對於乙個區間 [li,ri],計算礦石在這個區間上的檢驗值 yi:

這批礦產的檢驗結果 y為各個區間的檢驗值之和。即: y1+y2...+ym​

若這批礦產的檢驗結果與所給標準值 s相差太多,就需要再去檢驗另一批礦產。小t不想費時間去檢驗另一批礦產,所以他想通過調整引數w 的值,讓檢驗結果盡可能的靠近標準值 s,即使得 s−y的絕對值最小。請你幫忙求出這個最小值。

輸入格式:

第一行包含三個整數 n,m,s,分別表示礦石的個數、區間的個數和標準值。

接下來的 n行,每行 2個整數,中間用空格隔開,第 i+1行表示 i 號礦石的重量 wi和價值 vi​。

接下來的 m行,表示區間,每行 2個整數,中間用空格隔開,第 i+n+1行表示區間 [li,ri]的兩個端點 li和 ri。注意:不同區間可能重合或相互重疊。

輸出格式:

乙個整數,表示所求的最小值。

暴力是不行的啦,而我又不會別的qwq

所以我就想辦法開始優化

一看w才1e6,好辦,可以二分答案了。

每次二分乙個答案,然後驗證

如果二分出來的答案s-y小於0,那麼可能最優解在他的右邊

反之亦然

記得每次都要更新答案喲。

怎麼驗證呢?

我們就要用到字首和

每次二分出乙個數,我就按這個條件o(n)算出字首和

詢問的回答就可以o(1)了

#include#include

#include

#include

#define rii register int i

#define rij register int j

#define inf 19260817

#define int long long

using

namespace

std;

long

long qzhv[1000005],qzhw[1000005],s,n,m,v[200005],w[200005

];long

long

maxn,minx;

long

long z[200005],y[200005

];long

long find(int

wz) }

for(rii=1;i<=m;i++)

return

ans;

}long

long qabs(long

long

val)

else

}signed main()

for(rii=1;i<=m;i++)

int l=minx-1

;

int r=maxn+2

; minx=9999999999999999

;

while(l!=r)

int mid=(l+r)/2

;

long

long qaq=find(mid);

minx=min(minx,qabs(qaq-s));

qaq=qaq-s;

if(qaq<0

)

else

}cout

<

}

二分答案 NOIP 2011 聰明的質監員

題意 n n 個礦石,每個礦石都有自己的重量 wi role presentation style position relative wiw i,以及價值vi v i。接下來會進行以下四個操作 1.給定 m m 個區間 l i,ri role presentation style position...

P1314 聰明的質監員 二分答案

小t是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 nn 個礦石,從 11到nn 逐一編號,每個礦石都有自己的重量 w iw i 以及價值v iv i 檢驗礦產的流程是 1 給定mm個區間 l i,r i l i,r i 2 選出乙個引數ww 3 對於乙個區間 l i,r i l i,r...

洛谷 P1314 聰明的質監員(二分 字首和)

有兩串數wn,vn 現在有m個區間,同時指定乙個w,每個區間會造成cost等於 最後需要求和y 現在讓我們求乙個w 使得 y s 的值最小。解題思路 首先考慮使用二分列舉w,為什麼用二分呢?因為我們發現yi函式是關於w遞減的,滿足一種單調性。然後我們列舉使得y s的最大的w1,再二分列舉y s的最小...