题目描述

健佳正在制定下个假期去台湾的游玩计划。在这个假期,健佳将会在城市之间奔波,并且参观这些城市的景点。
在台湾共有n个城市,它们全部位于一条高速公路上。这些城市连续地编号为0到n-1。对于城市i(0<i<n-1)而言,与其相邻的城市是i-1和i+1。但是对于城市 0,唯一与其相邻的是城市 1。而对于城市n-1,唯一与其相邻的是城市n-2。
每个城市都有若干景点。健佳有d天假期并且打算要参观尽量多的景点。健佳已经选择了假期开始要到访的第一个城市。在假期的每一天,健佳可以选择去一个相邻的城市,或者参观所在城市的所有景点,但是不能同时进行。即使健佳在同一个城市停留多次,他也不会去重复参观该城市的景点。请帮助健佳策划这个假期,以便能让他参观尽可能多的景点。

题解

很容易发现,路线只有四种可能,一直往左走,一直往右走,先左走后右走,先右走后左走。

他能够游览的范围是一段区间,暴力的话就是枚举这段区间的左右端点,然后查一下区间前k大。

然后考虑优化,一直往左或往右这个可以直接扫描+主席树,不用优化。

后面两种情况本质相同,下面只讨论先左走后右走的情况。

假设我们有一堆询问,为先向左走到i这个点,再往右走到y这个点,当y为多少时最优。

结论,当i减小的时候,y是单调不增的。证明自己yy一下就差不多。

然后我们就可以solve(l,r,L,R)表示询问为l~r,答案区间为L~R,类似整体二分的做就可以了。

细节:又犯了SB错误,这个错误犯了好几次了,就是主席树查询到叶子节点时要

    if(l==r)return (tr[now]-tr[pre])/(cnt[now]-cnt[pre])*k; 

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 100009
using namespace std;
typedef long long ll;
int b[N],a[N],tot,L[N*],R[N*],cnt[N*],s,d,n,top,T[N];
ll ans,tr[N*];
inline int rd(){
int x=;char c=getchar();bool f=;
while(!isdigit(c)){if(c=='-')f=;c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return f?-x:x;
}
inline void upd(int &now,int pre,int l,int r,int x){
now=++tot;L[now]=L[pre];R[now]=R[pre];tr[now]=tr[pre]+b[x];cnt[now]=cnt[pre]+;
if(l==r)return;
int mid=(l+r)>>;
if(mid>=x)upd(L[now],L[pre],l,mid,x);
else upd(R[now],R[pre],mid+,r,x);
}
inline ll query(int now,int pre,int l,int r,int k){
if(cnt[now]-cnt[pre]<=k)return tr[now]-tr[pre];
if(l==r)return (tr[now]-tr[pre])/(cnt[now]-cnt[pre])*k;
int mid=(l+r)>>,num=cnt[R[now]]-cnt[R[pre]];
if(num<k)return tr[R[now]]-tr[R[pre]]+query(L[now],L[pre],l,mid,k-num);
else return query(R[now],R[pre],mid+,r,k);
}
void solve1(int l,int r,int L,int R){
if(l>r)return;
int mid=(l+r)>>,id=L;ll num=;
for(int i=L;i<=R;++i){
int kk=i-mid+s-mid;if(i==s)kk=i-mid;
if(kk>d)continue;
ll x=query(T[i],T[mid-],,top,d-kk);
if(x>num)num=x,id=i,ans=max(ans,x);
}
solve1(l,mid-,L,id);solve1(mid+,r,id,R);
}
void solve2(int l,int r,int L,int R){
if(l>r)return;
int mid=(l+r)>>,id=R;ll num=;
for(int i=L;i<=R;++i){
int kk=mid-i+mid-s;if(i==s)kk=mid-i;
if(kk>d)continue;
ll x=query(T[mid],T[i-],,top,d-kk);
if(x>num)num=x,id=i,ans=max(ans,x);
}
solve2(l,mid-,L,id);solve2(mid+,r,id,R);
}
int main(){
n=rd();s=rd();d=rd();s++;
for(int i=;i<=n;++i)a[i]=rd(),b[i]=a[i];
sort(b+,b+n+);top=unique(b+,b+n+)-b-;
for(int i=;i<=n;++i){
a[i]=lower_bound(b+,b+top+,a[i])-b;
upd(T[i],T[i-],,top,a[i]);
}
solve1(,s,s,n);solve2(s,n,,s);
cout<<ans;
return ;
}

[IOI2014]holiday假期(分治+主席树)的更多相关文章

  1. 【BZOJ4367】[IOI2014]holiday假期 分治+主席树

    [BZOJ4367][IOI2014]holiday假期 Description 健佳正在制定下个假期去台湾的游玩计划.在这个假期,健佳将会在城市之间奔波,并且参观这些城市的景点.在台湾共有n个城市, ...

  2. [BZOJ4367][IOI2014]Holiday(决策单调性+分治+主席树)

    4367: [IOI2014]holiday假期 Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 421  Solved: 128[Submit][Sta ...

  3. luogu P5892 [IOI2014]holiday 假期 决策单调性优化dp 主席树

    LINK:holiday 考虑第一个subtask. 容易想到n^2暴力枚举之后再暴力计算答案. 第二个subtask 暴力枚举终点可以利用主席树快速统计答案. 第三个subtask 暴力枚举两端利用 ...

  4. LOJ#3097 [SNOI2019]通信 最小费用最大流+cdq分治/主席树/分块优化建图

    瞎扯 我们网络流模拟赛(其实是数据结构模拟赛)的T2. 考场上写主席树写自闭了,直接交了\(80pts\)的暴力,考完出来突然发现: woc这个题一个cdq几行就搞定了! 题意简述 有\(n\)个哨站 ...

  5. BZOJ 1935 Tree 园丁的烦恼 CDQ分治/主席树

    CDQ分治版本 我们把询问拆成四个前缀和,也就是二维前缀和的表达式, 我们把所有操作放入一个序列中 操作1代表在x,y出现一个树 操作2代表加上在x,y内部树的个数 操作3代表减去在x,y内部树的个数 ...

  6. P4755 Beautiful Pair (分治 + 主席树)

    题意:1e5的数组 计算有多少对 ai * aj <= max(ai ai+1...aj-1 aj) 题解:在处理这种涉及到区间极值的题时 好像是个套路分治 从级值中间分成两个区间 从区间短的那 ...

  7. BZOJ4367 : [IOI2014]holiday假期

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

  8. 【学术篇】CF833B TheBakery 分治dp+主席树

    题目の传送门~ 题目大意: 将\(n\)个蛋糕分成恰好\(k\)份, 求每份中包含的蛋糕的种类数之和的最大值. 这题有两种做法. 第一种是线段树优化dp, 我还没有考虑. 另一种就是分治+主席树. 然 ...

  9. BZOJ 4367 [IOI2014]holiday (决策单调DP+主席树+分治)

    题目大意:略 题目传送门 神题,不写长题解简直是浪费了这道题 贪心 考虑从0节点出发的情况,显然一直往前走不回头才是最优策略 如果起点是在中间某个节点$s$,容易想到,如果既要游览$s$左边的某些景点 ...

随机推荐

  1. NGINX Docs | Load Balancing Apache Tomcat Servers with NGINX Open Source and NGINX Plus

    NGINX Docs | Load Balancing Apache Tomcat Servers with NGINX Open Source and NGINX Plushttps://docs. ...

  2. 硬盘扩容9999T

    win+r运行创建命令:subst H: d:\123说明:H指的是想要创建的盘符,d:\123是文件路径 删除命令subst H: d/说明 :H指的是已创建的盘符,/d指的是删除的意思 注意新盘符 ...

  3. Velocity之初印象

    Velocity 模板引擎介绍 在现今的软件开发过程中,软件开发人员将更多的精力投入在了重复的相似劳动中.特别是在如今特别流行的 MVC 架构模式中,软件各个层次的功能更加独立,同时代码的相似度也更加 ...

  4. LLVM的安装

    1. 官网下载 llvm 2. 官网下载cmake 3. configure 执行 llvm 发现报错 4. 解压缩 cmake 5.将cmake 下面的bin 目录放到环境变量里面去 6. 创建一个 ...

  5. Oracle的数据类型详述

    数据类型 (1)字符型 CHAR: 定长最多(2000字节)特定情况下用 VARCHAR2:可变长度的字符串最多(4000字节) LONG:大文本类型最多(2个G) (2)数值型 NUMBER:可以是 ...

  6. AngularJS基于MVC的复杂操作案例

    AngularJS基于MVC的复杂操作案例 <!DOCTYPE html> <html> <head> <meta charset="UTF-8&q ...

  7. 简单JQuery+AJAX+Servlet的计算器实现

    index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pag ...

  8. python之路--初识面向对象

    一 . 初识面向对象 面向过程: 一切以事务的发展流程为中心. 面向对象: 一切以对象为中心. 一切皆为对象. 具体的某一个事务就是对象 打比方: 大象进冰箱 步骤: 第一步, 开门, 第二步, 装大 ...

  9. 用 Python 写一个多进程兼容的 TimedRotatingFileHandler

    我前面有篇文章已经详细介绍了一下 Python 的日志模块.Python 提供了非常多的可以运用在各种不同场景的 Log Handler. TimedRotatingFileHandler 是 Pyt ...

  10. 在eclipse中spring的xml配置文件标签中class路径全限定名自动提示设置

    这个自动提示其实很简单,没有网上说的那些要在help下的Install中输入网址来下载更新一堆东西那么复杂. 只需要打开Help — — >Eclipse Marketplace... 然后在该 ...