题目描述

健佳正在制定下个假期去台湾的游玩计划。在这个假期,健佳将会在城市之间奔波,并且参观这些城市的景点。
在台湾共有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. tomcat7 server.xml max thread

    java - Tomcat - maxThreads vs maxConnections - Stack Overflowhttps://stackoverflow.com/questions/246 ...

  2. 关于PHP批量图片格式转换的问题--本文转成webp, 其他过程格式一样

    最近要把项目中的图片全部生成webp格式, 过程整理一下,    (直接存在本地,或者图片链接存在数据库都可以看看) 首先,肯定是批量处理, 一个php处理不了这么多, 会爆内存的, 个人建议用aja ...

  3. anaconda + VSCode + 生产环境配置

    1. 修改jupyter notebook 默认路径: 进入anaconda 命令行, jupyter notebook --generate-config   生成配置文件, 该文件在    本机用 ...

  4. HashMap深度解析(转载)

    原文地址:http://blog.csdn.net/ghsau/article/details/16890151 实现原理:用一个数组来存储元素,但是这个数组存储的不是基本数据类型.HashMap实现 ...

  5. CentOS7安装Jenkins自动化部署maven项目

    前言: 最近要弄一个jenkins工具,已经安装好了并且jenkins使用部署项目的流程已经基本走通,上图: 话不多说,开始 第一步:安装jenkins: [ 准备环境: 在centOS7环境上:安装 ...

  6. 关于 html input标签的几个常用操作

    1.清除 input 标签默认样式 input { -moz-appearance: none; outline: 0; text-decoration: none; outline: none; b ...

  7. 非关系型数据库----MongoDB

    一.什么是MongoDB? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用提 ...

  8. linux audit审计(4)--audit的日志切分,以及与rsyslog的切分协同使用

    audit的规则配置稍微不当,就会短时间内产生大量日志,所以这个规则配置一定要当心.当audit日志写满后,可以看到如下场景: -r-------- 1 root root 8388609 Mar 3 ...

  9. mysql 数据库的主从同步

    1.复制准备 操作系统 centOS 主库(mysql master):  ip为123.56.94.1   port为3306  mysql 版本 5.7.16 从库(mysql slave):   ...

  10. Jenkins+PowerShell持续集成环境搭建(一)前期准备

    0. 系统要求 Windows Server:本文章使用的为Windows Server 2012 JDK:本文章使用为JDK 1.8 Windows PowerShell:本文章使用为PowerSh ...