原文链接https://www.cnblogs.com/zhouzhendong/p/ZJOI2018Day2T2.html

题目传送门 - BZOJ5308

题目传送门 - LOJ2529

题目传送门 - 洛谷P4501

题意

  略。

题解

  首先这个题目名称用来形容 cly 太好了。

  考虑每一对 $(a_i,l_i)$ 对于答案的贡献。

  我们可以发现每一条这种路径能够更新的节点是连续的一段。于是我们考虑二分边界。

  设 x 为当前节点,我们当前二分到的节点为 y ,如果 x 不能更新节点 y ,那么,在区间 $[x,2y-x]$ 中必然存在一个点到 y 的最短路小于等于 x 到 y 的最短路。

  于是,我们可以利用差分思想维护两个 ST 表来分别得到两边的最短路。

  但是有一个特殊情况:

  一个点同时被左右更新。

  只需要特判就好了。

  这题细节好多啊。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int read(){
int x=0;
char ch=getchar();
while (!isdigit(ch))
ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x;
}
const int N=200005;
const LL INF=1LL<<57;
int n,m,w[N],Log[N];
LL x[N],s1[N][18],s2[N][18];
struct Node{
int a,L;
}v[N];
bool cmp(Node A,Node B){
return A.a<B.a;
}
LL query1(int L,int R){
if (L>R)
return INF;
int d=Log[R-L+1];
return min(s1[L+(1<<d)-1][d],s1[R][d]);
}
LL query2(int L,int R){
if (L>R)
return INF;
int d=Log[R-L+1];
return min(s2[L+(1<<d)-1][d],s2[R][d]);
}
int p[N];
LL l[N];
int main(){
Log[1]=0;
for (int i=2;i<N;i++)
Log[i]=Log[i>>1]+1;
n=read(),m=read();
for (int i=1;i<n;i++)
w[i]=read(),x[i+1]=x[i]+w[i];
while (m--){
int k=read();
for (int i=1;i<=k;i++)
v[i].a=read(),v[i].L=read();
sort(v+1,v+k+1,cmp);
for (int i=1;i<=k;i++)
p[i]=v[i].a,l[i]=v[i].L;
for (int i=1;i<=k;i++){
s1[i][0]=l[i]-x[p[i]];
s2[i][0]=l[i]+x[p[i]];
for (int j=1;j<18;j++){
s1[i][j]=s1[i][j-1];
s2[i][j]=s2[i][j-1];
if (i-(1<<(j-1))>0){
s1[i][j]=min(s1[i][j],s1[i-(1<<(j-1))][j-1]);
s2[i][j]=min(s2[i][j],s2[i-(1<<(j-1))][j-1]);
}
}
}
LL ans=0;
for (int i=1;i<=k;i++){
int now=p[i],R=now,L=now;
for (int j=17;j>=0;j--){
int t=R+(1<<j);
if (t>n)
continue;
int pL=i+1;
int pM1=upper_bound(p+1,p+k+1,t)-p-1;
int pM2=lower_bound(p+1,p+k+1,t)-p;
int pR=upper_bound(p+1,p+k+1,t*2-now)-p-1;
if (query1(pL,pM1)<=l[i]-x[now])
continue;
if (query2(pM2,pR)-x[t]<=l[i]+x[t]-x[now])
continue;
R=t;
}
for (int j=17;j>=0;j--){
int t=L-(1<<j);
if (t<=0)
continue;
int pR=i-1;
int pM1=lower_bound(p+1,p+k+1,t)-p;
int pM2=upper_bound(p+1,p+k+1,t)-p-1;
int pL=lower_bound(p+1,p+k+1,t*2-now)-p;
if (query2(pM1,pR)<=l[i]+x[now])
continue;
if (query1(pL,pM2)+x[t]<=l[i]+x[now]-x[t])
continue;
L=t;
}
ans+=R-L+1;
if (R<n){
R++;
int pR=lower_bound(p+1,p+k+1,R*2-now)-p;
if (p[pR]==R*2-now){
int pM1=upper_bound(p+1,p+k+1,R)-p-1;
int pM2=lower_bound(p+1,p+k+1,R)-p;
if (query1(i+1,pM1)>l[i]-x[now]
&&query2(pM2,pR-1)-x[R]>l[i]+x[R]-x[now]
&&l[i]+x[R]-x[now]==l[pR]+x[p[pR]]-x[R])
ans++;
}
}
}
printf("%lld\n",ans);
}
return 0;
}

  

ZJOI2018 胖 二分 ST表的更多相关文章

  1. BZOJ 5308 [ZJOI2018] Day2T2 胖 | 二分 ST表

    题目链接 LOJ 2529 BZOJ 5308 题解 这么简单的题 为什么考场上我完全想不清楚 = = 对于k个关键点中的每一个关键点\(a\),二分它能一度成为哪些点的最短路起点(显然这些点在一段包 ...

  2. 洛谷P4501/loj#2529 [ZJOI2018]胖(ST表+二分)

    题面 传送门(loj) 传送门(洛谷) 题解 我们对于每一个与宫殿相连的点,分别计算它会作为多少个点的最短路的起点 若该点为\(u\),对于某个点\(p\)来说,如果\(d=|p-u|\),且在\([ ...

  3. 「ZJOI2018」胖(ST表+二分)

    「ZJOI2018」胖(ST表+二分) 不开 \(O_2\) 又没卡过去是种怎么体验... 这可能是 \(ZJOI2018\) 最简单的一题了...我都能 \(A\)... 首先我们发现这个奇怪的图每 ...

  4. BZOJ4556:[TJOI\HEOI2016]字符串(后缀数组,主席树,二分,ST表)

    Description 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为n的字符串s,和m个问题.佳媛姐姐必须正确回答这m个问题,才能打开箱 ...

  5. BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】

    题目 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题. 现在你拥有n颗宝石,每颗宝石 ...

  6. [BZOJ4310] 跳蚤 - 后缀数组,二分,ST表

    [BZOJ4310] 跳蚤 Description 首先,他会把串分成不超过 \(k\) 个子串,然后对于每个子串 \(S\) ,他会从 \(S\) 的所有子串中选择字典序最大的那一个,并在选出来的 ...

  7. HDU5726 GCD(二分 + ST表)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Give you a sequence of N(N≤100, ...

  8. BZOJ3473:字符串(后缀数组,主席树,二分,ST表)

    Description 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? Input 第一行两个整数n,k. 接下来n行每行一个字符串. Output 一 ...

  9. BZOJ 3230 相似子串 | 后缀数组 二分 ST表

    BZOJ 3230 相似子串 题面 题解 首先我们要知道询问的两个子串的位置. 先正常跑一遍后缀数组并求出height数组. 对于每一个后缀suffix(i),考虑以i开头的子串有多少是之前没有出现过 ...

随机推荐

  1. CSS rem长度单位

    1. 概述 1.1 说明 rem是css3中新增的一个单位属性(font size of the root element),根据页面的根节点(html)的字体大小进行转换的单位,通过此单位属性可以进 ...

  2. 04 if条件判断 流程控制

    条件判断 if 语法一: if 条件: # 条件成立时执行的子代码块 代码1 代码2 代码3 示例: sex='female' age=18 is_beautiful=True if sex == ' ...

  3. BeautifulSoup解析器的选择

    BeautifulSoup解析器 在我们使用BeautifulSoup的时候,选择怎样的解析器是至关重要的.使用不同的解析器有可能会出现不同的结果! 今天遇到一个坑,在解析某html的时候.使用htm ...

  4. cmder 神器 +curl

    cmder 神器 https://www.jianshu.com/p/7a706c0a3411 curl https://www.cnblogs.com/zhuzhenwei918/p/6781314 ...

  5. CDH运维

    1.单个节点宕机后,想可能存在的问题: 时间同步是否正常运行 hbase对时间是否同步很敏感 2.zookeeper报警 ZooKeeper 服务 canary 因未知原因失败. 该警报是在重启CM的 ...

  6. 密码正确 mysql无法登陆 red7.3 上安装mysql5.6后登录报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passswd :yes)

    集群需要mysql存储元数据,就在前几天还运行好好的,突然就进不去了......还是太菜,遇到的bug少. 引起这种故障的原因有很多......第一个坑比较多,大部分用户也就用第一个就可以解决问题,我 ...

  7. python1113

    点点滴滴才可以来开距离,人与人的差距是在点点滴滴中拉开的 break 语句可以跳出 for 和 while 的循环体的当前循环 continue语句被用来告诉Python跳过当前循环块中的剩余语句,然 ...

  8. Oracle Ora 错误解决方案合集

    注:本文来源于 < Oracle学习笔记 --- Oracle ORA错误解决方案 > ORA-00001: 违反唯一约束条件 (.)错误说明:当在唯一索引所对应的列上键入重复值时,会触发 ...

  9. Confluence 6 如何备份和恢复

    如何备份 有关备份你数据库使用的命令与你使用的具体数据库有关,例如针对 PostgreSQL 数据库,备份命令为 pg_dump dbname > outfile. 你应该针对你使用的数据库不同 ...

  10. Confluence 6 安装 Oracle

    如果你还没有在安装可以连接的 Oracle 数据库,请先下载后进行安装.请参考 Oracle 文档 来获取有关安装的指南. 当你设置你的 Oracle 服务器的时候: 字符集 必须使用 AL32UTF ...