BZOJ3898 : 打的士
设$f_i$表示选择的答案区间左端点为$i$时,区间长度最小是多少。
那么每来一批人的时候,设$nxt$为$i$右边最近的一个可行决策,则$f_i=\max(f_i,nxt-i)$。
注意到$f$的形式是一条条斜率为$-1$的线段,且截距单调不下降,故每次修改可以转化为对截距的区间赋值。
用线段树维护$f$,对于一个区间,如果无法覆盖最左端,则返回,如果可以覆盖最右端,则打标记,否则暴力递归左右儿子。
时间复杂度$O(n\log n)$。
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1000010,M=2100000,inf=2000000010;
int n,i,j,x,y,q[N][2],st[N],en[N],m,b[N],e[N],k,a[N],l[M],r[M],v[M],tag[M];
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=m,mid,t;
while(l<=r)if(e[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
return t;
}
inline void tag1(int x,int a,int b,int p){
l[x]=p-e[a];
v[x]=r[x]=p-e[b];
tag[x]=p;
}
inline void pb(int x,int a,int b){
if(tag[x]<0)return;
int mid=(a+b)>>1;
tag1(x<<1,a,mid,tag[x]);
tag1(x<<1|1,mid+1,b,tag[x]);
tag[x]=-1;
}
inline void up(int x){
l[x]=l[x<<1];
r[x]=r[x<<1|1];
v[x]=min(v[x<<1],v[x<<1|1]);
}
void build(int x,int a,int b){
tag[x]=-1;
if(a==b)return;
int mid=(a+b)>>1;
build(x<<1,a,mid),build(x<<1|1,mid+1,b);
}
void change(int x,int a,int b,int c,int d,int p){
if(c<=a&&b<=d){
if(p-e[a]<=l[x])return;
if(p-e[b]>r[x]){tag1(x,a,b,p);return;}
}
pb(x,a,b);
int mid=(a+b)>>1;
if(c<=mid)change(x<<1,a,mid,c,d,p);
if(d>mid)change(x<<1|1,mid+1,b,c,d,p);
up(x);
}
int ask(int x,int a,int b,int c,int d){
if(c<=a&&b<=d)return v[x];
pb(x,a,b);
int mid=(a+b)>>1,t=inf;
if(c<=mid)t=ask(x<<1,a,mid,c,d);
if(d>mid)t=min(t,ask(x<<1|1,mid+1,b,c,d));
return up(x),t;
}
int main(){
read(n);
for(i=1;i<=n;i++){
char ch;
while((ch=getchar())!='C'&&ch!='Q');
q[i][0]=ch=='C';read(x);
if(ch=='C'){
st[i]=m+1,en[i]=m+x;
while(x--)read(y),b[++m]=y;
}else q[i][1]=b[++m]=x;
}
for(i=1;i<=m;i++)e[i]=b[i];
sort(e+1,e+m+1);
build(1,1,m);
for(i=1;i<=n;i++)if(q[i][0]){
k=0;
for(j=st[i];j<=en[i];j++)a[++k]=lower(b[j]);
sort(a+1,a+k+1);
for(j=1;j<=k;j++)if(a[j]>a[j-1])change(1,1,m,a[j-1]+1,a[j],e[a[j]]);
if(a[k]<m)change(1,1,m,a[k]+1,m,inf);
}else{
x=ask(1,1,m,lower(q[i][1]),m);
if(x>1000000000)x=-1;
printf("%d\n",x);
}
return 0;
}
BZOJ3898 : 打的士的更多相关文章
- 【NOIP模拟】的士碰撞(二分答案)
Description
- [JZOJ3187]【GDOI2013模拟8】的士
题目 描述 题目大意 在一个数轴上,有些人要从某个点到达另一个点. 出租车从最左端出发,将所有人送到它们的目的地,最终到达最右边的点. 出租车只能做一个乘客,并且可以在图中将乘客丢下. 问最短时间. ...
- 谷歌浏览器,火狐浏览器,ie浏览器解析顺序
谷歌(版本 55.0.2883.87 m),火狐(48.0.2),ie(11.576.14393.0)对三个浏览器简单的进行了一下试验发现,谷歌浏览器是等到html全部解析完毕之后才开始渲染,而另外两 ...
- 2016huasacm暑假集训训练五 H - Coins
题目链接:http://acm.hust.edu.cn/vjudge/contest/126708#problem/H 题意:A有一大堆的硬币,他觉得太重了,想花掉硬币去坐的士:的士司机可以不找零,但 ...
- Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx
Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx 1. 摘要算法的大概流程2 2. 旧约圣经 (39卷)2 2.1. 与古兰经的对 ...
- C++类的静态成员详解
类的静态成员分为静态数据成员和静态成员函数 静态数据成员 假如我们要设计一个战争游戏,游戏中有许多的兵种.游戏的过程中,每隔一段时间每个兵种都会产生,同时由于战争的消耗,每个兵种士兵的数量又会减少.为 ...
- HDU2089 不要62[数位DP]
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- SHOI2016游记&滚粗记&酱油记
Day0 学校刚期中考完,全科血崩,感觉这次真要考不到一本线了tat 晚上写了个可持久化trie的题,也懒得敲板子(上个礼拜都敲过了),就碎叫了 Day1 上午起床吃饭水群看球,吃完中饭就去考场了. ...
- Objective-C汇总
Objective C(20世纪80年代初) 一.OC语言概述 .1985年,Steve Jobs成立了NeXT公司 .1996年,12月20日,苹果公司宣布收购了NeXT softwar ...
随机推荐
- 在MVC的项目中访问静态页面
MVC在生成项目的时候会生成的WEB-INF底下.这个文件夹下面的文件是受保护的,都会走MVC的流程, 但是我希望在WebContent底下可以使用静态页面, 那么需要进入springmvc-serv ...
- Cocoapods的安装报错 - Error installing pods:activesupport requires Ruby version >=2.2.2
1.打开终端 2 移除现有 Ruby 默认源 输入以下指令 $gem sources --remove https://rubygems.org/ 3.使用新的源 输入以下指令 $gem source ...
- hdu 2027统计元音
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2027 思路:主要考察gets()函数用法,能够接受输入的空格,如果用%s或是cin>>st ...
- Paragon NTFS for Mac® Yosemite - 免费下载
文章链接:http://www.paragon-software.com/cn/home/ntfs-mac-yosemite/registration.html
- WdatePicker 开始日期不能大于结束日期,结束时间不能小于开始时间
<input class="input_calendar inputcss" id="startDate" runat="server" ...
- jQuery – 7.动态创建Dom、删除节点
动态创建Dom节点 1.使用$(html字符串)来创建Dom节点 2.append方法用来在元素的末尾追加元素 案例:动态生成网站列表 3.prepend,在元素的开始 ...
- Delphi中exit、break、continue等跳出操作的区别
Delphi中表示跳出的有break,continue,abort,exit,halt,runerror等 1.break 强制退出最近的一层循环(注意:只能放在循环里:而且是只能跳出最近的一层循环) ...
- PMP 第四章 项目整合管理
1.什么是整合管理,整合什么?如何整合? 项目整合管理包括识别 定义 组合 统一与协调项目管理过组的个过程及项目管理活动二进行的各种过程和活动. 整合兼具统一 合并 连接和一体化的性质,对 ...
- jquery audio player
<!DOCTYPE html><html lang="en"> <head> <meta charset="utf-8&quo ...
- Sizeof与Strlen的区别与联系(转)
Sizeof与Strlen的区别与联系 一.sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型 ...