正题

题目链接:https://www.luogu.com.cn/problem/P7405


题目大意

\(n\)个点在坐标轴上,\(q\)次每次所有点向一个方向移动若干步,每个点的权值是它第一次覆盖的区间长度(也就是一个区间只能贡献到第一次经过它的点)。

求所有点的最终权值。

\(1\leq n,q\leq 2\times 10^5\)


解题思路

因为两个点的区间只会被这两个点覆盖,所以考虑求出每个区间被两边各占了多少。

先去掉无用的条件,求出一个数组\(f\)满足正负交替表示一左一右,正负的绝对值各自递增。

然后在\(f\)数组上二分出两个点覆盖的区间第一次相交的时候就可以计算各自被覆盖多少了。

时间复杂度\(O(n\log n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=2e5+10;
ll n,m,Q,lmax,rmax,x[N],g[N],f[N],w[N];
signed main()
{
scanf("%lld%lld",&n,&Q);
for(ll i=1;i<=n;i++)scanf("%lld",&x[i]);
for(ll i=1;i<=Q;i++){
scanf("%lld",&g[i]);g[i]+=g[i-1];
if(g[i]>rmax){
if(f[m]<=0)rmax=f[++m]=g[i];
else rmax=f[m]=g[i];
}
if(g[i]<lmax){
if(f[m]>=0)lmax=f[++m]=g[i];
else lmax=f[m]=g[i];
}
}
w[1]-=lmax;w[n]+=rmax;
for(ll i=1;i<n;i++){
ll len=x[i+1]-x[i];
ll l=0,r=m-2;
while(l<=r){
ll mid=(l+r)>>1;
if(abs(f[mid])+abs(f[mid+1])>=len)r=mid-1;
else l=mid+1;
}
if(abs(f[l])+abs(f[l+1])>=len){
if(f[l+1]>0)w[i+1]-=f[l],w[i]+=len+f[l];
else w[i]+=f[l],w[i+1]+=len-f[l];
}
else{
if(f[l+1]>0)w[i+1]-=f[l],w[i]+=f[l+1];
else w[i]+=f[l],w[i+1]-=f[l+1];
}
}
for(ll i=1;i<=n;i++)
printf("%lld\n",w[i]);
return 0;
}

P7405-[JOI 2021 Final]雪玉【二分】的更多相关文章

  1. 「JOI 2017 Final」JOIOI 王国

    「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...

  2. 「JOI 2015 Final」舞会

    「JOI 2015 Final」舞会 略微思考一下即可知该过程可以化为一棵树.(3个贵族中选择1个,即新建一个节点连向这3个贵族). 该树的结点个数为\(2n\). 考虑二分答案mid. 判定的是公主 ...

  3. [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分

    题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...

  4. JOI 2018 Final 题解

    题目列表:https://loj.ac/problems/search?keyword=JOI+2018+Final T1 寒冬暖炉 贪心 暴力考虑每相邻两个人之间的间隔,从小到大选取即可 #incl ...

  5. LOJ#2351. 「JOI 2018 Final」毒蛇越狱

    LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...

  6. JOI 2019 Final合集

    JOI 2019 Final 合集 #3010. 「JOI 2019 Final」勇者比太郎 其实如果读懂题了就是水题了 题目就是让你求满足条件的\(JOI​\),使得\(O​\)在\(J​\)同行的 ...

  7. 【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)

    LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们 ...

  8. 【题解】LOJ2759. 「JOI 2014 Final」飞天鼠(最短路)

    [题解]LOJ2759. 「JOI 2014 Final」飞天鼠(最短路) 考虑最终答案的构成,一定是由很多飞行+一些上升+一些下降构成. 由于在任何一个点上升或者下降代价是一样的,所以: 对于上升操 ...

  9. 「JOI 2014 Final」飞天鼠

    「JOI 2014 Final」飞天鼠 显然向上爬是没有必要的,除非会下降到地面以下,才提高到刚好为0. 到达一个点有两种情况:到达高度为0和不为0. 对于高度不为0的情况,显然花费的时间越少高度越高 ...

随机推荐

  1. 干货!4大实验项目,深度解析Tag在可观测性领域的最佳实践!

    Opentelemetry协议,是CNCF(Cloud Native Computing Foundation-云原生计算基金会)定义的最新一代的可观测规范(目前还在孵化中),该规范定义了可观测性的三 ...

  2. 【springcloud】Zuul高级配置(zuul--3)

    转自:https://blog.csdn.net/pengjunlee/article/details/87285673 为路由提供HystrixFallback 当Zuul中某一个路由的断路器被断开 ...

  3. 【ArcEngine】多用户同时编辑同一个版本数据的解决方法

    ArcMap或ArcEngine中,使用多个用户同时编辑default版本的时候,问题就来了,StopEditing 错误信息如下 FDO_E_VERSION_REDEFINED -214721714 ...

  4. Docker是简介

    Docker是什么  使用最广泛的开源容器引擎 一种操作系统级的虚拟化技术 依赖于Linux内核特性:Namespace(资源隔离)和Cgroups(资源限制) 一个简单的应用程序打包工具 D ...

  5. PipedInputStream and PipedOutputStream example

    必须要有PipedInputStream ,PipedOutputStream 在不同线程,不然死锁 Java.io.PipedOutputStream and java.io.PipedInputS ...

  6. 在C++中使用openmp进行多线程编程

    在C++中使用openmp进行多线程编程 一.前言 多线程在实际的编程中的重要性不言而喻.对于C++而言,当我们需要使用多线程时,可以使用boost::thread库或者自从C++ 11开始支持的st ...

  7. Python - 面向对象编程 - MRO 方法搜索顺序

    为什么会讲 MRO? 在讲多继承的时候:https://www.cnblogs.com/poloyy/p/15224912.html 有讲到, 当继承的多个父类拥有同名属性.方法,子类对象调用该属性. ...

  8. Spring依赖注入的四种方式

    首先,我们需要定义一个Bean的class类: package framework.spring; import org.springframework.beans.BeansException; i ...

  9. Djangoda搭建——初步使用

    使用pycharm专业版>选择Django项目即可完成搭建 注:本次使用的是python3的虚拟环境,这里注意了这里使用的是python的集成环境Anaconda3,个人感觉比较好用进行pyth ...

  10. 从一个跨二十年的glibc bug说起

    1. 缘起 这几天调gcc 7.5.0 +glibc 2.23的交叉编译工具链,由于gcc 7.5.0的默认打开Werr,偶然发现了glibc一个隐藏了二十年的世纪大bug. 这个bug在glibc ...