P1314 聰明的質監員

2021-09-07 12:39:21 字數 3450 閱讀 2794

小t 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 n 個礦石,從 1到n 逐一編號,每個礦石都有自己的重量 wi 以及價值vi 。檢驗礦產的流程是:

1 、給定m 個區間[li,ri];

2 、選出乙個引數 w;

3 、對於乙個區間[li,ri],計算礦石在這個區間上的檢驗值yi:

這批礦產的檢驗結果y 為各個區間的檢驗值之和。即:y1+y2...+ym

若這批礦產的檢驗結果與所給標準值s 相差太多,就需要再去檢驗另一批礦產。小t

不想費時間去檢驗另一批礦產,所以他想通過調整引數w 的值,讓檢驗結果盡可能的靠近

標準值s,即使得s-y 的絕對值最小。請你幫忙求出這個最小值。

輸入格式:

輸入檔案qc.in 。

第一行包含三個整數n,m,s,分別表示礦石的個數、區間的個數和標準值。

接下來的n 行,每行2個整數,中間用空格隔開,第i+1 行表示 i 號礦石的重量 wi 和價值vi。

接下來的m 行,表示區間,每行2 個整數,中間用空格隔開,第i+n+1 行表示區間[li,ri]的兩個端點li 和ri。注意:不同區間可能重合或相互重疊。

輸出格式:

輸出檔名為qc.out。

輸出只有一行,包含乙個整數,表示所求的最小值。

輸入樣例#1:

5 3 15 

1 5

2 5

3 5

4 5

5 5

1 5

2 4

3 3

輸出樣例#1:

10
【輸入輸出樣例說明】

當w 選4 的時候,三個區間上檢驗值分別為 20、5 、0 ,這批礦產的檢驗結果為 25,此

時與標準值s 相差最小為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 。

一開始寫了個莫隊。。發現莫隊只能過樣例。。。

1 #include2 #include3 #include4 #include5 #include6 #include7

#define lli long long int

8using

namespace

std;

9const lli maxn=200001;10

void read(lli &n)

1115

while(c>='

0'&&c<='9'

)16

17 flag==1?n=-x:n=x;18}

19struct

node

20kuang[maxn];

23struct

xw24

q[maxn];

27lli n,m,s;

28 lli ans=0x7ffffff;29

lli pos[maxn];

30 lli base;31

lli num,va;

32 lli comp(const xw &a,const xw &b)

3339

void

add(lli p,lli need)

4046}47

void

dele(lli p,lli need)

4854}55

lli pd(lli need)

5672

if(now-s0)73

77else

return0;

78}79int

main()

8087

for(lli i=1;i<=m;i++)

8891 sort(q+1,q+m+1

,comp);

9293 lli ll=0,rr=5;94

for(lli i=-500;i<=500;i++)

95pd(i);

96 printf("

%lld

",ans);

97return0;

98 }

莫隊

後來聽大佬說直接暴力然後用字首和優化一下就好

1 #include2 #include3 #include4 #include5 #include6 #include7

#define lli long long int

8using

namespace

std;

9const lli maxn=300001;10

void read(lli &n)

1115

while(c>='

0'&&c<='9'

)16

17 flag==1?n=-x:n=x;18}

19struct

node

20kuang[maxn];

23struct

xw24

q[maxn];

27lli n,m,s;

28 lli ans=0x7fffffff;29

lli sum[maxn],num[maxn];

30 lli tot=0;31

lli pd(lli w)

3244

}45 tot=0;46

for (lli i=1;i<=m;i++)

47 tot+=(sum[q[i].r]-sum[q[i].l-1])*(num[q[i].r]-num[q[i].l-1

]);48

if (tot<=s) return

true;49

else

return

false;50

}51intmain()

5260

for(lli i=1;i<=m;i++)

6164

65 lli ll=0,rr=1000000;66

while(ll<=rr)

6774

else ll=mid+1;75

}76 ll=pd(ans);

77 lli a=tot;

78 rr=pd(ans-1

);79 lli b=tot;

80 printf("

%lld

",min(s-a,b-s));

81return0;

82 }

P1314 聰明的質監員

原題連線 首先題號好評qwq 1314 意思就是 我們要在第 i 個區間 li ri 裡找到所有的 j,使得 wj w,求出這些 j 的價值總和及符合條件的 j 的個數,那麼這個區間的貢獻就是這個價值總和乘上 j 的個數,然後我們要算所有區間的貢獻的總和 y 最後輸出 y s 的絕對值的最小值,其中...

P1314 聰明的質監員

我是題面 讀完題後,我們會發現這道題的題意非常簡單,大意就是有n件物品,m個區間,求每個區間檢驗值之和,通過改變引數使標準值與檢驗值的差的絕對值最小 很明顯,檢驗值的變動只與引數有關,我們可以二分引數來搜尋答案 由題意可知,引數至小為0,至大為所有物品中最大的重量,再大則與至大值意義相同 那麼每次用...

P1314 聰明的質監員

p1314 聰明的質監員 這題還是挺有名的,然而是個假題 原因 但是它的思維方式還是挺重要的。思路 我們發現乙個w可以唯一確定乙個y,但是w不知道。像這種情況很容易想到二分。二分可以在 o log n 的時間內多個條件,有時候可以先假裝二分過了去想題,發現不用二分再把二分去掉。但是再算一算,只加上二...