$fl[i]$表示从$S$向左走,用了不超过$i$天且不回头的最大收益。

$fr[i]$表示从$S$向右走,用了不超过$i$天且不回头的最大收益。

$gl[i]$表示从$S$向左走,用了不超过$i$天且回到$S$的最大收益。

$gr[i]$表示从$S$向右走,用了不超过$i$天且回到$S$的最大收益。

都可以通过枚举端点然后用可持久化线段树贪心。

最优决策具有完全单调性,故分治处理即可。

时间复杂度$O(n\log^2n)$。

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=100010,M=N*18;
int n,m,S,i,a[N],b[N],tot,T[N],l[M],r[M],v[M];ll s[M],fl[N*3],fr[N*3],gl[N*3],gr[N*3],ans;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline int lower(int x){
  int l=1,r=n,t,mid;
  while(l<=r)if(b[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
  return t;
}
int ins(int x,int a,int b,int c,int p){
  int y=++tot;
  v[y]=v[x]+1,s[y]=s[x]+p;
  l[y]=r[y]=0;
  if(a==b)return y;
  int mid=(a+b)>>1;
  if(c<=mid)l[y]=ins(l[x],a,mid,c,p),r[y]=r[x];else l[y]=l[x],r[y]=ins(r[x],mid+1,b,c,p);
  return y;
}
inline ll ask(int x,int y,int k){
  if(k<=0)return k;
  if(k>=v[x]-v[y])return s[x]-s[y];
  int a=1,b=n,t,mid;ll ret=0;
  while(a<b){
    mid=(a+b)>>1,t=v[r[x]]-v[r[y]];
    if(k<=t)x=r[x],y=r[y],a=mid+1;else k-=t,ret+=s[r[x]]-s[r[y]],x=l[x],y=l[y],b=mid;
  }
  return ret+1LL*k*::b[a];
}
void FL(int l,int r,int dl,int dr){
  int mid=(l+r)>>1,dm;ll f=0;
  for(int i=dr;i>=dl;i--){
    ll t=ask(T[S],T[i-1],mid-S+i);
    if(t>=f)dm=i,f=t;
  }
  fl[mid]=f;
  if(l<mid)FL(l,mid-1,dm,dr);
  if(r>mid)FL(mid+1,r,dl,dm);
}
void GL(int l,int r,int dl,int dr){
  int mid=(l+r)>>1,dm;ll f=0;
  for(int i=dr;i>=dl;i--){
    ll t=ask(T[S],T[i-1],mid-2*S+2*i);
    if(t>=f)dm=i,f=t;
  }
  gl[mid]=f;
  if(l<mid)GL(l,mid-1,dm,dr);
  if(r>mid)GL(mid+1,r,dl,dm);
}
void FR(int l,int r,int dl,int dr){
  int mid=(l+r)>>1,dm;ll f=0;
  for(int i=dl;i<=dr;i++){
    ll t=ask(T[i],T[S-1],mid-i+S);
    if(t>=f)dm=i,f=t;
  }
  fr[mid]=f;
  if(l<mid)FR(l,mid-1,dl,dm);
  if(r>mid)FR(mid+1,r,dm,dr);
}
void GR(int l,int r,int dl,int dr){
  int mid=(l+r)>>1,dm;ll f=0;
  for(int i=dl;i<=dr;i++){
    ll t=ask(T[i],T[S-1],mid-2*i+2*S);
    if(t>=f)dm=i,f=t;
  }
  gr[mid]=f;
  if(l<mid)GR(l,mid-1,dl,dm);
  if(r>mid)GR(mid+1,r,dm,dr);
}
int main(){
  read(n),read(S),read(m);S++;
  for(i=1;i<=n;i++)read(a[i]),b[i]=a[i];
  for(sort(b+1,b+n+1),i=1;i<=n;i++)if(i!=S)T[i]=ins(T[i-1],1,n,lower(a[i]),a[i]);else T[i]=T[i-1];
  FL(1,m,1,S),GL(1,m,1,S);
  FR(1,m,S,n),GR(1,m,S,n);
  for(i=0;i<=m;i++)ans=max(ans,max(fl[i]+gr[m-i],fr[i]+gl[m-i]));
  for(i=0;i<m;i++)ans=max(ans,max(fl[i]+gr[m-i-1],fr[i]+gl[m-i-1])+a[S]);
  return printf("%lld",ans),0;
}

  

BZOJ4367 : [IOI2014]holiday假期的更多相关文章

  1. react+react-router+react-redux+nodejs+mongodb项目

    一个实际项目(OA系统)中的部分功能.这个demo中引入了数据库,数据库使用了mongodb.安装mongodb才能运行完整的功能.要看完整的项目可以移步我的github 技术栈 React v15. ...

  2. IOI2014 day2 task4 Holiday

    题目 题目链接 大意:从左到右有\(n\)个城市,一开始在城市\(start\),每一天有两种选择: 前往相邻的城市. 访问当前城市(每个城市只能访问一次),访问城市\(i\)可以获得\(attrac ...

  3. BZOJ1433 ZJOI2009 假期的宿舍 二分图匹配

    1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2375  Solved: 1005[Submit][Sta ...

  4. 假期实践作业:从IT角度看地铁

    实习时间:2016/02/23——2016/02/26 实习地点:京港地铁14号线 实习报告: 大学四年过得真快,转眼就大三了,大学前两年半的生活可谓多姿多彩,从不懂计算机到对编程感兴趣,期待得最多的 ...

  5. 2055 [ZJOI2009]假期的宿舍

    P2055 [ZJOI2009]假期的宿舍 题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A ...

  6. 【UOJ #29】【IOI 2014】holiday

    http://uoj.ac/problem/29 cdq四次处理出一直向左, 一直向右, 向左后回到起点, 向右后回到起点的dp数组,最后统计答案. 举例:\(fi\)表示一直向右走i天能参观的最多景 ...

  7. 假期(codevs 3622)

    题目描述 Description 经过几个月辛勤的工作,FJ决定让奶牛放假.假期可以在1-N天内任意选择一段(需要连续),每一天都有一个享受指数W.但是奶牛的要求非常苛刻,假期不能短于P天,否则奶牛不 ...

  8. BZOJ-1433 假期的宿舍 最大流+基础建图

    网络流练习ing.. 1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1748 Solved: 765 [S ...

  9. 水题 ZOJ 3876 May Day Holiday

    题目传送门 /* 水题:已知1928年1月1日是星期日,若是闰年加1,总天数对7取余判断就好了: */ #include <cstdio> #include <iostream> ...

随机推荐

  1. Python 配置日志

    Python 2.6+ def cfgLogging(): from logging.handlers import RotatingFileHandler console = logging.Str ...

  2. XmlSpy / XSD 以及 验证

    很早以前看过一句话:“XML就象空气”,在企业应用开发中XML是一个重要的数据交换标准.而XSD则可以用来校验XML的数据格式是否正确. 一个典型的XSD文件如下: <?xml version= ...

  3. 【BZOJ-4213】贪吃蛇 有上下界的费用流

    4213: 贪吃蛇 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 58  Solved: 24[Submit][Status][Discuss] Desc ...

  4. 介绍开源的.net通信框架NetworkComms框架 源码分析(十三)ThreadSafeStream

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是 ...

  5. js 精确小数俩位

    function toDecimal2(x) {                          var f = parseFloat(x);                          if ...

  6. [转载] 单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构

    原文: http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=209406532&idx=1&sn=2e9b0cc02bdd ...

  7. UILocalNotification详解

    以下内容来自网络 本地Notification所使用的对象是UILocalNotification,UILocalNotification的属性涵盖了所有处理Notification需要的内容.UIL ...

  8. erlang的shell历史记录

    erlang的shell默认重启以后木有历史记录,略蛋疼,开发的时候略不便 网上找了个方式 sudo apt-get install rlwrap vim ~/.bash_profile alias ...

  9. ASP.NET MVC ModelState

    添加一个模型状态: ModelState.Add("IamKey", new ModelState { Value = new ValueProviderResult(" ...

  10. [itint5]支持删除的后继查询

    http://www.itint5.com/oj/#49 这一题一开始想到是用HashSet+链表来做,链表记录prev和next.这样也可以,后来看到都是连续的整数,而且交流了一下觉得可以用类似并查 ...