对于$mode=0$的情况:

假设已经知道了最终要做哪些成就,那么这些成就一定是按$b$递减做的。

将成就按$b$从大到小排序,考虑往已选集合里新加一个成就。

假设该成就前面有$t$个已选成就,后面成就的$b$的和为$suf$,那么选该成就对答案的增量为$t\times b+a+suf$。

依次贪心取出增量最小的$k$个成就即可求出最优解。

注意到这就是一条条直线,所以需要维护一个数据结构,支持删除直线、修改直线的截距以及查询某个$x$对应的最小的$y$。

分块后每块维护凸壳即可,因为询问坐标递增,所以每块维护队列即可完成询问。

时间复杂度$O(n\sqrt{n})$。

对于$mode=1$的情况:

$1.$把已选的$k$个成就里某个成就的初始难度将为$0$,枚举每个成就更新答案即可。

$2.$从未选成就里选一个降为$0$,替换掉某个已选成就,需要根据两个成就的相对位置关系讨论。

时间复杂度$O(n)$。

一些常数优化:

$1.$合理调整块大小。

$2.$考虑对偶问题,即假设一开始所有成就都要做,然后贪心删掉$n-k$个成就,可以将$k$控制在$\lfloor\frac{n}{2}\rfloor$以内。

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=100010,M=455,BUF=2500000;
const ll inf=1LL<<62;
char Buf[BUF],*buf=Buf;
int n,m,type,block,i,id,lim,pos[N],st[M],en[M],L[M],R[M],q[N],pre[M];ll tag[M];
bool v[N];int f[N];ll g[N],tmp,ans,old;
struct P{ll k,b,a;}a[N];
inline bool cmp(const P&a,const P&b){return a.k>b.k;}
inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
inline double cross(const P&a,const P&b){return 1.0*(b.b-a.b)/(a.k-b.k);}
inline void build(int x){int l=st[x],r=en[x],t=l-1;for(int i=l;i<=r;i++)if(!v[i]){if(t>=l&&a[q[t]].k==a[i].k)if(a[q[t]].b<=a[i].b)continue;else t--;while(t>l&&cross(a[i],a[q[t]])<cross(a[q[t]],a[q[t-1]]))t--;q[++t]=i;}L[x]=l,R[x]=t;
}
inline void query(int x){int&i=L[x],j=R[x],X=pre[x];ll B=tag[x];if(i>j)return;for(;i<j;i++)if(a[q[i]].k*X+a[q[i]].b<a[q[i+1]].k*X+a[q[i+1]].b)break;ll t=a[q[i]].k*X+a[q[i]].b+B;if(t<tmp)tmp=t,id=i;
}
inline void choose(){int i;tmp=inf;for(i=0;i<=block;i++)query(i);ans+=tmp;int x=q[id],y=pos[x],l=st[y],r=en[y];ll k=a[x].k;v[x]=1;for(i=y+1;i<=block;i++)pre[i]++;for(i=y-1;~i;i--)tag[i]+=k;for(i=x-1;i>=l;i--)a[i].b+=k;for(i=x+1;i<=r;i++)a[i].b+=a[i].k;build(y);
}
inline void build2(int x){int l=st[x],r=en[x],t=l-1;for(int i=l;i<=r;i++)if(v[i]){if(t>=l&&a[q[t]].k==a[i].k)if(a[q[t]].b>=a[i].b)continue;else t--;while(t>l&&cross(a[i],a[q[t]])>cross(a[q[t]],a[q[t-1]]))t--;q[++t]=i;}L[x]=l,R[x]=t;
}
inline void query2(int x){int&i=L[x],j=R[x],X=pre[x];ll B=tag[x];if(i>j)return;for(;i<j;i++)if(a[q[i]].k*X+a[q[i]].b>a[q[i+1]].k*X+a[q[i+1]].b)break;ll t=a[q[i]].k*X+a[q[i]].b+B;if(t>tmp)tmp=t,id=i;
}
inline void choose2(){int i;tmp=-inf;for(i=0;i<=block;i++)query2(i);ans-=tmp;int x=q[id],y=pos[x],l=st[y],r=en[y];ll k=a[x].k;v[x]=0;for(i=y+1;i<=block;i++)pre[i]--;for(i=y-1;~i;i--)tag[i]-=k;for(i=x-1;i>=l;i--)a[i].b-=k;for(i=x+1;i<=r;i++)a[i].b-=a[i].k;build2(y);
}
int main(){fread(Buf,1,BUF,stdin);read(n),read(m),read(type);for(i=0;i<n;i++){int x,y;read(x),read(y);a[i].a=a[i].b=x,a[i].k=y;}sort(a,a+n,cmp);while(lim*lim*2<n)lim++;for(i=0;i<n;i++)pos[i]=i/lim;for(i=0;i<n;i++)en[pos[i]]=i;for(i=n-1;~i;i--)st[pos[i]]=i;block=pos[n-1];if(m+m<=n){for(i=0;i<=block;i++)build(i);for(i=0;i<m;i++)choose();}else{for(i=0;i<n;i++)v[i]=1;for(i=n-1;~i;i--)a[i].b+=tmp,tmp+=a[i].k,ans+=a[i].b;for(i=0;i<n;i++)a[i].b+=a[i].k*i;for(i=0;i<=block;i++)build2(i);for(i=0;i<n-m;i++)choose2();}if(!type)return printf("%lld",ans),0;old=ans;for(i=0;i<n;i++)if(v[i])ans=min(ans,old-a[i].a);for(i=0;i<n;i++){if(i)f[i]=f[i-1];if(v[i])f[i]++;}for(i=n-1;~i;i--){g[i]=g[i+1];if(v[i])g[i]+=a[i].k;}for(i=0;i<n;i++)if(v[i])f[i]--,g[i]-=a[i].k;tmp=inf;for(i=0;i<n;i++)if(v[i])tmp=min(tmp,-a[i].k*f[i]-a[i].a-g[i]);else if(tmp<inf)ans=min(ans,old+tmp+a[i].k*(f[i]-1)+g[i]);tmp=inf;for(i=n-1;~i;i--)if(v[i])tmp=min(tmp,-a[i].k*(f[i]+1)-a[i].a-g[i]);else if(tmp<inf)ans=min(ans,old+tmp+a[i].k*f[i]+g[i]);return printf("%lld",ans),0;
}

  

转载于:https://www.cnblogs.com/clrs97/p/5804548.html

BZOJ4360 : achievement相关推荐

  1. VOA ECONOMICS REPORT - Junior Achievement Marks 90 Years of Business Education

    Junior Achievement(青年成就)从事商业教育90载  MP3节目录音下载 (1.81 M)     PDF 节目文稿下载 (112 K) http://www.unsv.com/voa ...

  2. 2021年6级作文 China‘s achievement in poverty alleviation

    这个单词有些难度,但是结合图表可以猜测出来是扶贫相关. 仍然采用标准的八股三段论 第一段:简要的描述图表,这里不用描述所有数据,只用描述2012年和2020年.然后直接说结论: It can be s ...

  3. DFINITY 与电竞媒体 United Esports 共同推出基于IC的游戏平台 Achievement Unblocked

    智能合约和NFT爆炸式增长正在重新定义游戏的发展,通过在游戏中添加NFT和DeFi协议的方式为玩家提供有价值的游戏体验--GameFi通过在游戏中添加NFT.DeFi协议的创新模式给游戏带来了一个完善 ...

  4. Office 365 Achievement in Information-based Teaching

    2019.1.25 Online Live Speaker Theme: An Ordinary Teacher and His "Classroom Revolution" - ...

  5. 2021年六级英文作文:China’s achievement in higher education.

    第一段简要地描述图表,用图中数据说明中国的高等教育取得了巨大成就.注意不需要详细描述图中的细节. great progress in China's higher education. China's ...

  6. wps linux2019特色功能,WPS Office 2019 for Linux来了

    Linux服务器管理: 系统管理:进程文件信息lsof lsof命令 列出进程打开或使用的文件信息 [root@loclahost/]#lsof [选项] 选项: -c 字符串: 只列出以字符串开头的 ...

  7. 读书笔记2013第13本:《怎样解题》

    <怎样解题>这本书是在看<编程大师访谈录>(中文版第12页)这本书时无意发现的,一个编程大师推荐这本书来指导编程设计,google到这本书后粗略地翻看了一遍,发现是一本教学生如 ...

  8. 为计算机编程序英语作文,计算机编程员英文简历范文

    以下是无忧考网为大家整理的关于计算机编程员英文简历范文的文章,希望大家能够喜欢! Basic information: Name: Yjb ys Gender: Male Age: 21 Nation ...

  9. 机器学习关键的几门课程_互联网上每门机器学习课程,均按您的评论排名

    机器学习关键的几门课程 by David Venturi 大卫·文图里(David Venturi) 互联网上每门机器学习课程,均按您的评论排名 (Every single Machine Learn ...

最新文章

  1. Json 动态获取key 或者获取value
  2. 前沿 | DeepMind 最新研究——神经算术逻辑单元,有必要看一下!
  3. sklearn中随机森林的class_weight的作用?
  4. React创建组件的三种方式及其区别
  5. 课时 28:理解容器运行时接口 CRI(知谨)
  6. 计算用户输入的数字的平均数,并输出大于平均数的数字输出
  7. matlab操作入门实验报告,matlab操作实验报告
  8. Python---modules(模块)
  9. MySQL源码包编译安装
  10. 2016蓝桥杯省赛---java---A---6(寒假作业)
  11. 基于Linux和MiniGUI的嵌入式系统软件开发指南(六)
  12. 指令 出厂_CNC数控加工中心编程指令详解
  13. 关于SQL数据字典的详解
  14. 【系统分析师之路】2021年上系统分析师案例分析历年真题
  15. java 生成 pdf 标题 表格 注释 合并
  16. 模拟器:思科 创建Vlan,给2层交换机和3层交换机配置IP地址和子网掩码
  17. c#+上传文件至服务器,C# 实现文件上传到服务器
  18. linux怎么安装uwf命令,linux实题小练
  19. 图片和文本置顶显示的方法
  20. 程序员被裁员失业有哪些软件众包外包平台可以接单?

热门文章

  1. 计算机多媒体应用软件有超媒体特点吗,《多媒体技术与应用》(本)阶段练习一...
  2. Helm 3 完整教程(十九):Helm 流控制结构(3)range 语句
  3. Helm 3 完整教程(十一):Helm 函数讲解(5)日期函数
  4. gif 动态加载_搞笑GIF:这个游戏最大的成功就是失败!
  5. ORA-22859 无效的列修改
  6. Office Word2019您正试图运行的函数包含有宏或需要宏语言
  7. java数列的个位数求和_java二位数组相加
  8. Servlet→简介、手动编写一个Servlet、使用MyEclipse编写一个Servlet、Servlet生命周期、路径编写规范、初始化参数、MVC设计模式
  9. linux系统q7文件,linux系统安装包的管理
  10. 集训8.21树状数组讲解