题目

\(N\) 个物品中选\(M\)个,排列成一个环:\(k_1,\cdots,k_M\)价值为:

\[\sum_{j=1}^{N}{V_i} - \sum_{j=1}^{M}|C_{k_j}- C_{k_{j\%M+1} }|
\]

$3 \le N,M \le 2\times 10^5 $

题解

  • 对于一个\(k\),\(C\)最小的排列的贡献是\(2\ ( max - min)\)

  • 因为将 $ k $ 按 $ C $ 排序,由于最终是一个环, $ C_{k_j} - C_{k_{j+1}} $ 一定会被至少经过两次

  • 将物品按\(C\)排序,枚举最大点,枚举最小点,中间选\(V\)最大的

  • 可以发现从左向右枚举右端点,最小值的选择是单调的

  • 但是单调可能是不连续的,接下来有一个套路:

  • 计算\([l,r]\)的值时,可以先找\(mid = (l + r) /2\) 的最优决策点\(pos_{mid}\)

  • 那么\(pos_{[l,mid-1]} \le pos_{mid} \ , \ pos_{[mid+1,r]} \ge pos_{mid}\) ,分治求下去

  • 需要查找区间前\(m-2\)大的和,如果用主席树实现

  • 时间复杂度:\(O(N \log^2 N )\)

    #include<bits/stdc++.h>
    #define ll long long
    #define inf 1e18 using namespace std; const int N=200010,M=20;
    int n,m,st[N],tp,sub[N],tot,sz,cnt[N*M],ls[N*M],rs[N*M],rt[N];
    ll sum[N*M],a[N],b[N],ans=-inf;
    struct data{int x,y;}A[N];
    bool operator <(data X,data Y){return X.y<Y.y;} void ins(int&k,int lst,int l,int r,int x,int y){
    sum[k=++sz]=sum[lst]+y;cnt[k]=cnt[lst]+1;
    ls[k]=ls[lst],rs[k]=rs[lst];
    if(l==r)return;
    int mid=(l+r)>>1;
    if(x<=mid)ins(ls[k],ls[lst],l,mid,x,y);
    else ins(rs[k],rs[lst],mid+1,r,x,y);
    } ll query(int k,int lst,int l,int r,int x){
    if(l==r||!x)return 1ll*sub[l]*x;
    int mid=(l+r)>>1,tmp=cnt[rs[k]]-cnt[rs[lst]];
    if(x<tmp)return query(rs[k],rs[lst],mid+1,r,x);
    return sum[rs[k]]-sum[rs[lst]]+query(ls[k],ls[lst],l,mid,x-tmp);
    } ll cal(int l,int r){
    if(r-l+1<m)return -inf;
    return a[l]+b[r]+query(rt[r-1],rt[l],1,tot,m-2);
    } void solve(int L,int R,int l,int r){
    if(L>R)return;
    if(l==r){for(int i=L;i<=R;++i)ans=max(ans,cal(st[l],i));}
    int Mid=(L+R)>>1,mid=l;ll tmp=-inf;
    for(int i=l;i<=r;++i){
    ll now=cal(st[i],Mid);
    if(tmp<now)tmp=now,mid=i;
    }
    ans=max(ans,tmp);
    solve(L,Mid-1,l,mid);
    solve(Mid+1,R,mid,r);
    } int main(){
    freopen("cake3.in","r",stdin);
    freopen("cake3.out","w",stdout); scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i){
    scanf("%d%d",&A[i].x,&A[i].y);
    sub[++tot]=A[i].x;
    } sort(sub+1,sub+tot+1);
    tot=unique(sub+1,sub+tot+1)-sub-1;
    sort(A+1,A+n+1); for(int i=1;i<=n;++i){
    int pos=lower_bound(sub+1,sub+tot+1,A[i].x)-sub;
    ins(rt[i],rt[i-1],1,tot,pos,A[i].x); a[i]=A[i].x+2ll*A[i].y;
    b[i]=A[i].x-2ll*A[i].y;
    if(!tp||a[i]>a[st[tp]])st[++tp]=i;
    }
    solve(m,n,1,tp);
    /*ll ans=cal(1,m);
    for(int i=m,j=1;i<=n;++i){
    while(j<tp&&st[j+1]+m-1<=i&&cal(st[j],i)<cal(st[j+1],i))j++;
    ans=max(ans,cal(st[j],i));
    for(int k=1;k<=tp&&st[k]+m-1<=i;++k){
    printf("%lld ",cal(st[k],i));
    }
    puts("");
    }*/
    //这段是不对的,因为并不是所有单调都是连续的
    //像斜率优化的那种可以用单调队列维护的只是单调的一种特殊情况
    //不单调可以用分治做
    //20190623
    cout<<ans<<endl;
    return 0;
    }

【JOISC2019|2019】【20190622】cake3的更多相关文章

  1. 【FJWC 2019】 森林

    [FJWC 2019] 森林 样例输入 0 5 1 0 0 2 样例输出 1 2 3 3 我们发现,答案就是直径加上直径上某个点出发,不经过其他直径上的点的最长链.这里的直径可以是任意一条直径. 首先 ...

  2. 【FJWC 2019】min

    [FJWC 2019]min 题目描述 给你一张 \(n\) 个点 \(m\) 条边的无向图,走过每条边都需要花费 \(1\) 秒. 给你一个整数 \(k\) ,请你选择至多 \(k\) 个点,令经过 ...

  3. IT帮2019年2月线下活动【定义工作,解读自我】之站桩练习

    2019年2月IT帮线下活动[定义工作,解读自我] 昨天的活动收获很大,全面的总结周老师会另写一篇来帮助大家回顾.我想说一下其中最打动我的一句话:“只有你能决定你有多优秀!” “工作中把自己当成企业家 ...

  4. 【Linux】【Apatch Tomcat】Linux、CentOS7安装最新版Apartch Tomcat环境

    1.前言 相当嫌弃,博客园搞掉了我快写完的 Tomcat. 请先安装 :[Linux][Java]CentOS7安装最新版Java1.8.191运行开发环境 虽然安装Tomcat没啥技术,但是还是记录 ...

  5. 【Python】【装饰器】

    Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...

  6. 【转载】【Pycharm编辑器破解步骤】之idea和Pycharm 等系列产品激活激活方法和激活码(附:Mac系统)

    感谢:雪中皓月的<idea和Pycharm 等系列产品激活激活方法和激活码> 第一种方法:使用现有的注册服务器 优点:快捷,方便,省事 缺点:经常被封杀,可能会面临经常激活的困扰 Lice ...

  7. 【北京/上海/南京】【部门直推】【可查询】【实习&社招】字节跳动数据平台前端内推

    [北京/上海/南京][部门直推][可查询][实习&社招]字节跳动数据平台前端内推 重要信息,写在前面  [投递邮箱]chengxinsong@bytedance.com [微信扫码] 2019 ...

  8. 【Robot Framework 项目实战 04】基于录制,生成RF关键字及 自动化用例

    背景 因为服务的迁移,Jira版本的更新,很多接口文档的维护变少,导致想要编写部分服务的自动化测试变得尤为麻烦,很多服务,尤其是客户端接口需要通过抓包的方式查询参数来编写自动化用例,但是过程中手工重复 ...

  9. 虚树+【BZOJ2286】【SDOI2011】消耗战(虚树)(DP)

    先看一道题: [BZOJ2286][SDOI2011]消耗战 Description 在一场战争中,战场由n个岛屿和n−1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总 ...

随机推荐

  1. Python 基础-import 与 from...import....

    简单说说python import与from-import- 在python用import或者from-import来导入相应的模块.模块其实就一些函数和类的集合文件,它能实现一些相应的功能,当我们需 ...

  2. C#使用CSS选择器抓取页面内容

    最近在查wpf绘图资料时,偶然看到Python使用CSS选择器抓取网页的功能.觉得很强,这里用C#也实现一下. 先介绍一下CSS选择器 在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素. ...

  3. selenium中的元素操作之三大等待(一)

    等待时做什么,为什么使用等待 在做自动化测试,设计测试用例的时候,有时下一步的操作会依赖上一步的结果或者内容,上一步操作成功之后才能进行下一步操作等,这时候,我们就需要使用等待,来判断上一步操作是否完 ...

  4. Date类的相关方法记录

    1.Date类中的时间单位是毫秒,System.currentTimeMills()方法就是获取当前时间到1970年1月1日0时0分0秒(西方时间)的毫秒数. public class Test6 { ...

  5. 2019 东软java面试笔试题 (含面试题解析)

    本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.东软等公司offer,岗位是Java后端开发,最终选择去了东软. 面试了很多家公司,感觉大部分公司考察的点都差不多 ...

  6. 2019 蚂蚁金服java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.蚂蚁金服等公司offer,岗位是Java后端开发,因为发展原因最终选择去了蚂蚁金服,入职一年时间了,也成为了面 ...

  7. Java之路---Day01

    2019-10-17-19:36:43 标识符: 标识符:是指在程序中,自己定义的内容.如:类名.方法名.变量名等 命名规则(硬性要求): 1.有英文字母(区分大小写).数字.$(美元符)._(下划线 ...

  8. HttpClient使用详解与实战一:普通的GET和POST请求

    简介 HttpClient是Apache Jakarta Common下的子项目,用来提供高效的.最新的.功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议. Htt ...

  9. Spring 实战 第4版 读书笔记

    第一部分:Spring的核心 1.第一章:Spring之旅 1.1.简化Java开发 创建Spring的主要目的是用来替代更加重量级的企业级Java技术,尤其是EJB.相对EJB来说,Spring提供 ...

  10. 用navicat操作oracle新建表空间、用户名、密码

    转载从:https://www.cnblogs.com/franson-2016/p/5925593.html 首先.我们来新建一个表空间.打开Navicat for Oracle,输入相关的的连接信 ...