设$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 : 打的士的更多相关文章

  1. 【NOIP模拟】的士碰撞(二分答案)

    Description

  2. [JZOJ3187]【GDOI2013模拟8】的士

    题目 描述 题目大意 在一个数轴上,有些人要从某个点到达另一个点. 出租车从最左端出发,将所有人送到它们的目的地,最终到达最右边的点. 出租车只能做一个乘客,并且可以在图中将乘客丢下. 问最短时间. ...

  3. 谷歌浏览器,火狐浏览器,ie浏览器解析顺序

    谷歌(版本 55.0.2883.87 m),火狐(48.0.2),ie(11.576.14393.0)对三个浏览器简单的进行了一下试验发现,谷歌浏览器是等到html全部解析完毕之后才开始渲染,而另外两 ...

  4. 2016huasacm暑假集训训练五 H - Coins

    题目链接:http://acm.hust.edu.cn/vjudge/contest/126708#problem/H 题意:A有一大堆的硬币,他觉得太重了,想花掉硬币去坐的士:的士司机可以不找零,但 ...

  5. Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx

    Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx 1. 摘要算法的大概流程2 2. 旧约圣经 (39卷)2 2.1. 与古兰经的对 ...

  6. C++类的静态成员详解

    类的静态成员分为静态数据成员和静态成员函数 静态数据成员 假如我们要设计一个战争游戏,游戏中有许多的兵种.游戏的过程中,每隔一段时间每个兵种都会产生,同时由于战争的消耗,每个兵种士兵的数量又会减少.为 ...

  7. HDU2089 不要62[数位DP]

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. SHOI2016游记&滚粗记&酱油记

    Day0 学校刚期中考完,全科血崩,感觉这次真要考不到一本线了tat 晚上写了个可持久化trie的题,也懒得敲板子(上个礼拜都敲过了),就碎叫了 Day1 上午起床吃饭水群看球,吃完中饭就去考场了. ...

  9. Objective-C汇总

    Objective  C(20世纪80年代初) 一.OC语言概述 .1985年,Steve  Jobs成立了NeXT公司 .1996年,12月20日,苹果公司宣布收购了NeXT  softwar ...

随机推荐

  1. NYOJ题目817英文藏头诗

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtEAAAKXCAIAAADLqoEhAAAgAElEQVR4nO3dO1LrzNbG8W8S5AyE2D

  2. 3.2 STL中的函数对象类模板

    *: STL中有一些函数对象类模板,如下所示: 1)例如要求两个double类型的x 和y 的积,可以: multiplies<double>()(x,y); 该表达式的值就是x*y的值. ...

  3. 20145206《Java程序设计》第9周学习总结

    20145206 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作 ...

  4. lsof -ntP -i:端口取出 动行程序的PID 然后xargs kill -9 这个进程

    [root@ok ok]# lsof -ntP -i: [root@ok ok]# netstat -lnutp|grep tcp /dnsmasq tcp /sshd tcp ::: :::* LI ...

  5. OID View

    http://oid-info.com/get/1.3.6.1.2.1.17.1.4.1.2

  6. 公众号开发——测试工具【ngrok】

    工具下载:ngrok 目录清单: ngrok.exe ngrok.cfg run.bat 点击bat启动. 可修改域名,右键bat文件修改. 成功效果图: 注:80端口被占用了怎么办?    ——   ...

  7. jquery获取radio和select选中值

    //jquery 获取radio选中值 <input type="radio" name="c_type" value="a" > ...

  8. ASP.NET 5探险(4):如何把ASP.NET 5从beta4升级到beta5

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:上一篇文章讲述了ASP.NET 5 Beta带来的一些变化,虽然原文最后给出了从bet ...

  9. Java中的wait和sleep

    sleep()和wait() 首先,Java中的多线程是一种抢占式的机制,而不是分时机制.抢占式的机制是有多个线程处于可运行状态,但是只有一个线程在运行. 这种机制决定了,对于同一对象的多线程访问,必 ...

  10. 驱动中获取PsActiveProcessHead变量地址的五种方法也可以获取KdpDebuggerDataListHead

    PsActiveProcessHead的定义: 在windows系统中,所有的活动进程都是连在一起的,构成一个双链表,表头是全局变量PsActiveProcessHead,当一个进程被创建时,其Act ...