博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【JOISC2019|2019】【20190622】cake3
阅读量:6607 次
发布时间:2019-06-24

本文共 1477 字,大约阅读时间需要 4 分钟。

题目

\(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
    #define ll long long #define inf 1e18using 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
    >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
    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
    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
    <=i&&cal(st[j],i)

转载于:https://www.cnblogs.com/Paul-Guderian/p/11073929.html

你可能感兴趣的文章
「2017 山东三轮集训 Day1」Flair
查看>>
使用SQL Server Analysis Services数据挖掘的关联规则实现商品推荐功能(二)
查看>>
ubuntu下安装jdk
查看>>
C/S与B/S架构比较
查看>>
XML学习总结(2)——XML简单介绍
查看>>
python操作数据库-安装
查看>>
指针和引用的区别
查看>>
vs.net删除转移文件
查看>>
你真的了解interface和内部类么
查看>>
java中常用的类型转换
查看>>
【log4j】使用Log4j?,slf4j更轻巧高效
查看>>
第三章 创建命令
查看>>
kuangbin专题七 POJ3264 Balanced Lineup (线段树最大最小)
查看>>
JS动画效果链接汇总
查看>>
父类转为子类涉及到的安全问题
查看>>
网络流,流水线模拟
查看>>
Asp.net 微信支付
查看>>
mxd文件批量更换版本
查看>>
重新关联bat文件的打开方式为系统默认方式
查看>>
SQL视图&触发器
查看>>