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

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cassert>
using namespace std;
#define ll long long
#define N 200010
#define inf 100000000000000000ll
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
int T,n,m,a[N],L[N],R[N],lg2[N];
ll s[N],f[N][19],g[N][19];
struct data
{int x,y;bool operator <(const data&a) const{return x<a.x;}
}edge[N];
ll query(int x,int y,ll f[N][19])
{if (x>y) return inf;return min(f[x][lg2[y-x+1]],f[y-(1<<lg2[y-x+1])+1][lg2[y-x+1]]);
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("bzoj5308.in","r",stdin);freopen("bzoj5308.out","w",stdout);const char LL[]="%I64d\n";
#elseconst char LL[]="%lld\n";
#endifn=read(),T=read();for (int i=1;i<n;i++) a[i]=read();for (int i=2;i<=n;i++) s[i]=s[i-1]+a[i-1];for (int i=2;i<=n;i++){lg2[i]=lg2[i-1];if ((2<<lg2[i])<=i) lg2[i]++;}while (T--){int m=read();for (int i=1;i<=m;i++) edge[i].x=read(),edge[i].y=read();sort(edge+1,edge+m+1);for (int i=1;i<=m;i++) f[i][0]=edge[i].y-s[edge[i].x];for (int j=1;j<=lg2[m];j++)for (int i=1;i<=m;i++)f[i][j]=min(f[i][j-1],f[min(i+(1<<j-1),n)][j-1]);for (int i=1;i<=m;i++) g[i][0]=edge[i].y+s[edge[i].x];for (int j=1;j<=lg2[m];j++)for (int i=1;i<=m;i++)g[i][j]=min(g[i][j-1],g[min(i+(1<<j-1),n)][j-1]);ll ans=0;for (int i=1;i<=m;i++){int l=1,r=edge[i].x-1;L[i]=r+1;while (l<=r){int mid=l+r>>1,p=max(1,mid-(edge[i].x-mid));int x=lower_bound(edge+1,edge+i+1,(data){mid,0})-edge,y=lower_bound(edge+1,edge+i+1,(data){p,0})-edge;if (query(y,x-1,f)+s[mid]>g[i][0]-s[mid]&&query(x,i-1,g)>g[i][0]) L[i]=mid,r=mid-1;else l=mid+1;}l=edge[i].x+1,r=n;R[i]=l-1;while (l<=r){int mid=l+r>>1,p=min(n,mid+(mid-edge[i].x)-1);int x=lower_bound(edge+i,edge+m+1,(data){mid+1,0})-edge-1,y=lower_bound(edge+i,edge+m+1,(data){p+1,0})-edge-1;if (query(i+1,x,f)>f[i][0]&&query(x+1,y,g)-s[mid]>f[i][0]+s[mid]&&(y==m||edge[y+1].x!=p+1||g[y+1][0]-s[mid]>=f[i][0]+s[mid])) R[i]=mid,l=mid+1;else r=mid-1;}}for (int i=1;i<=m;i++) ans+=R[i]-L[i]+1;printf(LL,ans);}return 0;
}

转载于:https://www.cnblogs.com/Gloid/p/10121412.html

BZOJ5308 ZJOI2018胖相关推荐

  1. bzoj5308[Zjoi2018]胖(线段树,二分,st表)

    Description Cedyks是九条可怜的好朋友(可能这场比赛公开以后就不是了),也是这题的主人公. Cedyks是一个富有的男孩子.他住在著名的ThePLace(宫殿)中. Cedyks是一个 ...

  2. bzoj 5308 [ZJOI2018] 胖

    bzoj 5308 [ZJOI2018] 胖 Link Solution \(\text{ZJOI2018}\) 最简单的一道题 首先看数据范围,大概就是每次 \(O(k\log n)\) 或者 \( ...

  3. 洛谷P4501/loj#2529 [ZJOI2018]胖(ST表+二分)

    题面 传送门(loj) 传送门(洛谷) 题解 我们对于每一个与宫殿相连的点,分别计算它会作为多少个点的最短路的起点 若该点为\(u\),对于某个点\(p\)来说,如果\(d=|p-u|\),且在\([ ...

  4. bzoj 5308: [Zjoi2018]胖

    Description Cedyks是九条可怜的好朋友(可能这场比赛公开以后就不是了),也是这题的主人公. Cedyks是一个富有的男孩子.他住在著名的ThePLace(宫殿)中. Cedyks是一个 ...

  5. yyb省选前的一些计划

    突然意识到有一些题目的计划,才可以减少大量查水表或者找题目的时间. 所以我决定这样子处理. 按照这个链接慢慢做. 当然不可能只做省选题了. 需要适时候夹杂一些其他的题目. 比如\(agc/arc/cf ...

  6. Loj #2529. 「ZJOI2018」胖

    Loj #2529. 「ZJOI2018」胖 题目描述 Cedyks 是九条可怜的好朋友(可能这场比赛公开以后就不是了),也是这题的主人公. Cedyks 是一个富有的男孩子.他住在著名的 The P ...

  7. [bzoj5308][二分][ST表]胖

    Description Cedyks是九条可怜的好朋友(可能这场比赛公开以后就不是了),也是这题的主人公. Cedyks是一个富有的男孩子.他住在著名的ThePLace(宫殿)中. Cedyks是一个 ...

  8. basic与python哪个容易胖_减肥看热量还是碳水化合物 脂肪和碳水哪个更容易长胖...

    对于减肥在控制体重的人来说,其实平时在饮食上面会很注意热量和碳水的摄入,这些对于我们的体重以及体脂都会有一定的影响,下面就来看看热量和碳水哪一个更让人发胖吧. 减肥看热量还是碳水化合物 都需要看,两者 ...

  9. 循环控制体重C语言,中年以后很容易发福变胖?4个建议帮你控制体重,保持轻盈体态...

    随着年龄的增长,尤其是40岁以后,我们会发现,对待自己的体重与身材之时会显得很无力,在年轻的时候,减掉几斤的体重并不难,而到了中年以后则会变得很困难,即使减重成功,也非常容易反弹,然而,无论我们处在什 ...

最新文章

  1. 【JOURNAL】911的虚惊
  2. Introduction to Automata Theory, Languages, and Computation部分习题解答
  3. 1、打印二进制机器码,程序内存分析,大端序小端序,指针数组,数组指针,数组的三种访问方式,typedef,#if-0-#endif,求数组大小,括号表达式
  4. mysql id会用完吗_数据库自增ID用完了会怎样?
  5. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 17丨文章浏览 II【难度中等】​
  6. Python二级笔记(18,19合集操作篇)
  7. 第4课 列朋波骨《小学生C++趣味编程》
  8. sklearn 线性回归_机器学习初级算法(二)——线性回归
  9. HTML邮件样式不生效,邮件Html踩坑
  10. C++学习(11)(综合题)
  11. python应用内部审计_软件机器人实现内部审计自动化变革,助力企业转型数字化审计...
  12. element-ui el-date-picker日期选择器 value-format问题
  13. 【sdx62】XBL设置共享内存变量,然后内核层获取变量实现
  14. Linux 调用openoffice报错 disconnected unexpectedly
  15. WPS文字绿色版下载 WPS Office 2010 中文绿色版
  16. cocos2d-js中使用react进行裁剪Sprit
  17. Java Elasticsearch | updated host [http://xxxx:9200] already in blacklist
  18. 现在完成时、过去完成时、完成进行时
  19. 三方支付频遭不可用事件,中心化支付体系尚能饭否
  20. 卷积层和全连接层的区别_CNN卷积层、全连接层的参数量、计算量

热门文章

  1. 自定义控件其实很简单4
  2. hMailServer数据库结构以及加密方法,php操作mysql添加数据库
  3. CF1539D PriceFixed(双指针+贪心)
  4. html 页面打印 分页符,html - 浮动的HTML / CSS打印分页符不起作用(例如:引导程序) - 堆栈内存溢出...
  5. python世界那么大_有一种冲动:世界那么大
  6. Android的WakeLock机制
  7. 主力洗盘的技术特征及应对技巧
  8. 1808亿次,16倍的超越!谈支付宝红包的高并发挑战
  9. java treemap 方法_Java TreeMap类
  10. java 方差计算_Java 实现样本方差的计算