一眼望去不会。

考虑问题中的\(f(i,j)=|\sum_{p=i}^{j}​a_p​ |\)的实际意义。

其实就是前缀和相减的绝对值。

\(f(i,j)=|\ sum[j]-sum[i-1]\ |\)

\(f(i,j)=max(sum[j]-sum[i-1],sum[i-1]-sum[j])\)

那加上x呢。

\(f(i,j)=max[(sum[j]+xj)-(sum[i-1]+x(i-1)),(sum[i-1]+x(i-1))-(sum[j]+xj)]\)

\(sum[i]+xi\)联想到直线。

我们把这些直线放到坐标系里。

(这个图是从别人那里蒯过来的)



这是把样例转为坐标系中直线的效果图。

对于一个 \(x\) ,我们询问的实际上就是横坐标为x的两条直线纵坐标的差的最大值。

所以我们用半平面交的方法维护出上下两个凸包。

因为题目中的强制在线是假的(实际上处理出的\(x\in [-2n,2n]\))。

又因为凸包上的线段斜率是单调的,我们可以直接处理出所有 \(x\) 时的答案。

然后这题就解决了。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
const int N=201000;
const double eps=1e-8;
double sum[N];
struct node{
double x,y;
node(double xx=0,double yy=0){
x=xx;y=yy;
}
};
int top1,top2;
struct Line{
node u,v;
double w;
}a[N],stack1[N],stack2[N];
node operator +(node a,node b){
return node(a.x+b.x,a.y+b.y);
}
node operator -(node a,node b){
return node(a.x-b.x,a.y-b.y);
}
node operator *(node a,double b){
return node(a.x*b,a.y*b);
}
double chaji(node a,node b){
return a.x*b.y-a.y*b.x;
}
node jiao(Line a,Line b){
double A=chaji(b.u-a.u,b.v-a.u);
double B=chaji(b.v-a.v,b.u-a.v);
return a.u+(a.v-a.u)*(A/(A+B));
}
bool judge1(Line a,Line b,Line c){
node x=jiao(b,c);
if(chaji(x-a.u,a.v-a.u)+eps>=0)return true;
else return false;
}
bool judge2(Line a,Line b,Line c){
node x=jiao(b,c);
if(chaji(x-a.u,a.v-a.u)+eps<0)return true;
else return false;
}
int read(){
int sum=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return sum*f;
}
int n,m;
double w(Line a,double x){
// cout<<a.w<<endl;
return a.u.y+a.w*(x-(-2.0*n));
}
map<int,double>ans;
long long lastans;
int main(){
n=read();m=read();
for(int i=1;i<=n;i++)sum[i]=sum[i-1]+read();
for(int i=1;i<=n;i++){
a[i].u=node(-2.0*n,sum[i]+i*-2.0*n);
a[i].v=node(2.0*n,sum[i]+i*2.0*n);
a[i].w=i;
}
a[0].u=node(-2.0*n,0);a[0].v=node(2.0*n,0);
a[0].w=0;
for(int i=0;i<=n;i++){
while(top1>1&&judge1(a[i],stack1[top1-1],stack1[top1]))top1--;
stack1[++top1]=a[i];
}
for(int i=n;i>=0;i--){
while(top2>1&&judge2(a[i],stack2[top2-1],stack2[top2]))top2--;
stack2[++top2]=a[i];
}
int now1=1;int now2=1;
for(int i=-2*n;i<=n*2;i++){
while(now1<top1&&w(stack1[now1+1],i)>=w(stack1[now1],i))now1++;
while(now2<top2&&w(stack2[now2+1],i)<=w(stack2[now2],i))now2++;
double A=w(stack1[now1],i);
double B=w(stack2[now2],i);
ans[i]=A-B;
}
lastans=0;
while(m--){
int x=read();
x=(x+lastans)%(4*n+1)-2*n;
lastans=ans[x];
printf("%.0lf\n",ans[x]);
}
return 0;
}

luogu P4756 Added Sequence(凸包+思维)的更多相关文章

  1. BZOJ1345 Baltic2007 序列问题Sequence 【思维题】*

    BZOJ1345 Baltic2007 序列问题Sequence Description 对于一个给定的序列a1,…,an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用 ...

  2. luogu 2742 二维凸包

    链接 luogu 模板一 上下利用斜率求凸包然后合并. #include <bits/stdc++.h> using namespace std; const int N=10005; c ...

  3. BZOJ 1069 Luogu P4166 最大土地面积 (凸包)

    题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=1069 (luogu)https://www.luogu.org/probl ...

  4. HDU 2062:Subset sequence(思维)

    Subset sequence Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...

  5. Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence(思维)

    传送门 题意: 给你一个只包含 '(' 和 ')' 的长度为 n 字符序列s: 给出一个操作:将第 i 个位置的字符反转('(' ')' 互换): 问有多少位置反转后,可以使得字符串 s 变为&quo ...

  6. Serval and Parenthesis Sequence【思维】

    Serval and Parenthesis Sequence 题目链接(点击) Serval soon said goodbye to Japari kindergarten, and began ...

  7. luogu P4724 模板 三维凸包

    LINK:三维凸包 一个非常古老的知识点.估计也没啥用. 大体上了解了过程 能背下来就背下来吧. 一个bf:暴力枚举三个点 此时只需要判断所有的点都在这个面的另外一侧就可以说明这个面是三维凸包上的面了 ...

  8. luogu P3829 [SHOI2012]信用卡凸包 凸包 点的旋转

    LINK:信用卡凸包 当 R==0的时候显然是一个点的旋转 之后再求凸包即可. 这里先说点如何旋转 如果是根据原点旋转的话 经过一个繁杂的推导可以得到一个矩阵. [cosw,-sinw] [sinw, ...

  9. Funny Positive Sequence (思维+前缀)

    There are n integers a 1,a 2,…,a n-1,a n in the sequence A, the sum of these n integers is larger th ...

随机推荐

  1. Android传统HTTP请求get----post方式提交数据(包括乱码问题)

    1.模仿登入页面显示(使用传统方式是面向过程的) 使用Apache公司提供的HttpClient  API是面向对象的 (文章底部含有源码的连接,包括了使用async框架) (解决中文乱码的问题.主要 ...

  2. Python 远程调用MetaSploit

    (1)安装Python的msgpack类库.MSF官方文档中的数据序列化标准就是參照msgpack. root@kali:~# apt-get install python-setuptools ro ...

  3. POJ 1166 The Clocks (暴搜)

    发现对这样的模拟题根本没啥思路了,本来准备用bfs的.可是结果超时了,这是參考别的人代码写的: #include <stdio.h> #include <iostream> # ...

  4. 【CSS】CSS画矩形、圆、半圆、弧形、半圆、小三角、疑问框

    在网页中,常常会用到各种Icon,假设老是麻烦设计狮画出来不免有些不好意思,所以有时候我们也能够用CSS写出各种简单的形状.一来能够减轻他们的负担,二来也能够使用CSS替代图片.提高载入速度. 在网页 ...

  5. 优雅的App全然退出方案(没有不论什么内存泄漏隐患)

    在Android开发过程中,特别是界面比較多的情况下,用寻常的退出方式往往是不能全然退出这个应用,网络上也好多各种退出方案.当中一种应该是被广大开发人员採纳使用,也很的清晰方便.就是在Applicat ...

  6. POJ1151 Atlantis 扫描线算法

    题目大意 给出几个矩形对角端点坐标,求这些矩形整体覆盖的面积. 扫描线算法 整个平面被每个矩形的水平边所在直线(以后简称“水平线”)分成了几个部分,而整体覆盖面积则为每相邻的两个水平线间夹的长度(以后 ...

  7. Elasticsearch日志收集

    Install pip if necessary curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py&q ...

  8. Ubuntu16.04下将hadoop2.7.3源代码导入到eclipse neon中

    0.为什么会有这篇: 这篇文章的目的在于帮助想学习hadoop源码的内容,却在导入的过程中出现了各种问题的人. 或许你一定找了很多博客都无果,那么不用担心,我和你一样,这也是这篇文章存在的意义,废话少 ...

  9. 移动测试基础—adb、monkey命令

    最近打算把移动测试相关的知识总结一下,先从基础开始吧,总结一下adb.monkey命令 adb常用命令总结 adb / adb -help 使用帮助 adb devices 查看连接到电脑的设备 ad ...

  10. python简易版学生管理系统

    #coding=utf- def showInfo(): print("**************") print(" 学生管理系统") print(&quo ...