#include<iostream>
#include<stdio.h>
#include<cmath>
#include<cstring>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=200005;
typedef long long ffi;
int n,m;
ffi s;
int l[maxn],r[maxn];
int sl[maxn];
unsigned long long wd[maxn];
struct
{
int w,v;
}ng[maxn];
ffi check(int val)
{
memset(sl,0,sizeof(sl));
memset(wd,0,sizeof(wd));
for(int i=1;i<=n;i++)
{if(ng[i].w>val)
{
sl[i]=sl[i-1]+1;
wd[i]=wd[i-1]+ng[i].v;
}
else
{
sl[i]=sl[i-1];
wd[i]=wd[i-1];
}}
ffi h=0;
for(int i=1;i<=m;i++)
{
int li=l[i];
int ri=r[i];
h+=(sl[ri]-sl[li-1])*(wd[ri]-wd[li-1]);
}
return s-h;
}
int main()
{
scanf("%d%d%lld",&n,&m,&s);
int maxx=0,minn=inf;
for(int i=1;i<=n;i++)
{scanf("%d%d",&ng[i].w,&ng[i].v);
maxx=max(maxx,ng[i].w);
minn=min(minn,ng[i].w);}
for(int i=1;i<=m;i++)
scanf("%d%d",&l[i],&r[i]);
ffi ans=abs(check((minn+maxx)>>1));
while(minn<=maxx)
{
int mid=(maxx+minn)>>1;
ffi k=check(mid);
if(k>=0)
{
maxx=mid-1;
}
else
{
minn=mid+1;
}
k=abs(k);
ans=min(ans,k);
}
printf("%lld\n",ans);
#ifdef OJ
printf("It
cost %lf ms!\n", double(clock())/CLOCKS_PER_SEC * 1000);
#endif
return
0;
}
以上为A了的代码:
1.为什么最后求ans最小值,要先求k=abs(k),不可以带入。暂留疑问
以下为别人A了的代码
1.为什么更改初始ans值为inf会ce
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"string"
#include"queue"
#include"vector"
#include"stack"
#include"map"
#include"set"
#include"algorithm"
#include"limits.h"
#include"fstream"
#include"ctype.h"
#include"time.h"
#include"sstream"
#include"iomanip"
#include"math.h"
using namespace std;
typedef long long LL;
typedef pair<LL, LL> pLL;
typedef pair<LL, int> pLi;
typedef pair<int, LL> piL;
typedef pair<int, int> pii;
typedef unsigned long long uLL;
#define eps 1e-7
#define sf(x) scanf("%d",
&(x))
#define sff(x, y) scanf("%d%d",
&(x), &(y))
#define sfff(x, y,z)
scanf("%d%d%d", &(x), &(y), &(z))
#define for0(i, n) for(int i = 0;i <
(int)(n);++i)
#define for1(i, n) for(int i = 1;i <=
(int)(n);++i)
#define fora(i, a, n) for(int i =
(int)(a);i <= (int)(n);++i)
#define clr(x) memset((x), 0, sizeof((x)))
#define clr1(x) memset((x), -1,
sizeof((x)))
#define MX(x, y) (x) = max((x), (y))
#define MN(x, y) (x) = min((x), (y))
#define DEBUG printf("*****")
const double pi = acos(-1);
const int inf = INT_MAX/2;
const double dinf = 1e100;
const int maxn = 2e5+7;
int n, m;
LL S;
int sum[maxn];
uLL s[maxn];
struct {
int
w, v;
}node[maxn];
int L[maxn], R[maxn];
int tot;
LL check(int x) {
clr(sum);
clr(s);
for1(i,
n) {
if(node[i].w
> x) {
sum[i]
= sum[i-1]+1;
s[i]
= s[i-1] + (LL)node[i].v;
}
else {
sum[i]
= sum[i-1];
s[i]
= s[i-1];
}
}
LL
H = 0;
for1(i,
m) {
int
l = L[i], r = R[i];
H+=(sum[r]-sum[l-1])*(s[r]-s[l-1]);
}
//以下注释配合main函数内注释可以判断H是否单调
//printf("%lld\n",
H);
return
S-H;
}
//#define OJ
int main(void)
{
#ifdef OJ
freopen("f",
"r", stdin);
freopen("b",
"w", stdout);
#endif
sff(n,
m);
scanf("%lld",
&S);
int
mx = 0, mn = inf;
for1(i,
n) {
sff(node[i].w,
node[i].v);
mx
= max(mx, node[i].w);
mn
= min(mn, node[i].w);
}
for1(i,
m) {
sff(L[i],
R[i]);
}
LL
mnn = abs(check(mn+mx>>1));
while(mn<=
mx) {
int
mid=mn+mx>>1;
LL
k = check(mid);
if(k>=0)
{
mx=mid-1;
}
else {
mn=mid+1;
}
mnn
= min(mnn, abs(k));
}
//与check()配合
/* LL
ans = 1e18L;
fora(i,
mn, mx) {
ans
= min(ans, abs(check(i)));
}
printf("%lld
%lld\n", mnn, ans);*/
/*printf("%lld\n",
mnn);
#ifdef OJ
printf("It
cost %lf ms!\n", double(clock())/CLOCKS_PER_SEC * 1000);
#endif
return
0;
}