传送门

想题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. 20165312 实验一 Java开发环境的熟悉

    20165312 实验一 Java开发环境的熟悉 一.实验内容及步骤 (一)使用JDK编译.运行简单的Java程序 Ctrl+Shift+T打开终端 输入cd cxgg20165312/test进入目 ...

  2. 支持flash in Chrome 2017

    在设置页面: chrome://settings/content 修改Flash插件的使用方式为:Allow sites to run Flash 来源: https://helpx.adobe.co ...

  3. java泛型的作用及实现原理

    一.泛型的介绍 泛型是Java 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Ja ...

  4. 数据库设计,表与表的关系,一对多。One-To-Many(2)

    一对多:主键数据表中只能包含一个记录,而在其关系记录表中这条记录可以与一个或多个记录相关,也可以没有记录与之相关. 关联映射:一对多/多对一存在最普遍的映射关系,简单来讲就如球员与球队的关系:一对多: ...

  5. oracle数据库中存储过程使用MD5算法加密

    一.技术点 1. DBMS_OBFUSCATION_TOOLKIT.MD5 DBMS_OBFUSCATION_TOOLKIT.MD5是MD5编码的数据包函数,但偶在使用select DBMS_OBFU ...

  6. container injection——容器技术

    (一)容器技术为什么出现 在很久很久以前,想要在线上服务器部署一个应用,首先需要购买一个物理服务器,在服务器安装一个操作系统,然后安装好应用所需要的各种依赖环境,最后才可以进行应用的部署,而且一台服务 ...

  7. python命名规则

    1 包.模块的命名规则:全部以小写字母形式来命名.比如:import random 2 类.对象的命名规则:类是每个单词的首字母要大写,其他字母小写比如:class MyFamily: ,类的私有属性 ...

  8. Python类继承(转发)

    目录 一.概述 二.类的继承 2.1 继承的定义 2.2 构造函数的继承 2.3 子类对父类方法的重写 三.类继承的事例 回到顶部 一.概述 面向对象编程 (OOP) 语言的一个主要功能就是“继承”. ...

  9. Dubbo helloword

    首先,开始编写服务提供者的api接口, SampleService  接口 package bhz.dubbo.sample.provider; import java.util.List; publ ...

  10. [leetcode]31. Next Permutation下一个排列

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...