二分 字首和 聰明的質檢員

2021-10-02 06:26:28 字數 2675 閱讀 8592

問題 f: 【noip2011提】聰明的質監員(day 2)

時間限制:

1 sec  

記憶體限制: 128 mb

53  解決: 9

[提交] [狀態] [討論版]

題目描述

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

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

2. 選出乙個引數w;

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

這批礦產的檢驗結果y為各個區間的檢驗值之和。即:

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

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

接下來的n行,每行2個整數,中間用空格隔開,第i+1行表示i號礦石的重量w

i 和價值v

i 。

接下來的m行,表示區間,每行2個整數,中間用空格隔開,第i+n+1行表示區間[l

i , r

i ]的兩個端點l

i 和r

i 。注意:不同區間可能重合或相互重疊。

資料規模:

對於10%的資料,有1≤n,m≤10;

對於30%的資料,有1≤n,m≤500;

對於50%的資料,有1≤n,m≤5,000;

對於70%的資料,有1≤n,m≤10,000;

對於100%的資料,有1≤n,m≤200,000,06

,012

,1≤l

i ≤r

i ≤n。

輸出 每組輸出只有一行,包含乙個整數,表示所求的最小值。

下面是對樣例資料的解釋:

當w選4的時候,三個區間上檢驗值分別為20、5、0,這批礦產的檢驗結果為25,此時與標準值s相差最小為10。

樣例輸入 copy

5 3 15

1 52 5

3 54 5

5 51 5

2 43 3

樣例輸出 copy 10

## **:

#include

using

namespace std;

vector

int,

int>

>a;

vector

int,

int>

>q;

int n,m;

unsigned

long

long s;

int sum_num[

2000009

],sum_v[

20000009];

unsigned

long

long

check

(long

long x)

for(

int i=

1;i<=m;i++

)return sum;

}unsigned

long

long

aabs

(unsigned

long

long q,

unsigned

long

long p)

intmain()

for(

int i=

1;i<=m;i++

)long

long l=

0,r=

1<<20;

// int ans=s;

while

(lunsigned

long

long x1=

aabs

(s,check

(l))

,x2=

aabs

(s,check

(l+1))

;if(x1>x2)

cout<

else cout<

return0;

}

首先其實主要思路很簡單,二分所需要的w的值,然後二分模板找對,就可以了。

但是既然是提高+的難度怎麼可能只是二分這麼簡單

這道題坑了我大概乙個下午:

要點有這些:

考慮一下時間複雜度,因為m很大而且區間重複,所以如果在check的時候每個區間都去算一遍的話很容易超時。所以要考慮優化。那麼既然m這麼大,我們就要考慮在o(n)的時間度中完成計算,基本上就是把這個區間掃一遍就得出答案的那種。這種就可以考慮一下單調佇列或字首差分(這裡用字首)。在掃過每乙個點的編號的時候記錄這個點的字首個數和價值量。最後計算的時候,列舉每個區間,用end-(start-1)來計算這個區間中的點數和價值量。

~~三年oi一場空,不開long long見祖宗現場~~其實仔細看看s的值很大的。所以盡量用long long。

以及讓我得95分一直ac不了的地方在做sum的累積時沒有強行轉化long long

二分 字首和 聰明的質檢員 洛谷P1314

題意 給出n個產品的重量w和價值v,給定m個區間,每個區間通過乙個包含引數w的式子來計算,使總的值逐漸逼近乙個值s 分析 很明顯w為0時,所有產品都滿足,此時y最大,當w比重量w的最大值還大時,所有產品都不滿足,此時y最小,可以明顯看出單調性,我們可以採用二分的方法來做 二分的話如果每次判斷的話都是...

聰明的質檢員

問題描述 小 t 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 n 個礦石,從 1 到 n 逐一編號,每個礦石都有自己的重量wi 以及價值vi 檢驗礦產的流程是 1.給定 m個區間 l i,ri 2.選出乙個引數 w 3.對於乙個區間 l i,ri 計算礦石在這個區間上的檢驗值yi y...

聰明的質檢員

題目描述 小t是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有n個礦石,從1到n逐一編號,每個礦石都有自己的重量wi以及價值vi。檢驗礦產的流程見圖。若這批礦產的檢驗結果與所給標準值s相差太多,就需要再去檢驗另一批礦產。小t不想費時間去檢驗另一批礦產,所以他想通過調整引數w的值,讓檢驗結果...