在线评测:
http://codevs.cn/problem/1138/
整体思路:
因为每个区间的结果为,这个区间w 》= 标准的矿的数量 *大于标准的矿的 v;所以我们可以发现,w越大,则最后的总和越小,反之,w越小,则最后总和越大,由此可以二分答案,二分标准w,然后判断总和,判总和时,每次处理一个前缀个,这样子是nlogn。
失误之处:
1、什么为了debug方便把样例内置到程序里,然后美滋滋提交上去什么的,,,
2、没注意会炸int之类的,,
3、什么在 er - el 是 》0 还是 》 1纠结了很久之类的,,
1
2
3
4
5
6
7
8
9
10
11
|
while
(er - el > 1)
{
int
midn = (el + er) / 2;
if
(qz(midn) > s)
{
el = midn;
}
else
{
er = midn;
}
}
|
4、什么前缀和的下标差一位两位的啦,,
1
2
3
4
5
6
|
for
(
int
i = 1; i <= m;i++)
{
int
tgs = sum[jl[i].r] - sum[jl[i].l - 1];
//因为是前缀和所以多减去1位
long
long
tzl = zl[jl[i].r] - zl[jl[i].l - 1];
rans += tgs * tzl;
}
|
1
|
printf
(
"%lld\n"
,min(abss(qz(el) - s),abss(qz(er) - s)));
|
体会心得:
认真看范围
认真考虑细节
提交前反复认真检查,,
AC代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using
namespace
std;
struct
ks
{
int
w,v;
};
struct
qz
{
int
l,r;
};
ks sz[300000];
qz jl[300000];
int
sum[300000];
long
long
zl[300000];
int
n,m;
long
long
s;
void
sread()
{
scanf
(
"%d%d%lld"
,&n,&m,&s);
for
(
int
i = 1;i <= n;i++)
{
scanf
(
"%d%d"
,&sz[i].w,&sz[i].v);
}
for
(
int
i = 1;i <= m;i++)
{
scanf
(
"%d%d"
,&jl[i].l,&jl[i].r);
}
}
long
long
qz(
int
w)
{
for
(
int
i = 1;i <= n;i++)
{
if
(sz[i].w >= w)
{
sum[i] = sum[i - 1] + 1;
zl[i] = zl[i - 1] + sz[i].v;
}
else
{
sum[i] = sum[i - 1];
zl[i] = zl[i - 1];
}
}
long
long
rans = 0;
for
(
int
i = 1; i <= m;i++)
{
int
tgs = sum[jl[i].r] - sum[jl[i].l - 1];
//因为是前缀和所以多减去1位
long
long
tzl = zl[jl[i].r] - zl[jl[i].l - 1];
rans += tgs * tzl;
}
return
rans;
}
long
long
abss(
long
long
x)
{
return
x > 0?x:-x;
}
void
swork()
{
int
el = 0,er = 100000;
while
(er - el > 1)
{
// printf("%d %d\n",el,er);
int
midn = (el + er) / 2;
if
(qz(midn) > s)
{
el = midn;
}
else
{
er = midn;
}
}
printf
(
"%lld\n"
,min(abss(qz(el) - s),abss(qz(er) - s)));
}
int
main()
{
sread();
swork();
return
0;
}
|