【问题描述】
山山最近在玩一款游戏叫战舰世界(steam 游戏太少了),他被大舰巨炮的魅力折服,于
是山山开了一局游戏,这次发现目标是一艘战列舰新墨西哥级,舰桥很高,原本应该打在目
标身后的圆形水域内的炮弹,都打在了舰桥上,于是落点变成了一条直线。
因为新墨西哥中间高两边低,所以按概率算,炮弹命中数中间多,两边少,并且中央区
域容易穿透出现高伤害,所以 山山向中间发射的炮弹比两边多,因为他有强迫症,所以一
个位置炮弹发射数相对于上一个位置的数目的变化量为 ki(整体大概构成一个山峰状),新墨
西哥操纵者因为 OI 的时候玩游戏,脑袋被教练按键盘了,所以站着不动,导致山山能够百
发百中,求数轮齐射后,在一段区域的命中数为阶梯增长的长度 (阶梯增长为 A+0K,
A+1K· · ·K 随意取,单调增)
(为了便于统计伤害,我们把新墨西哥分成 n 段,同时也
便于瞄准。
新墨西哥被教练抓着脑袋摁键盘了,我就不信我也 gbhghuyjhhfdhsfdhndxf......
【输入格式】
输入文件名为 wows.in。
第一行 n m, 表示新墨西哥被分成 n 段, 山山开炮数和询问命中次数的总数,
第二行以后每行开头一个 f,0 表示开炮,1 表示询问
如果开炮 后面还有 5 个参数 l,r,a,k,p
表示 山山向 l 到 r 段开炮,l 段开了 a 炮,以后 l + 1 到 p 段分别开 a+k,a+k+k,
a+k+k+k···炮, p+1 到 r 段开 a+(p-l-1)k、a+(p-l-2)k···炮
如果询问 后面有 l,r 表示询问区域(保证任意相邻区段数据之差在任何时候在 int 内)
【输出格式】
输出文件名为 wows.out。
对于每个询问输出一个数,表示符合要求的最大长度,后跟一个回车
【样例输入与输出】

5 3

0 1 5 2 2 3

0 4 5 4 4 5

1 1 5

输出

5

题目大意是每一次给一个区间加上两段等差数列

在线询问l~r之间的最长等差数列

这道题最坑的是题意描述,划掉的递增指的是k的系数

只要等差就行

于是先差分一次,c[i]=a[i+1]-a[i]那么对于加上a,a+k,a+2k,a+3k,a+2k,a+k这个序列

差分后等价于a k k k -k -k -a-k

也就是:c[l-1]+=a,c[l~p-1]+=k,c[p~r-1]-=k,c[r]=-a-(2*p-l-r)*k

差分后,询问就变成了求差分数组中最长的一段值相同的连续区间长度+1

这个可以用线段树维护

对于每个点,维护以下变量:

ls,rs:线段最左边/右边连续相同的长度

lp,rp:线段最左边/右边连续相同的数字

s:当前线段最长连续相等区间

延迟标记另用一个数组,因为延迟标记不参与合并操作

合并左右节点的信息:

首先:c[rt].ls=c[rt*2].ls,c[rt].rs=c[rt*2+1].rs

c[rt].lp=c[rt*2].lp,c[rt].rp=c[rt*2+1].rp

c[rt].s=max(c[rt*2].s,c[rt*2+1].s)

当c[rt*2]全为一个数且c[rt*2].rp与c[rt*2+1].lp相同,那么显然右边区间ls都可以作为新区间的ls

rs的处理同理

接下来考虑两个区间对s的影响

如果c[rt*2].rp==c[rt*2+1].lp那么显然这一段可以作为一段新的连续相同序列

c[rt].s=max(c[rt].s,c[rt*2].rs+c[rt*2+1].ls)

其实还可以再差分一次,这样就只涉及单点修改,并询问最长的连续0的数量+2

拿上面举例

一次差分后:a k k k -k -k -a-k

二次差分后:a k-a 0 0 -2k,0,-a,a+k

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node {
int ls,rs;
int lp,rp;
int s,l,r;
} c[];
int n,m,lazy[];
Node merge(Node L,Node R) {
Node C;
int mid=L.r;
C.l=L.l;
C.r=R.r;
C.ls=L.ls;
C.rs=R.rs;
C.lp=L.lp;
C.rp=R.rp;
if (L.rs==mid-L.l+&&L.rp==R.lp)
C.ls+=R.ls;
if (R.ls==R.r-mid&&R.lp==L.rp)
C.rs+=L.rs;
C.s=max(L.s,R.s);
if (L.rp==R.lp)
C.s=max(C.s,L.rs+R.ls);
return C;
}
void build(int rt,int l,int r) {
if (l>r) return;
if (l==r) {
c[rt].l=c[rt].r=l;
c[rt].ls=c[rt].rs=;
c[rt].lp=c[rt].rp=;
c[rt].s=;
return;
}
int mid=(l+r)/;
build(rt*,l,mid);
build(rt*+,mid+,r);
c[rt]=merge(c[rt*],c[rt*+]);
}
void pushdown(int rt) {
if (lazy[rt]) {
c[rt*].lp+=lazy[rt];
c[rt*].rp+=lazy[rt];
c[rt*+].lp+=lazy[rt];
c[rt*+].rp+=lazy[rt];
lazy[rt*]+=lazy[rt];
lazy[rt*+]+=lazy[rt];
lazy[rt]=;
}
}
void add(int rt,int l,int r,int L,int R,int d) {
if (l>r) return;
if (l==L&&r==R) {
c[rt].lp+=d;
c[rt].rp+=d;
lazy[rt]+=d;
return;
}
int mid=(l+r)/;
pushdown(rt);
if (L>mid)
add(rt*+,mid+,r,L,R,d);
else if (R<=mid)
add(rt*,l,mid,L,R,d);
else {
add(rt*,l,mid,L,mid,d);
add(rt*+,mid+,r,mid+,R,d);
}
c[rt]=merge(c[rt*],c[rt*+]);
}
Node query(int rt,int l,int r,int L,int R) { if (l==L&&r==R) {
return c[rt];
}
int mid=(l+r)/;
pushdown(rt);
c[rt]=merge(c[rt*],c[rt*+]);
if (L>mid)
return query(rt*+,mid+,r,L,R);
else if (R<=mid)
return query(rt*,l,mid,L,R);
else {
Node cl=query(rt*,l,mid,L,mid);
Node cr=query(rt*+,mid+,r,mid+,R);
return merge(cl,cr);
}
}
int main() {
int l,r,a,k,p,i,f;
freopen("wows.in","r",stdin);
freopen("wows.out","w",stdout);
cin>>n>>m;
build(,,n-);
for (i=; i<=m; i++) {
scanf("%d",&f);
if (f==) {
scanf("%d%d%d%d%d",&l,&r,&a,&k,&p);
if (l!=)
add(,,n-,l-,l-,a);
if (l<=p-)
add(,,n-,l,p-,k);
if (p<=r-)
add(,,n-,p,r-,-k);
if (r!=n)
add(,,n-,r,r,-a-(*p-l-r)*k);
} else {
scanf("%d%d",&l,&r);
if (l==r) printf("1\n");
else
printf("%d\n",query(,,n-,l,r-).s+);
}
}
}

wows的更多相关文章

  1. [测试题]wows

    Description 山山最近在玩一款游戏叫战舰世界(steam 游戏太少了),他被大舰巨炮的魅力折服,于是山山开了一局游戏,这次发现目标是一艘战列舰新墨西哥级,舰桥很高,原本应该打在目标身后的圆形 ...

  2. ●线段树题之wows

    ●模拟考试的一道似乎是学长出的题,还不错,挺考代码能力的.以此记录. ●题目以被上传(改了改说法),6128 Lence的方块们 ● (像手纸一样长的贴图……) ●题目大意: 有横向排布的n个点,每个 ...

  3. 二、JavaScript语言--JS基础--JavaScript进阶篇--浏览器对象

    1.window对象 window对象是BOM的核心,window对象指当前的浏览器窗口. window对象方法:

  4. Node.js 蚕食计划(三)—— Express 启航

    如果看过上一篇<Node.js 蚕食计划>,就会发现手动搭建一个 web 服务器还是比较繁琐 而 express 就是一个可以极大地提高开发效率的 web 开发框架 一.创建项目 在 ex ...

  5. WOW Factor

    Recall that string aa is a subsequence of a string bb if aa can be obtained from bb by deletion of s ...

随机推荐

  1. X-pack安装

    1. Install X-Pack into Elasticsearch   docker exec -it anyrobot-store /bin/bash   bin/elasticsearch- ...

  2. 2018上C语言程序设计(高级)博客作业样例

    要求一(20分) 完成PTA中题目集名为<usth-C语言高级-第1次作业>中的所有题目. 要求二 PTA作业的总结(20分+30分) 将PTA第1次作业作业中以下2道题的解题思路按照规定 ...

  3. 第2次作业:stream案例分析

    摘要:本次随笔是对stream软件进行一次案例分析,以个人观点分析stream为什么成功. 一.介绍产品相关信息 1.我选择的商品是stream 2.选择该产品的主要原因准要是因为自己本身喜欢玩这个平 ...

  4. 网络1712--c语言嵌套循环作业总结

    1.助教有话说 首先,每周一篇的博客作业是很有必要的:编程的过程不仅仅是会敲几行代码.能够通过PTA就大吉大利了,你更应该做到的是梳理代码思路,通过与他人代码思路的比对,取其精华,进而不断进阶,才能逐 ...

  5. 第二次作业:APP案例分析

    App案例分析 产品:三国杀-页游手游双通 选择理由 当今社会手机已经渐渐取代了电脑在人们日常生活的需求,既然要选择APP进行案例分析,首推的估计就是手机APP了.三国杀是陪伴我高中时代的主要娱乐方式 ...

  6. 用greenlet实现Python中的并发

    from greenlet import greenlet def test1(): print 12 gr2.switch() print 34 def test2(): print 56 gr1. ...

  7. 自主学习之RxSwift(一) -----Driver

    对于RxSwift,我也是初学者,此系列来记录我学习RxSwift的历程! (一) 想必关于Drive大家一定在RxSwift的Demo中看到过,也一定有些不解,抱着一起学习的态度,来了解一下Driv ...

  8. 02-移动端开发教程-CSS3新特性(中)

    1. 新的背景 背景在CSS3中也得到很大程度的增强,比如背景图片尺寸.背景裁切区域.背景定位参照点.多重背景等. 1.1 background-size设置背景图片的尺寸 cover会自动调整缩放比 ...

  9. JAVA_SE基础——29.构造函数

    黑马程序员入学Blog... jvm创建Java对象时候需要调用构造器,默认是不带参数的.在构造器中,你可以让jvm帮你初始化一些参数或者执行一系列的动作. 它是对象创建中执行的函数,及第一个被执行的 ...

  10. Python之旅_第一章Python入门

    一.编程语言分类 1.机器语言:即计算机能听懂的二进制语言,0000 0001,直接操控硬件: 2.汇编语言:简写的英文标识符代替二进制语言,本质同样是直接操控硬件: 3.高级语言:用更贴近人类的语言 ...