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开头的子串有多少是之前没有出现过 ...
随机推荐
- Light OJ 1011
题意: (好难看) 给你 N 个 男的, 女的, 男的选女票, 题目给出矩阵, Mp[i][j] 表示 第 i 个男的选 第 J 个女的优先值 选了 J 之后的就不能选 J 了: 求所有狗男女的最大优 ...
- Linux 文档与目录结构
Linux之文档与目录结构 Linux文件系统结构 Linux目录结构的组织形式和Windows有很大的不同.首先Linux没有“盘(C盘.D盘.E盘)”的概念.已经建立文件系统的硬盘分区被挂载到 ...
- Python-Mongodb vs mysql
mongodb https://www.cnblogs.com/kermitjam/articles/10147254.html#_label5 centos安装mongodb: https://bl ...
- est是基于less的样式工具库
网址:http://ecomfe.github.io/est/ 此处HTML中如果直接引用less就会报错! est 如果直接引用less和js 是会报错的 样式规范:https://www.zybu ...
- UserNotifications ios10 通知使用
通知在ios10 中推荐使用 导入 import UserNotifications 头文件 if #available(iOS 10.0, *) { UNUserNotificationCent ...
- web的分页方法
web分页的三种方式,闲来无事总结一下. 1.使用前端表格插件进行分页 例如用bootstrap的拓展table组件,注意设置其分页属性时设置为"client", 即是 sideP ...
- python使用 HTMLTestRunner.py生成测试报告
HTMLTestRunner.py python 2版本 下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html 使用时,先建立一个”PyDe ...
- day14 迭代器 生成器 面向过程思想
"" 迭代器 什么是迭代器(iterator) 器指的某种工具, 迭代指的是更新换代的过程,例如应用程序的版本更新从1.0 变成 1.1 再1.2 迭代的目的是要根据上一个结果,产 ...
- LeetCode(97):交错字符串
Hard! 题目描述: 给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的. 示例 1: 输入: s1 = "aabcc", s2 = &qu ...
- 【python】del
参考:http://blog.csdn.net/love1code/article/details/47276683 del 删除的是变量,不是数据! if __name__=='__main__': ...