先解釋一下這個式子:
就是說如果區間[li, ri] 中 wj>=w的個數 乘以 所有的wj>=w的價值的和。
那麼我們可以二分w的值,通過y與s的值來調整w,
具體來講,只要當下的y大於s,那麼增加mid(增大mid質量),否則減小mid。
至於check,我們可以o(n)的預處理字首和 and 字首積。總複雜度 o(nlogn)。
**可能有些傻,好像是debug的時候一頓亂改搞的。。。
#include #define ll long longusing
namespace
std;
inline
intgi ()
while (ch>='
0' && ch<='9'
)
return w?-x:x;
}const
int size=300010
;int n,m,l=2147483647
,r,mid,prenum[size];
ll s,prej[size],ans,minx=999999999999999;
struct
stone s[size];
struct
area a[size];
intmain ()
for (int i=1;i<=m;++i)
l--; r++;
while (l
else
for (int i=1;i<=m;++i)
ans+= (prenum[a[i].r]-prenum[a[i].l-1]) * (prej[a[i].r]-prej[a[i].l-1
]);
if (ans>s) l=mid+1
;
else r=mid;
minx=min (minx, llabs (ans-s) );
} printf (
"%lld\n
", minx);
return0;
}
noip2011 聰明的質檢員
題目描述 小t 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 n 個礦石,從 1到n 逐一編號,每個礦石都有自己的重量 wi 以及價值vi 檢驗礦產的流程是 1 給定m 個區間 li,ri 2 選出乙個引數 w 3 對於乙個區間 li,ri 計算礦石在這個區間上的檢驗值yi 這批礦產的...
NOIP2011 聰明的質檢員
題目傳送門 你有n nn個零件,給你m mm個區間,其中 y i i l iri a i w w i liri a i w w a i vy i sum a i w w sum a i w w a i v yi i li ri a i w w i l i r i a i w w a i v然後你可以...
noip2011提高組 聰明的質檢員
這道題要找乙個引數 這二分妥妥的。不然就t成翔吧。o o 每一次二分 都要預處理 cnt i 表示 對於當前二分到的引數 前 i 個有多少符合要求 sum i 表示 對於當前二分的引數 前 i 個符合要求的點的點權和 然後就按著題意來吧 找到 使結果比標準值小的 最靠近的那乙個 引數 再考慮這個引數...