題目描述
小t是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有n個礦石,從1到 n 逐一編號,每個礦石都有自己的重量wi以及價值vi。檢驗礦產的流程是:
1、給定m個區間[li,ri];
2、選出乙個引數w;
3、對於乙個區間[li,ri],計算礦石在這個區間上的檢驗值 yi :
yi=(sumv[ri]-sumv[li-1])*(sum[ri]-sum[li-1]) 且wj≥w,j是礦石編號
這批礦產的檢驗結果y為各個區間的檢驗值之和。即:y=\sum_^}
若這批礦產的檢驗結果與所給標準值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。注意:不同區間可能重合或相互重疊。
輸出描述:
輸出只有一行,包含乙個整數,表示所求的最小值。
備註:對於 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,0 < wi, vi ≤ 106,0 < s ≤ 1012,1 ≤ li ≤ ri ≤ n
二分w,字首和判斷
#include#include#include#includeusing namespace std;
const int n=2e5+10,m=2*n;
#define int long long
int n,m,s,w[n],v[n];
struct nodee[n];
int sumv[n],sum[n],op;
inline bool check(int mid)else
op=0;
for(int i=1;i<=m;i++)op+=(sumv[e[i].r]-sumv[e[i].l-1])*(sum[e[i].r]-sum[e[i].l-1]);
if(op<=s)return 1;
else return 0;
}signed main()else
} cout<}
luogu P1314 聰明的質監員
小t 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 n 個礦石,從 1到n 逐一編號,每個礦石都有自己的重量 wi 以及價值vi 檢驗礦產的流程是 1 給定m 個區間 li,ri 2 選出乙個引數 w 3 對於乙個區間 li,ri 計算礦石在這個區間上的檢驗值yi 這批礦產的檢驗結果y...
luogu P1314 聰明的質監員 x
小t 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 n 個礦石,從 1到n 逐一編號,每個礦石都有自己的重量 wi 以及價值vi 檢驗礦產的流程是 1 給定m 個區間 li,ri 2 選出乙個引數 w 3 對於乙個區間 li,ri 計算礦石在這個區間上的檢驗值yi 這批礦產的檢驗結果y...
洛谷1314 聰明的質監員
noip2011 day2 t1 題目描述 小t 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 n 個礦石,從 1到n 逐一編號,每個礦石都有自己的重量 wi 以及價值vi 檢驗礦產的流程是 1 給定m 個區間 li,ri 2 選出乙個引數 w 3 對於乙個區間 li,ri 計算礦石在...