[BZOJ4367][IOI2014]Holiday(决策单调性+分治+主席树)
4367: [IOI2014]holiday假期
Time Limit: 20 Sec Memory Limit: 64 MB
Submit: 421 Solved: 128
[Submit][Status][Discuss]Description
健佳正在制定下个假期去台湾的游玩计划。在这个假期,健佳将会在城市之间奔波,并且参观这些城市的景点。
在台湾共有n个城市,它们全部位于一条高速公路上。这些城市连续地编号为0到n-1。对于城市i(0<i<n-1)而言,与其相邻的城市是i-1和i+1。但是对于城市 0,唯一与其相邻的是城市 1。而对于城市n-1,唯一与其相邻的是城市n-2。
每个城市都有若干景点。健佳有d天假期并且打算要参观尽量多的景点。健佳已经选择了假期开始要到访的第一个城市。在假期的每一天,健佳可以选择去一个相邻
的城市,或者参观所在城市的所有景点,但是不能同时进行。即使健佳在同一个城市停留多次,他也不会去重复参观该城市的景点。请帮助健佳策划这个假期,以便
能让他参观尽可能多的景点。Input
第1行: n, start, d.
第2行: attraction[0], ..., attraction[n-1].
n: 城市数。
start: 起点城市的编号。
d: 假期的天数。
attraction: 长度为n的数组;attraction[i] 表示城市i的景点数目,其中0≤i≤n-1。Output
输出一个整数表示健佳最多可以参观的景点数。
Sample Input
5 2 7
10 2 20 30 1Sample Output
60HINT
假 设健佳有 7 天假期,有 5 个城市(参见下表),而且他由城市 2
开始。在第一天,健佳参观城市2的 20 个景点。第二天,健佳由城市 2 去往城市 3。而在第三天,健佳参观城市 3 的30
个景点。接下来的3天,健佳由城市 3 前往城市 0。而在第 7 天,健佳参观城市0的 10
个景点。这样健佳参观的景点总数是20+30+10=60,这是他由城市 2 开始、在 7 天假期内最多能参观的景点数目。
Source
https://blog.csdn.net/CreationAugust/article/details/50821931
当需要枚举的东西呈单调性的时候可以用分治解决。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
typedef long long ll;
using namespace std; const int N=,M=;
int n,st,m,cnt,root[N],b[N],sta[N],c,ls[M],rs[M],sz[M];
ll ret,ans,sum[M],f[N],g[N],f1[N],g1[N];
int fd[N],gd[N],f1d[N],g1d[N]; void ins(int x,int &y,int l,int r,int val,ll Val){
sz[y=++cnt]=sz[x]+; sum[y]=sum[x]+Val; ls[y]=ls[x];rs[y]=rs[x];
if (l==r) return; int mid=(l+r)>>;
if (val<=mid) ins(ls[x],ls[y],l,mid,val,Val);
else ins(rs[x],rs[y],mid+,r,val,Val);
} void query(int x,int y,int l,int r,int k){
if (k<=) return;
if (l==r) { ret+=1ll*min(k,sz[y]-sz[x])*sta[l]; return; }
int mid=(l+r)>>;
if (sz[rs[y]]-sz[rs[x]]>=k) query(rs[x],rs[y],mid+,r,k);
else ret+=sum[rs[y]]-sum[rs[x]],query(ls[x],ls[y],l,mid,k-sz[rs[y]]+sz[rs[x]]);
} void solve1(int l,int r,int L,int R){//要求f[l..r],d的范围在[L,R]
if (l>r) return;
int mid=(l+r)>>;
for (int i=L;i<=R;i++){
ret=; query(root[st-],root[i],,c,st-i+mid);
if (ret>f[mid]||!fd[mid]) f[mid]=ret,fd[mid]=i;
}
solve1(l,mid-,L,fd[mid]);solve1(mid+,r,fd[mid],R);
} void solve2(int l,int r,int L,int R){
if (l>r) return;
int mid=(l+r)>>;
for (int i=R; i>=L; i--){
ret=; query(root[i-],root[st-],,c,i-st+mid);
if (ret>g[mid]||!gd[mid]) g[mid]=ret,gd[mid]=i;
}
solve2(l,mid-,gd[mid],R); solve2(mid+,r,L,gd[mid]);
} void solve3(int l,int r,int L,int R){
if (l>r) return;
int mid=(l+r)>>;
for (int i=L; i<=R; i++){
ret=; query(root[st-],root[i],,c,((st-i)<<)+mid);
if (ret>f1[mid]||!f1d[mid]) f1[mid]=ret,f1d[mid]=i;
}
solve3(l,mid-,L,f1d[mid]); solve3(mid+,r,f1d[mid],R);
} void solve4(int l,int r,int L,int R){
if (l>r) return;
int mid=(l+r)>>;
for (int i=R;i>=L;i--){
ret=; query(root[i-],root[st-],,c,((i-st)<<)+mid);
if (ret>g1[mid]||!g1d[mid]) g1[mid]=ret,g1d[mid]=i;
}
solve4(l,mid-,g1d[mid],R);solve4(mid+,r,L,g1d[mid]);
} int main(){
freopen("bzoj4367.in","r",stdin);
freopen("bzoj4367.out","w",stdout);
scanf("%d%d%d",&n,&st,&m);st++;
rep(i,,n) scanf("%d",&b[i]),sta[i]=b[i];
sort(sta+,sta+n+);c=unique(sta+,sta+n+)-sta-;
rep(i,,n) b[i]=lower_bound(sta+,sta+c+,b[i])-sta;
rep(i,,n) ins(root[i-],root[i],,c,b[i],sta[b[i]]);
solve1(,m,st,min(n,st+m)); solve2(,m,max(,st-m),n);
solve3(,m,st,min(n,st+(m>>))); solve4(,m,max(,st-(m>>)),n);
rep(i,,m) ans=max(ans,g1[i]+f[m-i]);
rep(i,,m) ans=max(ans,f1[i]+g[m-i]);
printf("%lld\n",ans);
}
[BZOJ4367][IOI2014]Holiday(决策单调性+分治+主席树)的更多相关文章
- BZOJ 4367 [IOI2014]holiday (决策单调DP+主席树+分治)
题目大意:略 题目传送门 神题,不写长题解简直是浪费了这道题 贪心 考虑从0节点出发的情况,显然一直往前走不回头才是最优策略 如果起点是在中间某个节点$s$,容易想到,如果既要游览$s$左边的某些景点 ...
- [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
显然有决策单调性,但由于逆序对不容易计算,考虑分治DP. solve(k,x,y,l,r)表示当前需要选k段,待更新的位置为[l,r],这些位置的可能决策点区间为[x,y].暴力计算出(l+r)/2的 ...
- P2877 [USACO07JAN]牛校Cow School(01分数规划+决策单调性分治)
P2877 [USACO07JAN]牛校Cow School 01分数规划是啥(转) 决策单调性分治,可以解决(不限于)一些你知道要用斜率优化却不会写的问题 怎么证明?可以暴力打表 我们用$ask(l ...
- 4951: [Wf2017]Money for Nothing 决策单调性 分治
Bzoj4951:决策单调性 分治 国际惯例题面:一句话题面:供应商出货日期为Ei,售价为Pi:用户收购截止日期为Si,收购价格为Gi.我们要求max((Si-Ej)*(Gi-Pj)).显然如果我们把 ...
- [NAIPC2016]Jewel Thief(决策单调性+分治)
[NAIPC2016]Jewel Thief(决策单调性+分治) 题面 原题提交地址(题目编号H) 原题面下载地址 有\(n\)个物品,每个物品有一个体积\(w_i\)和价值\(v_i\),现在要求对 ...
- P3515 [POI2011]Lightning Conductor(决策单调性分治)
P3515 [POI2011]Lightning Conductor 式子可转化为:$p>=a_j-a_i+sqrt(i-j) (j<i)$ $j>i$的情况,把上式翻转即可得到 下 ...
- bzoj1897. tank 坦克游戏(决策单调性分治)
题目描述 有这样一款新的坦克游戏.在游戏中,你将操纵一辆坦克,在一个N×M的区域中完成一项任务.在此的区域中,将会有许多可攻击的目标,而你每摧毁这样的一个目标,就将获得与目标价值相等的分数.只有获得了 ...
- 【BZOJ4367】[IOI2014]holiday假期 分治+主席树
[BZOJ4367][IOI2014]holiday假期 Description 健佳正在制定下个假期去台湾的游玩计划.在这个假期,健佳将会在城市之间奔波,并且参观这些城市的景点.在台湾共有n个城市, ...
- [IOI2014]holiday假期(分治+主席树)
题目描述 健佳正在制定下个假期去台湾的游玩计划.在这个假期,健佳将会在城市之间奔波,并且参观这些城市的景点.在台湾共有n个城市,它们全部位于一条高速公路上.这些城市连续地编号为0到n-1.对于城市i( ...
随机推荐
- SqlServer中临时表的应用
一.变通处理WHERE后面IN的参数过多 WHERE后面的条IN操作符里的参数比较小时,可以直接使用IN(1,2,3)这样处理,当个数不确定(可能超过1000)时,应该考虑使用临时表关联查询: SEL ...
- COGS1752. [BOI2007]摩基亚Mokia CDQ
CDQ的板子题 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- 如何用setInterval调用类的方法
setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式.setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭.由 se ...
- ubuntu下opencv使用cvNamedWindow()和cvShowImage()出错的解决方法
重装系统和opencv,编译运行显示一副图像的程序,报错如下 liurf@liurf-Lenovo-G470:~/WorkSpace/slambook-master/ch5/imageBasics$ ...
- 怎样在WPS上实现代码语法高亮
转载自:http://www.cnblogs.com/yuphone/archive/2009/12/13/1622901.html 小時不識月 Stupid & Hungry 本文列举两种可 ...
- 【Foreign】红与蓝 [暴力]
红与蓝 Time Limit: 10 Sec Memory Limit: 256 MB Description Input Output Sample Input 2 2 0 1 -1 -1 2 0 ...
- poj1379 Run Away
传送门:http://poj.org/problem?id=1379 [题解] 题目大意:求(0,0)->(X,Y)内的一个点,使得这个点到给定的n个点的最小距离最大. 模拟退火 一开始可以先把 ...
- 一致性hash与CRUSH算法总结
相同之处:都解决了数据缓存系统中数据如何存储与路由. 不同之处:区别在于虚拟节点和物理节点的映射办法不同 由于一般的哈希函数返回一个int(32bit)型的hashCode.因此,可以将该哈希函数能够 ...
- MySQL 查询语句练习1
1.创建成绩表,字段包括:学生姓名,语文成绩,数学成绩,英语成绩 向表中插入多条数据: 查询: (1) 查询所有学生的数学成绩和总成绩 (2) 查询所有学生的语文和数学成绩和,按从高到低排序 (3) ...
- platform_driver_register,什么时候调用PROBE函数 注册后如何找到驱动匹配的设备【转】
转自:http://blog.chinaunix.net/uid-25508271-id-2979412.html kernel_init中do_basic_setup()->driver_in ...
