题目描述:

Cedyks 是九条可怜的好朋友(可能这场比赛公开以后就不是了),也是这题的主人公。

Cedyks 是一个富有的男孩子。他住在著名的The Place(宫殿)中。

Cedyks 是一个努力的男孩子。他每天都做着不一样的题来锻炼他的The Salt(灵魂)。

这天,他打算在他的宫殿外围修筑一道城墙,城墙上有 $ n $ 座瞭望塔。你可以把城墙看做一条线段,瞭望塔是线段上的 $ n $ 个点,其中 $ 1 $ 和 $ n $ 分别为城墙的两个端点。其中第 $ i $ 座瞭望塔和第 $ i+1 $ 座瞭望塔的距离为 $ w_i $ ,他们之间的道路是双向的。

城墙很快就修建好了,现在Cedyks 开始计划修筑他的宫殿到城墙的道路。因为这题的题目名称,Cedyks 打算用他的宫殿到每一个瞭望塔的最短道路之和来衡量一个修建计划。

现在Cedyks 手上有 $ m $ 个设计方案,第 $ k $ 个设计方案会在宫殿和瞭望塔之间修建 $ T_k $ 条双向道路,第 $ i $ 条道路连接着瞭望塔 $ a_i $ ,长度为 $ l_i $ 。

计算到每一个瞭望塔的最短路之和是一个繁重的工程,本来Cedyks 想用广为流传的SPFA算法来求解,但是因为他的butter(缓冲区)实在是太小了,他只能转而用原始的贝尔福特曼算法来计算,算法的流程大概如下:

$ 1. $ 定义宫殿是 $ 0 $ 号点,第 $ i $ 个瞭望塔是 $ i $ 号点,双向边 $ u_i,v_i,l_i $ 为一条连接 $ u_i $ 和 $ v_i $ 的双向道路。令 $ d $ 为距离数组,最开始 $ d_0=0,d_i=10^{18}(i \in [1,n]) $ 。

$ 2. $ 令辅助数组 $ c=d $ 。依次对于每一条边 $ u_i,v_i,w_i $ 进行增广, $ c_{u_i}=min(c\_{u_i},d_{v_i}+w_i),c_{v_i}=min(c_{v_i},d_{u_i}+w_i) $ 。

$ 3. ​$ 令 $ t ​$ 为 $ c ​$ 和 $ d ​$ 中不一样位置个数,即令 $ S=\{i|c_i \neq d_i\} ​$ ,则 $ t=|S| ​$ 。若 $ t=0 ​$ ,说明 $ d ​$ 就是最终的最短路,算法结束。否则令 $ d=c ​$ ,回到第二步。

因为需要计算的设计方案实在是太多了,所以Cedyks 雇佣了一些人来帮他进行计算。为了避免这些人用捏造出来的数据偷懒,他定义一个设计方案的校验值为在这个方案上运行贝尔福特曼算法每一次进入第三步 $ t $ 的和。他会让好几个雇佣来的人计算同样的设计方案,并比对每一个人给出的校验值。

你是Cedyks 雇佣来的苦力之一,聪明的你发现在这个情形下计算最短路的长度的和是一件非常简单的事情。但是寄人篱下不得不低头,你不得不再计算出每一个方案的校验值来交差。

思路:

对于一个瞭望塔,他所能覆盖的一定是一段连续的区间,所以我们可以通过二分找到它的左右端点。

对于一个端点 $x$ 它能被瞭望塔 $p$ 覆盖的条件是:

令 $p,x$ 的距离为 $d$

在 $[x-d,x+d]$ 的范围内没有其他瞭望塔到 $x$ 的距离小于 $p$ 到 $x$ 的距离。(等于的情况有特别处理,后文说明)。

那么意味着我们要求一段连续区间内的瞭望塔到某个单点的距离的最小值,如果我们令 $dis[x]$ 表示端点 $x$ 到 $1$ 的距离,那么瞭望塔到单点的距离等于 $|dis[p]-dis[x]|+l$ 。为了去掉绝对值,我们对于瞭望塔在右的情况记录 $dis[p]+l$ ,并用 $st$ 表维护区间最小值。对于瞭望塔在左的情况记录 $dis[p]-l$ 维护区间最大值。

接下来对于距离相等的情况,首先如果是瞭望塔右侧的部分我们可以优先选择距离最贴近瞭望塔的,也就是坐标小的,在左侧的类比。

如果对于在瞭望塔两边且到瞭望塔的坐标相等的,我们可以规定选择小的那一边,这样就能保证只被选择一次。

以下代码:

#include<bits/stdc++.h>
#define il inline
#define LL long long
#define _(d) while(d(isdigit(ch=getchar())))
using namespace std;
const int N=2e5+5;
LL dis[N],v1[N],v2[N];
int n,m,k,Lg[N],st1[N][21],st2[N][21],p[N];
struct node{int x,l;
}t[N];
il int read(){int x,f=1;char ch;_(!)ch=='-'?f=-1:f;x=ch^48;_()x=(x<<1)+(x<<3)+(ch^48);return f*x;
}
bool cmp(node t1,node t2){return t1.x<t2.x;
}
il int Min(int t1,int t2){if(v1[t1]==v1[t2])return t1<t2?t1:t2;return (v1[t1]<v1[t2])?t1:t2;
}
il int Max(int t1,int t2){if(v2[t1]==v2[t2])return t1<t2?t2:t1;return (v2[t1]>v2[t2])?t1:t2;
}
il int getmn(int l,int r){int k=Lg[r-l+1];return Min(st1[l][k],st1[r-(1<<k)+1][k]);
}
il int getmx(int l,int r){int k=Lg[r-l+1];return Max(st2[l][k],st2[r-(1<<k)+1][k]);
}
il bool pd1(int x,int y){int l=(x<<1)-p[y],r=y,mid;l=lower_bound(p+1,p+1+k,l)-p;mid=upper_bound(p+1,p+1+k,x)-p-1;LL len=abs(dis[p[y]]-dis[x])+t[y].l;if(l<=mid){int t1=getmx(l,mid);if(dis[x]-v2[t1]<len)return 0;if(dis[x]-v2[t1]==len&&y!=t1){if(abs(p[t1]-x)<abs(p[y]-x))return 0;if(abs(p[t1]-x)==abs(p[y]-x)&&t1<y)return 0;}}if(mid<r){int t2=getmn(mid+1,r);if(v1[t2]-dis[x]<len)return 0;if(v1[t2]-dis[x]==len&&y!=t2){if(abs(p[t2]-x)<abs(p[y]-x))return 0;if(abs(p[t2]-x)==abs(p[y]-x)&&t2<y)return 0;}}return 1;
}
il bool pd2(int x,int y){int l=y,r=(x<<1)-p[y],mid;r=upper_bound(p+1,p+1+k,r)-p-1;mid=upper_bound(p+1,p+1+k,x)-p-1;LL len=abs(dis[p[y]]-dis[x])+t[y].l;if(l<=mid){int t1=getmx(l,mid);if(dis[x]-v2[t1]<len)return 0;if(dis[x]-v2[t1]==len&&y!=t1){if(abs(p[t1]-x)<abs(p[y]-x))return 0;if(abs(p[t1]-x)==abs(p[y]-x)&&t1<y)return 0;}}if(mid<r){int t2=getmn(mid+1,r);if(v1[t2]-dis[x]<len)return 0;if(v1[t2]-dis[x]==len&&y!=t2){if(abs(p[t2]-x)<abs(p[y]-x))return 0;if(abs(p[t2]-x)==abs(p[y]-x)&&t2<y)return 0;}}return 1;
}
int main()
{n=read();m=read();for(int i=2;i<=n;i++)dis[i]=dis[i-1]+read(),Lg[i]=Lg[i>>1]+1;for(int i=1;i<=m;i++){k=read();for(int i=1;i<=k;i++)t[i].x=read(),t[i].l=read();sort(t+1,t+1+k,cmp);for(int i=1;i<=k;i++)p[i]=t[i].x;for(int i=1;i<=k;i++)v1[i]=t[i].l+dis[t[i].x],v2[i]=dis[t[i].x]-t[i].l;for(int i=1;i<=k;i++)st1[i][0]=i,st2[i][0]=i;for(int j=1;j<=Lg[k];j++)for(int i=1;i+(1<<j)-1<=k;i++)st1[i][j]=Min(st1[i][j-1],st1[i+(1<<(j-1))][j-1]),st2[i][j]=Max(st2[i][j-1],st2[i+(1<<(j-1))][j-1]);LL ans=0;for(int i=1;i<=k;i++){int l=1,r=t[i].x,res=r;while(l<=r){int mid=(l+r)>>1;if(pd1(mid,i))res=mid,r=mid-1;else l=mid+1;}int kk=res;l=t[i].x,r=n,res=l;while(l<=r){int mid=(l+r)>>1;if(pd2(mid,i))res=mid,l=mid+1;else r=mid-1;}ans+=res-kk+1;}printf("%lld\n",ans);}return 0;
}

View Code

转载于:https://www.cnblogs.com/Jessie-/p/10642718.html

dtoj#3699. 胖(joke)相关推荐

  1. 笑口常开 (Joke)

    笑口常开 (Joke) <script src="/picjs.js" type="text/javascript"></script> ...

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

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

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

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

  4. OSChina 周六乱弹 —— 胖点其实挺好

    2019独角兽企业重金招聘Python工程师标准>>> 本编觉得我会在2016年走大运! 2016是个很6的年份,你看,2016=666+666+666+6+6+6 跨年夜风风火火地 ...

  5. 太胖就会变秃,这回真的有依据了!日本学者发现肥胖会诱导毛囊衰竭 | Nature...

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 明敏 发自 凹非寺 量子位 报道 | 公众号 QbitAI 如果在秃 ...

  6. 猫哥教你写爬虫 046--协程-实践-吃什么不会胖

    吃什么不会胖? 低热量食物 食物的数量有千千万,如果我们要爬取食物热量的话,这个数据量必然很大. 使用多协程来爬取大量的数据是非常合理且明智的选择 如果我们要爬取的话,那就得选定一个有存储食物热量信息 ...

  7. 二胖写参数校验的坎坷之路

    背景 最近端午好久没有和二胖聚一聚了,于是约了二胖到人民广场去宰他一顿,正好最近他跳槽加薪了. 我:二胖听说你最近跳槽了,并且还是从传统软件公司跳到了互联网公司,工资是不是涨了一点啊,今天你请客哈. ...

  8. 喝凉水都长胖?吸收比别人好?肠道菌群真是个任性的小妖精

    本文转载自"态昌基因",已获授权 BBC曾经出了一部拉仇恨的科教纪录片:为什么有的人长不胖. 英国某大学招募了10名自认为不容易发胖的志愿者,进行了为期4周的实验.在4周的时间里, ...

  9. Python中matplotlib默认绘制的条形图比较胖?如何设置成体型匀称的条形图,达到最佳的可视化效果。

    Python中matplotlib默认绘制的条形图比较胖?如何设置成体型匀称的条形图,达到最佳的可视化效果. #默认情形下的条形图 n_bars = len(x_labels)xval = np.ar ...

最新文章

  1. 初次运行git前的配置
  2. python搜索大文件
  3. TensorFlow1.0正式发布,AI圈“互怼”那些事儿 | AI科技评论周刊
  4. 大数据反欺诈技术架构
  5. s8050三极管经典电路_曝光一个产品级的红外发射电路
  6. Nagios之linux监控windows主机
  7. viper4android哪个版本好,viper4android免root版下载
  8. c语言字符统计程序源代码,c语言程序实例大全-220个详细程序源代码.rar
  9. ZOJ ACM忽悠训练
  10. oracle 同义词转换错误,一次对dual表的恢复操作(ORA-00980:同义词转换不再有效错误解决方法) (转载)...
  11. OSChina 周六乱弹 ——什么是村支书不可推卸的责任!
  12. RFID正为零售防损带来新变化
  13. 注册小程序需要营业执照吗?
  14. webView加载白屏
  15. 优动漫PAINT漫画和插画方面软件特色
  16. 【重载和重写的区别】
  17. CLion等JetBrains IDE学生认证免费使用流程
  18. Javascript夯实基础01
  19. 测试部门软件测试规范
  20. 微服务详讲:具体实践方法和基础设施简述

热门文章

  1. matlab遗传算法求多元函数最小值,matlab遗传算法求函数最小值
  2. 中缀表达式转换为前缀表达式(lisp实现)
  3. baidupcsgo安卓_BaiduPCS-Go的使用
  4. unity发布webgl本地搭建服务器
  5. windows中利用放大镜留下后门
  6. zsh+autojump
  7. KEIL MDK 提示“no browse info for symbol in this context”
  8. WebGoat General Crypto Basics
  9. 利用GPT-3 Fine-tunes训练专属语言模型
  10. win10下火狐浏览器代理服务器拒绝连接解决办法