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开头的子串有多少是之前没有出现过 ...
随机推荐
- thymeleaf:访问list,map等
1.map 在后端放入一个map Map<String, String> mapDict = serviceBaseDict.selectMap(ConstantDictType.SYSI ...
- 【原创】大数据基础之Kerberos(1)简介、安装、使用
kerberos5-1.17 官方:https://kerberos.org/ 一 简介 The Kerberos protocol is designed to provide reliable a ...
- 一个简单的Loading控件
实现效果如下: 使用方法: 在layout文件中添加以下代码: <com.example.jack.ui.widget.RingLoading android:layout_width=&quo ...
- 点9图 Android设计中如何切图.9.png
转载自:http://blog.csdn.net/buaaroid/article/details/51499516 本文主要介绍如何制作 切图.9.png(点9图),另一篇姊妹篇文章Android屏 ...
- Vue项目构建开发笔记(vue-lic3.0构建的)
1.router.js里面 { path: '/about', name: 'about', // route level code-splitting // this generates a sep ...
- 练就Java24章真经—你所不知道的工厂方法
前言 最近一直在Java方向奋斗<终于,我还是下决心学Java后台了>,今天抽空开始学习Java的设计模式了.计划有时间就去学习,你这么有时间,还不来一起上车吗? 之所以要学习Java模式 ...
- winform无需安装pdf阅读器打开pdf文件
控件来源:http://www.o2sol.com/pdfview4net/download.htm (使用版本:2016年8月31号更新版) 备份链接: https://pan.baidu.com/ ...
- ios消息机制
ios消息机制介绍 ios 调用每一个方法的时候其实是走的ios的消息机制 举例介绍一下 创建一个Pserson类 有一个eat 对象方法 那么下面的代码可以用消息机制实现 导入消息头文件 # ...
- mysql服务器没有响应
第一步删除c:\windowns下面的my.ini(可以先改成其它的名字也行) 第二步打开对应安装目录下\mysql\bin\winmysqladmin.exe 输入用户名 和密码(也可以忽略此步) ...
- verilog-testbench 时钟和复位模板
/********************************************* ** Clocks & Reset ******************************* ...