题解:

cdq分治

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

代码:

#include<bits/stdc++.h>
#define y1 ____y1
const int N=;
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>>;
cdq(xl,mid);cdq(mid+,xr);
int l=,r=;
for (int i=xl;i<=mid;i++)
{
while (l<r&&fc(bhd[i],q[r],q[r-]))r--;
q[++r]=bhd[i];
}
for (int i=mid+;i<=xr;i++)
{
while (l<r&&K[q[l]]-K[q[l+]]<=(ll)A[bha[i]]*(d[q[l]]-d[q[l+]]))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+,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+,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=;i<=n;i++)bh[i]=i;
for (int i=;i<=n;i++)
{
scanf("%d%d",&A[i],&d[i]);
d[i]=(d[i]-)/atk+;
}
sort(bh+,bh+n+,comp1);
for (int i=;i<=n;i++)
{
P[i]=P[i-]+d[bh[i]];
T[i]=T[i-]+A[bh[i]];
bhd[i]=bha[i]=bh[i];
}
for (int i=;i<=n;i++)
{
K[bh[i]]=(ll)A[bh[i]]*(P[i]-)+(ll)(T[n]-T[i])*d[bh[i]];
pr+=(ll)A[bh[i]]*(P[i]-);
}
cdq(,n);
printf("%lld",pr-ans);
return ;
}

bzoj4700的更多相关文章

  1. [BZOJ4700]适者(CDQ分治+DP/李超线段树)

    如果没有秒杀,就是经典的国王游戏问题,按t/a从小到大排序即可. 考虑删除两个数i<j能给答案减少的贡献:S[i]*T[i]+P[i-1]*A[i]-A[i]+S[j]*T[j]+P[j-1]* ...

  2. BZOJ4700 适者(贪心+cdq分治+斜率优化)

    首先考虑怎么安排攻击顺序.显然如果攻击了某台兵器就应该一直连续攻击直到将其破坏,破坏所需时间可以直接算出来,设其为b.假设确定了某个破坏顺序,如果交换相邻两个兵器,显然不会对其他兵器造成影响,两种顺序 ...

  3. BZOJ4700: 适者

    先排序,枚举删一个点,在前面找出最优的另一个点,容易推出斜率方程,平衡树维护凸包. #include<bits/stdc++.h> using namespace std; typedef ...

  4. 题解 【BZOJ4700】适者

    题面 解析 看了好多dalao们的题解,然而还是不明白... 于是在想了半天后,决定自己写一篇题解. step 1 首先,分析题意, 应该还是比较容易想到, 要一直攻击一个兵器, 直到破坏它为止. 因 ...

随机推荐

  1. ASCII对应码表-键值(完整版)

    ASCII对应码表-键值(完整版) Bin (二进制) Oct (八进制) Dec (十进制) Hex (十六进制) 缩写/字符 解释 0000 0000 00 0 0x00 NUL(null) 空字 ...

  2. Exp3 免杀原理与实践 20164303 景圣

    Exp3 免杀原理与实践 一.实验内容 1. 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧 2. 通过组合 ...

  3. image management in kubernet

    Image How can I edit an existing docker image metadata? docker-copyedit Registry Disk kubevirtis a g ...

  4. md5 collision(md5碰撞)之记录一些MD5值

    md5 collision之记录一些MD5值   “Magic Hash”的PHP漏洞可以使得攻击者非法获取用户的账号信息.   漏洞原因: PHP以一种特定的方式处理被哈希的字符串,攻击者可以利用其 ...

  5. Linux直播推流

    Linux系统实现youtube推流直播 系统:centos-7 软件:FFMPEG, youtube-dl 1. 安装FFMPEG 创建并cd到一个目录,下载最新的FFMPEG(下面是64位,32位 ...

  6. 【Django试图与网址003】

    Django中网址是写在 urls.py 文件中,用正则表达式对应 views.py 中的一个函数(或者generic类),我们用一个项目来演示. 一,首先,新建一个项目(project), 名称为 ...

  7. [转载]EXCEL绝对引用中$A$1、A$1、$A1三个的区别?

    转自:https://zhidao.baidu.com/question/167695289.html EXCEL绝对引用中$A$1.A$1.$A1三个的区别? 符号“$”加在不地方的含义有何不同? ...

  8. Lintcode174-Remove Nth Node From End of List-Easy

    174. Remove Nth Node From End of List Given a linked list, remove the nth node from the end of list ...

  9. subing用法

    sql中substring截取,start位置索引由1开始 c#中substring截取,start位置索引由0开始

  10. useBean

    Part.java package part; public class Part { String pName;//零件名字 String pColor;//零件颜色 int pQuantity;/ ...