更好的閱讀體驗
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...