bzoj4700
题解:
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的更多相关文章
- [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]* ...
- BZOJ4700 适者(贪心+cdq分治+斜率优化)
首先考虑怎么安排攻击顺序.显然如果攻击了某台兵器就应该一直连续攻击直到将其破坏,破坏所需时间可以直接算出来,设其为b.假设确定了某个破坏顺序,如果交换相邻两个兵器,显然不会对其他兵器造成影响,两种顺序 ...
- BZOJ4700: 适者
先排序,枚举删一个点,在前面找出最优的另一个点,容易推出斜率方程,平衡树维护凸包. #include<bits/stdc++.h> using namespace std; typedef ...
- 题解 【BZOJ4700】适者
题面 解析 看了好多dalao们的题解,然而还是不明白... 于是在想了半天后,决定自己写一篇题解. step 1 首先,分析题意, 应该还是比较容易想到, 要一直攻击一个兵器, 直到破坏它为止. 因 ...
随机推荐
- C#线程同步(5)- 信号量 Semaphore
文章原始出处 http://xxinside.blogbus.com/logs/47617134.html 预备知识:C#线程同步(1)- 临界区&Lock,C#线程同步(2)- 临界区&am ...
- 洛谷 P5019 铺设道路
题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...
- thinkphp应用目录不可写,目录无法自动生成! 请手动生成项目目录~
一是 要把 html下的相关目录设置成 777 chmod -R 777 /var/www/html/..... 二是 要设置 selinux , 或者是 临时 关闭 selinux: setenfo ...
- 利用Java手写简单的httpserver
前言: 在看完尚学堂JAVA300中讲解如何实现一个最简单的httpserver部分的视频之后, 一.前置知识 1.HTTP协议 当前互联网网页访问主要采用了B/S的模式,既一个浏览器,一个服务器,浏 ...
- pycharm使用selenium之前
2.python安装好后,查看你的pycharm输出控制台,第一行就写了你所使用的python.exe的路径,如下图箭头处所示: 检查python使用的是不是你刚刚安装的,如果不是,换成你刚刚安装的p ...
- IOS Xcode编译项目-报错“ld: library not found for -XX”
一般是因为导入新项目的时候报错的.原因是引入的依赖库的问题.重新执行pod install应该可以解决.不过,有时候如果重新执行pod install无法执行,可以采用以下方法: 在终端中cd到项目所 ...
- 数据结构|-用C#实现一个简单的链表
我们知道C#中是没有链表的,我们可以自己实现一个 整个单链表能实现的功能有: 功能 方法 返回值 备注 获取链表长度 GetLength() int 返回值是链表长度 清空链表 Clear() voi ...
- 使用vue实现自定义搜索功能
实现效果如:http://www.ligerui.com/demos/filter/filter.htm 代码: <%@ Page Language="C#" AutoEve ...
- 【Intellij Idea】Intellij Idea 光标问题即默认改写模式以及部分快捷键失效
一.出现原因: 是因为Intellij Idea安装了IdeaVim插件 二.解决办法: 把ideavim 这个插件停了或卸了,就可以了
- RESTful Level
REST(表述性状态转移)是最近几年讨论的最为热烈的话题之一,其起源于Roy.T.Fielding博士的论文<软件架构风格和基于网路的软件架构设计>.Roy博士在他的论文里从架构风格角度阐 ...