传送门

想题5分钟调题两小时系列 其实还是我tcl

读完题之后自然会知道一个关键点能够更新的点是一段连续的区间,于是我们对于每个点能到的左右区间二分答案,用ststst表维护一下查询即可。

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
const int N=2e5+5;
typedef long long ll;
ll s1[N],s2[N],ans;
int mp[N],a[N],n,m,k;
struct pot{int a;ll w;friend inline bool operator<(const pot&a,const pot&b){return a.a<b.a;}}b[N];
struct ST{
	ll st[N][20];
	int Log[N];
	inline void init(){Log[0]=-1;for(ri i=1;i<=n;++i)Log[i]=Log[i>>1]+1;}
	inline void Pre(){
		for(ri i=1;i<=k;++i)st[i][0]=b[i].w;
		for(ri j=1;j<=Log[k];++j)for(ri i=1;i<=k;++i)st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);
	}
	inline ll query(int l,int r){
		l=lower_bound(mp+1,mp+k+1,max(l,1))-mp;
		r=upper_bound(mp+1,mp+k+1,min(r,n))-mp-1;
		if(l>r)return 1e18;
		int k=Log[r-l+1];
		return min(st[l][k],st[r-(1<<k)+1][k]);
	}
}pre,suf;
inline bool check1(int mid,int x){
	if(mid==x)return 1;
	ll d1=pre.query(mid*2-x+1,mid)+s1[mid],d2=suf.query(mid,x-1)-s1[mid],d3=suf.query(x,x)-s1[mid];
	if(d1<=d3||d2<=d3)return 0;
	return mid*2-x>=1?pre.query(mid*2-x,mid*2-x)+s1[mid]>=d3:1;
}
inline bool check2(int x,int mid){
	if(x==mid)return 1;
	ll d1=suf.query(mid,mid*2-x-1)-s1[mid],d2=pre.query(x+1,mid)+s1[mid],d3=pre.query(x,x)+s1[mid];
	if(d1<=d3||d2<=d3)return 0;
	return mid*2-x<=n?suf.query(mid*2-x,mid*2-x)-s1[mid]>d3:1;
}
inline void solve(int id){
	int l=1,r=b[id].a,res1=0,res2=0,mid;
	while(l<=r){if(check1((mid=l+r>>1),b[id].a))r=mid-1,res1=mid;else l=mid+1;}
	l=b[id].a,r=n;
	while(l<=r){if(check2(b[id].a,(mid=l+r>>1)))l=mid+1,res2=mid;else r=mid-1;}
	ans+=res2-res1+1;
}
int main(){
	n=read(),m=read();
	pre.init(),suf.init();
	for(ri i=2;i<=n;++i)s1[i]=s1[i-1]+(a[i]=read());
	while(m--){
		ans=0,k=read();
		for(ri i=1;i<=k;++i)b[i].a=read(),b[i].w=read()-s1[b[i].a];
		sort(b+1,b+k+1);
		for(ri i=1;i<=k;++i)mp[i]=b[i].a;
		pre.Pre();
		for(ri i=1;i<=k;++i)b[i].w+=s1[b[i].a]<<1;
		suf.Pre();
		for(ri i=1;i<=k;++i)solve(i);
		cout<<ans<<'\n';
	}
	return 0;
}

2019.03.04 bzoj5308: [Zjoi2018]胖(二分答案+st表)的更多相关文章

  1. 2018.10.14 NOIP训练 直线(二分答案+st表+切比雪夫距离转化)

    传送门 二分答案好题. 这已经是当年普及组模拟时挖的坑了233. 这道题还是很不错的. 考虑把坐标系转个45度再操作. 为了不爆精度可以直接转切比雪夫距离. 然后就直接二分答案. 其中竖线就按二分的答 ...

  2. bzoj3277 串 (后缀数组+二分答案+ST表)

    常见操作:先把所有串都连到一起,但中间加上一个特殊的符号(不能在原串中/出现过)作为分割 由于全部的子串就等于所有后缀的所有前缀,那我们对于每一个后缀,去求一个最长的前缀,来满足这个前缀在至少K个原串 ...

  3. P7599-[APIO2021]雨林跳跃【二分,倍增,ST表】

    正题 题目链接:https://www.luogu.com.cn/problem/P7599 题目大意 \(n\)棵树,在某棵树上时可以选择向左右两边第一棵比它高的树跳,现在\(q\)次询问从\([A ...

  4. ZJOI2018 胖 二分 ST表

    原文链接https://www.cnblogs.com/zhouzhendong/p/ZJOI2018Day2T2.html 题目传送门 - BZOJ5308 题目传送门 - LOJ2529 题目传送 ...

  5. BZOJ5308 ZJOI2018胖

    贝尔福特曼(?)的方式相当于每次将所有与源点直接相连的点的影响区域向两边各扩展一格.显然每个点在过程中最多更新其他点一次且这些点构成一段连续区间.这个东西二分st表查一下就可以了.注意某一轮中两点都更 ...

  6. 【CSP膜你赛】柠檬的密码(manacher 二分 单调性 st表)

    题目描述 Lemon觉得他需要一个复杂的密码来保证他的帐号的安全.他经过多日思考,决定使用一个长度为奇数的回文串来作为他的密码.  但是这个回文串太长了,Lemon记不住,于是Lemon决定把它记在本 ...

  7. Codeforces 475D 题解(二分查找+ST表)

    题面: 传送门:http://codeforces.com/problemset/problem/475/D Given a sequence of integers a1, -, an and q ...

  8. [BZOJ3277/BZOJ3473] 串 - 后缀数组,二分,双指针,ST表,均摊分析

    [BZOJ3277] 串 Description 现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). Solution 首先将所有串连 ...

  9. [多校联考2019(Round 4 T2)][51nod 1288]汽油补给(ST表+单调栈)

    [51nod 1288]汽油补给(ST表+单调栈) 题面 有(N+1)个城市,0是起点N是终点,开车从0 -> 1 - > 2...... -> N,车每走1个单位距离消耗1个单位的 ...

随机推荐

  1. 关于spring boot在IDE工具中可以启动成功,但是打成jar包以及运行jar包失败的问题

    1. 运行jar包报错,如下图: 2. 首先,找到pom.xml,把下面的build块中的内容改成如下所示: 3. 然后,请千万不要用Intellij idea来打包项目为Jar,你应该来到项目的根目 ...

  2. CentOS7 安装kafka集群

    1. 环境准备 JDK1.8 ZooKeeper集群(参见本人博文) Scala2.12(如果需要做scala开发的话,安装方法参见本人博文) 本次安装的kafka和zookeeper集群在同一套物理 ...

  3. WordPress版微信小程序开发系列(一):WordPress REST API

    自动我发布开源程序WordPress版微信小程序以来,很多WordPress站长在搭建微信小程序的过程中会碰到各种问题来咨询我,有些问题其实很简单,只要仔细看看我写的文章,就可以自己解决.不过这些文章 ...

  4. postgresql数据库备份

    一.工具备份数据 打开windows下的命令窗口:开始->cmd->安装数据库的目录->进入bin目录: 导出命令:pg_dump –h localhost –U postgres ...

  5. REST framwork之解析器

    一 我们首先要知道解析器是什么以及他的功能: REST framework 包含许多内置的解析器类,允许接受各种媒体类型(media types)的请求.还支持自定义解析器,这使你可以灵活地设计 AP ...

  6. 多线程之sleep和wait的区别

    它们最大本质的区别是:sleep()不释放同步锁,wait()释放同步锁. 还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用inter ...

  7. 李清华201772020113《面向对象程序设计(Java)》第六周学习总结

    第一部分 理论知识 1.继承 用已有类来构建新类的一种机制.新类可以继承父类的方法和域,同时可以在新类中添加新的方法和域. 已有类称为:超类.基类或父类.新类称作:子类.派生类或孩子类. 子类的构造器 ...

  8. JAVA 注解,泛型,反射获取泛型,并实例化

    JAVA 的泛型加大了 编程的灵活性,在配合上反射,可以让我们省去大量的重复代码,当你用 SpringBoot 整合 JPA 的时候 你会发现,你的 DAO 层只需要继承 BaseDao,在显示标明泛 ...

  9. leetcode283

    public class Solution { public void MoveZeroes(int[] nums) { ; ; i < nums.Length; i++) { //[0, 1, ...

  10. 【原】The Linux Command Line - Workiing with commands

    ● type – Indicate how a command name is interpreted● which – Display which executable program will b ...