題解 洛谷P1314 聰明的質監員

2022-05-16 10:40:32 字數 2270 閱讀 8699

更好的閱讀體驗

portal1: luogu

portal2: libreoj

portal3: vijos

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

給定\(m\)個區間\([l_i, r_i]\);

選出乙個引數\(w\);

對於乙個區間\([l_i, r_i]\),計算礦石在這個區間上的檢驗值\(y_i\):

$y_i=\sum_j1 \times \sum_j,\ j\in[l_i, r_i]$ 且 $w_j\ge w,\ j$是礦石編號

這批礦產的檢驗結果\(y\)為各個區間的檢驗值之和。即:\(y_1 + y_2 + \cdots +y_m\)。

若這批礦產的檢驗結果與所給標準值\(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\)。注意:不同區間可能重合或相互重疊。

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

5 3 15

1 52 5

3 54 5

5 51 5

2 43 3

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

對於\(10\%\)的資料,有\(1 \le n, m \le 10\);

對於\(30\%\)的資料,有\(1 \le n, m \le 500\);

對於\(50\%\)的資料,有\(1 \le n, m \le 5,000\);

對於\(70\%\)的資料,有\(1 \le n, m \le 10,000\);

對於\(100\%\)的資料,有\(1 \le n, m \le 200,000 ,0 < w_i, v_i \le 10^6,0 < s \le 10^,1 \le l_i \le r_i \le n\)。

這道題直接在\([0, \max]\)二分列舉\(w\),對於每乙個列舉出來的\(w\),暴力計算每乙個區間的檢驗值和,這裡使用字首和優化。

#include#include#include#include#includeusing namespace std;

typedef long long ll;

const ll inf = 0x7f7f7f7f7f7f7f7f7f7f;//把ans的初始值設大一點,否則會wa很多

const int maxn = 200005;

int n, m, w[maxn], v[maxn], l[maxn], r[maxn];

ll s, l, r, mid, ans, sum1[maxn], sum2[maxn];//注意開long long

inline bool check(ll x) else

ll s = 0;

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

s += (sum2[r[i]] - sum2[l[i] - 1]) * (sum1[r[i]] - sum1[l[i] - 1]);//暴力計算每乙個區間,累加起來

if (ans > fabs(s - s)) ans = fabs(s - s);//計算與標準值相差的最小值

if (s > s) return 1; else return 0;

}int main()

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

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

r++;

l = 0;

ans = inf;

while (l < r)

printf("%lld\n", ans);

return 0;

}

洛谷 P1314 聰明的質監員

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

洛谷p1314 聰明的質監員

聰明的質監員 題目鏈結 有關演算法 二分答案 但是你只二分答案是不夠的,因為你check會炸,所以還要考慮字首和 首先假裝我們的check已經寫好了,main函式 int main if ls s if ls s printf lld min ans1,ans2 return0 輸入沒有什麼可以說的...

洛谷P1314 聰明的質監員

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