BZOJ4360 : achievement
对于$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;
}
BZOJ4360 : achievement的更多相关文章
- GWAS文献解读:The stability of educational achievement across school years is largely explained by genetic factors
方法 从NPD(英国数据库,收集有关学生在学年中学业成绩的数据)和TEDS(英国国家课程指南报告成绩数据库,由国家教育研究基金会和资格与课程管理局制定标准化核心学术课程)数据库获得双胞胎的学业成绩数据 ...
- 学院-成就学院:Academy of Achievement
ylbtech-学院-成就学院:Academy of Achievement 1.返回顶部 1. https://www.achievement.org/ 2. https://www.achieve ...
- 报错【Expression user.achievement is undefined on 】
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总
--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...
- 时隔一年再读到the star
The Star Arthur C. Clarke It is three thousand light-years to the Vatican. Once, I believed that spa ...
- 2013 Asia Regional Changchun C
Little Tiger vs. Deep Monkey Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K ( ...
- JHChart 1.1.0 iOS图表工具库中文ReadMe
JHChart(最新版本1.1.0) 好吧,的确当前的github上已经存有不少的iOS图表工具库,然而,当公司的项目需要图表时,几乎没有哪个第三方能够完全满足我的项目需求.无奈之下,本人不得不花费一 ...
- The Swiss Army Knife of Data Structures … in C#
"I worked up a full implementation as well but I decided that it was too complicated to post in ...
- iOS--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook等系统服务开发汇总
iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: ...
随机推荐
- jpg Test
- Yslow网站性能优化工具
Yslow是一款网站性能优化的插件:
- 防止别人ping自己的服务器
禁止被ping [root@GitLab ~]# echo >/proc/sys/net/ipv4/icmp_echo_ignore_all 无法被ping [root@NB ipv4]# pi ...
- PHP中比较两个时间的大小与日期的差值
在这里我们全用到时间戳 mktime(hour,minute,second,month,day,year,[is_dst]) 其参数可以从右向左省略,任何省略的参数都会被设置成本地日期和时间的 ...
- JavaWeb学习之JSP常用标签、EL表达式的运算符、JSTL标签库(6)
1.JSP常用标签 * 只要支持JSP文件,常用标签有可以直接使用 * 格式: jsp:xxxx * jsp:forward ,完成jsp页面的转发 * page属性:转发的地址 <% requ ...
- PHP类方法重写原则
可能我们日常工作中很少用到这块知识点,但我还是喜欢把遇到的却不清楚的知识点摸清 PHP的类方法重写规则 1.final修饰的类方法不可被子类重写 final修饰的类方法不可被子类重写 即便final ...
- WebRTC代码走读(八):代码目录结构
转载注明出处http://blog.csdn.net/wanghorse ├── ./base //基础平台库,包括线程.锁.socket等 ├── ./build //编译脚本,gyp ├── ./ ...
- ok6410按键中断编程,linux按键裸机
6410按键中断编程 一.流程分析 外部中断控制寄存器(s3c6410x 359页) 1.EINTxCONy: 外部中断组x的第y个控制器.这个就是设置中断的触发方式.有5种触发方式. 2.EINT ...
- 系统调用方式文件编程,王明学learn
系统调用方式文件编程 一.文件描述符 在Linux系统中,所有打开的文件也对应一个数字,这个数字由系统来分配,我们称之为:文件描述符. 二.函数学习 2.1打开文件 open 2.1.2 函数原形 ...
- 第九篇:在SOUI中使用多语言翻译
为UI在不同地区显示不同的语言是产品国际化的一个重要要求. 在SOUI中实现了一套类似QT的多语言翻译机制:布局XML不需要调整,程序代码也不需要调整,只需要为不同地区的用户提供不同的语言翻译文件即可 ...