http://uoj.ac/problem/29

经过的点集一定是一个包含start的区间,为了经过这个区间内所有点,必须先到达一个区间端点,再到达另一个区间端点,剩余的步数则贪心选区间内最大价值的点。显然决策单调,于是可以分治,用可持久化线段树快速求出区间前k大数之和。

#include"holiday.h"
#include<cstring>
#include<algorithm>
typedef long long i64;
const int N=;
i64 ans=;
int v[N],*vs[N],S,D;
struct node{
node*c[];
int sz;
i64 s;
}ns[N*],*np=ns,*rt[N];
i64 kmx(int L,int R,int x){
node*w1=rt[L],*w2=rt[R+];
i64 sum=;
for(int i=;i>=;--i){
int s=w1->c[]->sz-w2->c[]->sz;
if(s<=x){
x-=s;
sum+=w1->c[]->s-w2->c[]->s;
w1=w1->c[];
w2=w2->c[];
}else{
w1=w1->c[];
w2=w2->c[];
}
}
return sum;
}
node*ins(node*w,int x,int v){
node*u=++np,*u0=u;
for(int i=;i>=;--i){
int d=x>>i&;
u->c[d^]=w->c[d^];
u=u->c[d]=++np;w=w->c[d];
u->sz=w->sz+;
u->s=w->s+v;
}
return u0;
}
void calc1(int L,int R,int l,int r){
if(L>R)return;
int M=L+R>>,m=l,res=D-(S-M)*-(l-S);
i64 mv=-;
for(int i=l;i<=r&&res>=;++i,--res){
i64 v=kmx(M,i,res);
if(v>mv)mv=v,m=i;
}
if(ans<mv)ans=mv;
calc1(L,M-,l,m);
calc1(M+,R,m,r);
}
void calc2(int L,int R,int l,int r){
if(L>R)return;
int M=L+R>>,m=r,res=D-(M-S)*-(S-r);
i64 mv=-;
for(int i=r;i>=l&&res>=;--i,--res){
i64 v=kmx(i,M,res);
if(v>mv)mv=v,m=i;
}
if(ans<mv)ans=mv;
calc2(L,M-,l,m);
calc2(M+,R,m,r);
}
bool cmp(int*a,int*b){
return *a>*b;
}
i64 findMaxAttraction(int n,int start,int d,int attr[]){
rt[n]=ns->c[]=ns->c[]=ns;
memcpy(v,attr,sizeof(int)*n);
for(int i=;i<n;++i)vs[i]=v+i;
std::sort(vs,vs+n,cmp);
for(int i=;i<n;++i)*vs[i]=i;
for(int i=n-;i>=;--i)rt[i]=ins(rt[i+],v[i],attr[i]);
D=d;S=start;
calc1(std::max(,S-d/),S,S,n-);
calc2(S,std::min(n-,S+d/),,S);
return ans;
}
#include"grader.cpp"

uoj#29. 【IOI2014】Holiday的更多相关文章

  1. [UOJ#24]【IOI2014】Rail

    #24. [IOI2014]Rail 台湾有一个连接着岛的东.西两岸的庞大的铁路线.这个铁路线包含有 mm 个区段.这些相连的区段以数字 0,…,m−10,…,m−1 为编号,且编号由西端开始.每一个 ...

  2. UOJ#24. 【IOI2014】Rail 交互题

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ24.html 题解 我们将 C 型车站称为 左括号 '(', D 型车站称为右括号 ')' ,设括号 i 的位置为 p[i ...

  3. uoj #58. 【WC2013】糖果公园(树上莫队算法+修改操作)

    [题目链接] http://uoj.ac/problem/58 [题意] 有一棵树,结点有自己的颜色,若干询问:u,v路径上的获益,并提供修改颜色的操作. 其中获益定义为Vc*W1+Vc*W2+…+V ...

  4. uoj #5. 【NOI2014】动物园 kmp

    #5. [NOI2014]动物园 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/5 Description 近日 ...

  5. UOJ #148. 【NOIP2015】跳石头 二分

    #148. [NOIP2015]跳石头 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/148 Descripti ...

  6. Uoj #131. 【NOI2015】品酒大会 后缀数组,并查集

    #131. [NOI2015]品酒大会 统计 描述 提交 自定义测试 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项, ...

  7. UOJ#7. 【NOI2014】购票 | 线段树 凸包优化DP

    题目链接 UOJ #7 题解 首先这一定是DP!可以写出: \[f[i] = \min_{ancestor\ j} \{f[j] + (d[j] - d[i]) * p[i] + q[i]\}\] 其 ...

  8. UOJ #17. 【NOIP2014】飞扬的小鸟 背包DP

    #17. [NOIP2014]飞扬的小鸟 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4902  Solved: 1879 题目连接 http:// ...

  9. UOJ#130 【NOI2015】荷马史诗 K叉哈夫曼树

    [NOI2015]荷马史诗 链接:http://uoj.ac/problem/130 因为不能有前缀关系,所以单词均为叶子节点,就是K叉哈夫曼树.第一问直接求解,第二问即第二关键字为树的高度. #in ...

随机推荐

  1. 20155219 2016-2017-2《Java程序设计》课程总结

    20155219 2016-2017-2<Java程序设计>课程总结 (按顺序)每周作业链接汇总 预备作业1:我期望的师生关系 预备作业2:做中学深入探讨 预备作业3:虚拟机的安装与学习 ...

  2. 重绘和回流(reflow和repaint)

    由于DOM操作会导致浏览器的回流,回流需要花费大量的时间进行样式计算和节点重绘与渲染,所以应当尽量减少回流次数. 以下是几种常见的减少重绘和回流的方法: 一.不要一项一项的更改页面的样式,尽量一口气写 ...

  3. Washing Text Animation

    https://www.youtube.com/watch?v=q0_koJLc0OgBlender Tutorial: Washing Text Animation 需要用到插件, 进入用户设置的插 ...

  4. Write your own Terraform provider: Part 1

    转自:https://container-solutions.com/write-terraform-provider-part-1/ This is the first part of a seri ...

  5. lapis 1.7.0 更好的openresty 版本兼容以及安全数据库支持

    lapis 1.7.0 今年4月2号就发布了,一直没有注意,今天看到changelog就简单的进行了一个 测试(主要是与openresty版本的测试,新变更后边会有) 使用docker-compose ...

  6. php7 php-fpm 重启

    PHP7中php.ini.php-fpm和www.conf的配置 http://www.tuicool.com/articles/NjmQNj6 php-fpm 关闭:  kill -SIGINT ` ...

  7. 艰苦的编译boost python (失败)

    1.下载 boost_1_67_0 2.在目录下执行 bootstrap 3.将python36添加到path环境变量 4.执行 b2 --with-python,将会声场如下dll 2018/04/ ...

  8. oauth 2.0 授权流程图

    1.授权码模式(authorization code) 7 步  后面 拿到授权码以后,就是向 资源服务器请求资源了. 2.简化模式(implicit): 在上面的第4 步的返回中,已经包含了 acc ...

  9. js判斷是否是正整數

    var curt_page = $("input[name='curt_page']").val(); if (!(/(^[1-9]\d*$)/.test(curt_page))) ...

  10. cvs报错: socket exception recv failed

    连接都OK的. 也可以telnet到服务器上去. 网上的各种方法都试了,没法解决. 后来一直在乱试,居然解决了. 就是这样设置的,选中第一个复选框.