bzoj4700

Posted 宣毅鸣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj4700相关的知识,希望对你有一定的参考价值。

题解:

cdq分治

先考虑没有人被秒掉的情况

代码:

#include<bits/stdc++.h>
#define y1 ____y1
const int N=300005;  
using namespace std;  
typedef long long ll;  
int bh[N],q[N],bhd[N],bha[N],A[N],d[N],P[N],T[N],n,atk;  
ll ans,pr,K[N];  
int comp1(const int x,const int y)
{
    return A[x]*d[y]>A[y]*d[x];
}  
int fc(int x,int y,int z)
{  
    ll x1=d[x],y1=K[x],x2=d[y],y2=K[y],x3=d[z],y3=K[z];  
    return (y1-y2)*(x2-x3)>=(y2-y3)*(x1-x2);  
}  
void cdq(int xl,int xr)
{  
    if (xl==xr)return;   
    int mid=xl+xr>>1;  
    cdq(xl,mid);cdq(mid+1,xr);  
    int l=1,r=0;  
    for (int i=xl;i<=mid;i++)
     {  
        while (l<r&&fc(bhd[i],q[r],q[r-1]))r--;  
        q[++r]=bhd[i];  
     }  
    for (int i=mid+1;i<=xr;i++)
     {  
        while (l<r&&K[q[l]]-K[q[l+1]]<=(ll)A[bha[i]]*(d[q[l]]-d[q[l+1]]))l++;
        if (l<=r)ans=max(ans,K[bha[i]]+K[q[l]]-(ll)A[bha[i]]*d[q[l]]);  
     }  
    int i=xl,j=mid+1,ptr=xl;  
    for (;i<=mid&&j<=xr;)
     {  
        if (d[bhd[i]]<d[bhd[j]])bh[ptr++]=bhd[i++];  
        else bh[ptr++]=bhd[j++];  
     }  
    for (;i<=mid;)bh[ptr++]=bhd[i++];  
    for (;j<=xr;)bh[ptr++]=bhd[j++];  
    for (int i=xl;i<=xr;i++)bhd[i]=bh[i];  
    i=xl,j=mid+1,ptr=xl;  
    for (;i<=mid&&j<=xr;)
     {  
        if (d[bha[i]]<d[bha[j]])bh[ptr++]=bha[i++];  
        else bh[ptr++]=bha[j++];  
     }   
    for (;i<=mid;)bh[ptr++]=bha[i++];  
    for (;j<=xr;)bh[ptr++]=bha[j++];  
    for (int i=xl;i<=xr;i++)bha[i]=bh[i];  
}  
int main()
{  
    scanf("%d%d",&n,&atk);  
    for (int i=1;i<=n;i++)bh[i]=i;  
    for (int i=1;i<=n;i++)
     {
        scanf("%d%d",&A[i],&d[i]);  
        d[i]=(d[i]-1)/atk+1;  
     }
    sort(bh+1,bh+n+1,comp1);  
    for (int i=1;i<=n;i++)
     {
        P[i]=P[i-1]+d[bh[i]];
        T[i]=T[i-1]+A[bh[i]];
        bhd[i]=bha[i]=bh[i]; 
     }
    for (int i=1;i<=n;i++)
     {  
        K[bh[i]]=(ll)A[bh[i]]*(P[i]-1)+(ll)(T[n]-T[i])*d[bh[i]];  
        pr+=(ll)A[bh[i]]*(P[i]-1);  
     }  
    cdq(1,n);  
    printf("%lld",pr-ans);  
    return 0;
}  

 

以上是关于bzoj4700的主要内容,如果未能解决你的问题,请参考以下文章

#4700. Access

DS4700 存储正确启停顺序

Bzoj2339--Hnoi2011卡农

为啥我在运行查询时收到错误 -4700(尝试使用新功能模式)?

DS4700电池更换步骤

DS4700电池更换步骤