ZJOI2018 胖 二分 ST表
原文链接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表的更多相关文章
- BZOJ 5308 [ZJOI2018] Day2T2 胖 | 二分 ST表
题目链接 LOJ 2529 BZOJ 5308 题解 这么简单的题 为什么考场上我完全想不清楚 = = 对于k个关键点中的每一个关键点\(a\),二分它能一度成为哪些点的最短路起点(显然这些点在一段包 ...
- 洛谷P4501/loj#2529 [ZJOI2018]胖(ST表+二分)
题面 传送门(loj) 传送门(洛谷) 题解 我们对于每一个与宫殿相连的点,分别计算它会作为多少个点的最短路的起点 若该点为\(u\),对于某个点\(p\)来说,如果\(d=|p-u|\),且在\([ ...
- 「ZJOI2018」胖(ST表+二分)
「ZJOI2018」胖(ST表+二分) 不开 \(O_2\) 又没卡过去是种怎么体验... 这可能是 \(ZJOI2018\) 最简单的一题了...我都能 \(A\)... 首先我们发现这个奇怪的图每 ...
- BZOJ4556:[TJOI\HEOI2016]字符串(后缀数组,主席树,二分,ST表)
Description 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为n的字符串s,和m个问题.佳媛姐姐必须正确回答这m个问题,才能打开箱 ...
- BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】
题目 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题. 现在你拥有n颗宝石,每颗宝石 ...
- [BZOJ4310] 跳蚤 - 后缀数组,二分,ST表
[BZOJ4310] 跳蚤 Description 首先,他会把串分成不超过 \(k\) 个子串,然后对于每个子串 \(S\) ,他会从 \(S\) 的所有子串中选择字典序最大的那一个,并在选出来的 ...
- HDU5726 GCD(二分 + ST表)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Give you a sequence of N(N≤100, ...
- BZOJ3473:字符串(后缀数组,主席树,二分,ST表)
Description 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? Input 第一行两个整数n,k. 接下来n行每行一个字符串. Output 一 ...
- BZOJ 3230 相似子串 | 后缀数组 二分 ST表
BZOJ 3230 相似子串 题面 题解 首先我们要知道询问的两个子串的位置. 先正常跑一遍后缀数组并求出height数组. 对于每一个后缀suffix(i),考虑以i开头的子串有多少是之前没有出现过 ...
随机推荐
- CSS rem长度单位
1. 概述 1.1 说明 rem是css3中新增的一个单位属性(font size of the root element),根据页面的根节点(html)的字体大小进行转换的单位,通过此单位属性可以进 ...
- 04 if条件判断 流程控制
条件判断 if 语法一: if 条件: # 条件成立时执行的子代码块 代码1 代码2 代码3 示例: sex='female' age=18 is_beautiful=True if sex == ' ...
- BeautifulSoup解析器的选择
BeautifulSoup解析器 在我们使用BeautifulSoup的时候,选择怎样的解析器是至关重要的.使用不同的解析器有可能会出现不同的结果! 今天遇到一个坑,在解析某html的时候.使用htm ...
- cmder 神器 +curl
cmder 神器 https://www.jianshu.com/p/7a706c0a3411 curl https://www.cnblogs.com/zhuzhenwei918/p/6781314 ...
- CDH运维
1.单个节点宕机后,想可能存在的问题: 时间同步是否正常运行 hbase对时间是否同步很敏感 2.zookeeper报警 ZooKeeper 服务 canary 因未知原因失败. 该警报是在重启CM的 ...
- 密码正确 mysql无法登陆 red7.3 上安装mysql5.6后登录报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passswd :yes)
集群需要mysql存储元数据,就在前几天还运行好好的,突然就进不去了......还是太菜,遇到的bug少. 引起这种故障的原因有很多......第一个坑比较多,大部分用户也就用第一个就可以解决问题,我 ...
- python1113
点点滴滴才可以来开距离,人与人的差距是在点点滴滴中拉开的 break 语句可以跳出 for 和 while 的循环体的当前循环 continue语句被用来告诉Python跳过当前循环块中的剩余语句,然 ...
- Oracle Ora 错误解决方案合集
注:本文来源于 < Oracle学习笔记 --- Oracle ORA错误解决方案 > ORA-00001: 违反唯一约束条件 (.)错误说明:当在唯一索引所对应的列上键入重复值时,会触发 ...
- Confluence 6 如何备份和恢复
如何备份 有关备份你数据库使用的命令与你使用的具体数据库有关,例如针对 PostgreSQL 数据库,备份命令为 pg_dump dbname > outfile. 你应该针对你使用的数据库不同 ...
- Confluence 6 安装 Oracle
如果你还没有在安装可以连接的 Oracle 数据库,请先下载后进行安装.请参考 Oracle 文档 来获取有关安装的指南. 当你设置你的 Oracle 服务器的时候: 字符集 必须使用 AL32UTF ...