题解:

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. 【mac微信小助手】WeChatPlugin使用教程!

    微信小助手 mac版集微信防撤回和微信多开等诸多功能于一身,可以有效的阻止朋友微信撤回消息,还能开启无手机验证登录,再也不用每次登录扫码验证啦,非常方便!   wechatplugin mac版安装教 ...

  2. spring-petclinic性能调优实战(转)

    1.spring-petclinic介绍 spring-petclinic是spring官方做的一个宠物商店,结合了spring和其他一些框架的最佳实践. 架构如下: 1)前端 Thymeleaf做H ...

  3. loj 3090 「BJOI2019」勘破神机 - 数学

    题目传送门 传送门 题目大意 设$F_{n}$表示用$1\times 2$的骨牌填$2\times n$的网格的方案数,设$G_{n}$$表示用$1\times 2$的骨牌填$3\times n$的网 ...

  4. Windows server 2012 install .net core sdk 2.2.103

    Windows8.1-KB2919442-x64 Windows8.1-KB2919355-x64 vc_redist.x64 dotnet-sdk-2.2.103-win-x64 dotnet-ho ...

  5. EntityFrameworkCore将数据库Timestamp类型在程序中转为long类型

    EntityFrameworkCore将数据库Timestamp类型在程序中转为long类型 EntityFrameworkCore Entity public class Entity { publ ...

  6. 基于SVD的图像压缩

    算法简介 算法实现 我只是简单处理了一下图像的灰度值,如果要处理RGB值的话,就需要分别进行SVD分解,最后再合起来即可. import numpy as np from PIL import Ima ...

  7. css复合选择器的权重

    选择器的权重 标签选择器的权重为0001 class选择器的权重为0010 id选择器的权重为0100 属性选择器的权重为0010 伪类选择器的权重为0010 伪元素选择器的权重为0010 包含选择器 ...

  8. vue--监听器

    vue当中的属性,侦听器watch computed可以根据数据的变化而变化,而watch也具备同样的功能 既然这么相似,那么两者的区别是什么呢 首先是执行顺序上有一些细微差别,dom加载完成后将立即 ...

  9. 忽略 iconv 转码错误导致输出中断

    在遇到一些特殊字符时候,使用iconv转码会提示报错,导致整段文字输出为空,解决的方法是增加TRANSLIT//IGNORE $str = iconv("UTF-8", " ...

  10. springboot后台控制重定向

    第一种方式: 1. 使用  @Controller  注解而不是  @RestController 2.方法上不要加  @ResponseBody  然后直接返回你要去的页面  比如 return & ...