小 t 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有n個礦石,從1到n逐一編號,每個礦石都有自己的重量wi以及價值vi。檢驗礦產的流程是:
1、給定m個區間[li,ri];
2、選出乙個引數w;
3、對於乙個區間[li,ri],計算礦石在這個區間上的檢驗值yi:
yi = ∑1*∑vj,j∈[li, ri]且wj ≥ w,j是礦石編號
這批礦產的檢驗結果y 為各個區間的檢驗值之和。即:y = ∑yi,i ∈[1, m]
若這批礦產的檢驗結果與所給標準值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。注意:不同區間可能重合或相互重疊。
輸出只有一行,包含乙個整數,表示所求的最小值。
5 3 151 52 5
3 54 5
5 51 5
2 43 3
1s樣例說明:當w選4的時候,三個區間上檢驗值分別為20、5、0,這批礦產的檢驗結果為25,此時與標準值s相差最小為10。10
對於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 ≤ 10^6,0 < s ≤ 10^12,1 ≤ li ≤ ri ≤ n。
noip2011提高組day2第二題
這道題目我們可以發現隨著w的增大,最後的y也是增大的,所以我們可以二分出最接近s的幾個w試一下。演算法複雜度是o(nlogw)的。是可以做的。
1view code/*author:wnjxyk
*/2 #include3 #include4
using
namespace
std;
5const
int maxn=200000;6
long
long w[maxn+10],v[maxn+10];7
long
long num[maxn+10],vs[maxn+10];8
int l[maxn+10],r[maxn+10];9
long
long
s;10
intn,m;
11long
long
maxw;
12 inline long
long abs(long
long
x)16 inline long
long getans(int
x)else
26 num[i]+=num[i-1
];27 vs[i]+=vs[i-1
];28}29
long
long ans=0;30
for (int i=1;i<=m;i++)
33return
ans;34}
35int
main()else
48}
49long
long ans=abs(getans(left)-s);
50for (int i=left+1;i<=right;i++)
54 printf("
%lld\n
",ans);
55return0;
56 }
vijos P1740 聰明的質檢員
題目大意 給你n個物品,每件物品有重量 w 和價值 v,給m個區間,和乙個標準值。n,m最大200000 要求找到乙個值x,使得m個所有區間的權值和與標準值的差的絕對值最小。單個區間權值計算公式 數目num 0,價值sum 0,若滿足 wi x 則 num,sum vi 單個區間權值為num sum...
聰明的質檢員
問題描述 小 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的值,讓檢驗結果...