H题小明卖年糕新生赛选拔



#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;

}


猜你喜欢

转载自blog.csdn.net/weixin_43331783/article/details/88321611