小t
是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 nnn 個礦石,從 111 到 nnn 逐一編號,每個礦石都有自己的重量 wiw_iwi以及價值 viv_ivi。檢驗礦產的流程是:
1 、給定 m個區間 [li,ri];
2 、選出乙個引數 w;
3 、對於乙個區間 [li,ri],計算礦石在這個區間上的檢驗值 yi:
這批礦產的檢驗結果 y為各個區間的檢驗值之和。即: y1+y2...+ym
若這批礦產的檢驗結果與所給標準值 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。注意:不同區間可能重合或相互重疊。
輸出格式:
乙個整數,表示所求的最小值。
暴力是不行的啦,而我又不會別的qwq
所以我就想辦法開始優化
一看w才1e6,好辦,可以二分答案了。
每次二分乙個答案,然後驗證
如果二分出來的答案s-y小於0,那麼可能最優解在他的右邊
反之亦然
記得每次都要更新答案喲。
怎麼驗證呢?
我們就要用到字首和
每次二分出乙個數,我就按這個條件o(n)算出字首和
詢問的回答就可以o(1)了
#include#include#include
#include
#define rii register int i
#define rij register int j
#define inf 19260817
#define int long long
using
namespace
std;
long
long qzhv[1000005],qzhw[1000005],s,n,m,v[200005],w[200005
];long
long
maxn,minx;
long
long z[200005],y[200005
];long
long find(int
wz) }
for(rii=1;i<=m;i++)
return
ans;
}long
long qabs(long
long
val)
else
}signed main()
for(rii=1;i<=m;i++)
int l=minx-1
;
int r=maxn+2
; minx=9999999999999999
;
while(l!=r)
int mid=(l+r)/2
;
long
long qaq=find(mid);
minx=min(minx,qabs(qaq-s));
qaq=qaq-s;
if(qaq<0
)
else
}cout
<
}
二分答案 NOIP 2011 聰明的質監員
題意 n n 個礦石,每個礦石都有自己的重量 wi role presentation style position relative wiw i,以及價值vi v i。接下來會進行以下四個操作 1.給定 m m 個區間 l i,ri role presentation style position...
P1314 聰明的質監員 二分答案
小t是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 nn 個礦石,從 11到nn 逐一編號,每個礦石都有自己的重量 w iw i 以及價值v iv i 檢驗礦產的流程是 1 給定mm個區間 l i,r i l i,r i 2 選出乙個引數ww 3 對於乙個區間 l i,r i l i,r...
洛谷 P1314 聰明的質監員(二分 字首和)
有兩串數wn,vn 現在有m個區間,同時指定乙個w,每個區間會造成cost等於 最後需要求和y 現在讓我們求乙個w 使得 y s 的值最小。解題思路 首先考慮使用二分列舉w,為什麼用二分呢?因為我們發現yi函式是關於w遞減的,滿足一種單調性。然後我們列舉使得y s的最大的w1,再二分列舉y s的最小...