[测试题]wows
Description
山山最近在玩一款游戏叫战舰世界(steam 游戏太少了),他被大舰巨炮的魅力折服,于是山山开了一局游戏,这次发现目标是一艘战列舰新墨西哥级,舰桥很高,原本应该打在目标身后的圆形水域内的炮弹,都打在了舰桥上,于是落点变成了一条直线。因为新墨西哥中间高两边低,所以按概率算,炮弹命中数中间多,两边少,并且中央区域容易穿透出现高伤害,所以 山山向中间发射的炮弹比两边多,因为他有强迫症,所以一个位置炮弹发射数相对于上一个位置的数目的变化量为 ki(整体大概构成一个山峰状),新墨西哥操纵者因为 OI 的时候玩游戏,脑袋被教练按键盘了,所以站着不动,导致山山能够百发百中,求数轮齐射后,在一段区域的命中数为阶梯增长的长度 (阶梯增长为 A+0K,A+1K· · ·K 随意取,单调增)(为了便于统计伤害,我们把新墨西哥分成 n 段,同时也便于瞄准。
新墨西哥被教练抓着脑袋摁键盘了,我就不信我也 gbhghuyjhhfdhsfdhndxf......
Input
输入文件名为 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 内)
Output
输出文件名为 wows.out。
对于每个询问输出一个数,表示符合要求的最大长度,后跟一个回车
Sample Input
5 3
0 1 5 2 2 3
0 4 5 4 4 5
1 1 5
Sample Output
5
Hint
题解(转载)
题目大意是每一次给一个区间加上两段等差数列
在线询问$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$
//It is made by Awson on 2017.10.16
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Lr(x) (x<<1)
#define Rr(x) (x<<1|1)
using namespace std;
const int N = 1e5; int n, m;
int opt, l, r, a, k, p;
struct node {
int ls, rs, lp, rp, s;
node () {
}
}sgm[(N<<)+];
int lazy[(N<<)+];
struct segment {
node merge(node a, node b, int l, int mid, int r) {
node tmp;
tmp.ls = a.ls, tmp.rs = b.rs;
tmp.lp = a.lp, tmp.rp = b.rp;
if (a.rs == mid-l+ && a.rp == b.lp) tmp.ls += b.ls;
if (b.ls == r-mid && b.lp == a.rp) tmp.rs += a.rs;
tmp.s = Max(a.s, b.s);
if (a.rp == b.lp) tmp.s = Max(tmp.s, a.rs+b.ls);
return tmp;
}
void build(int o, int l, int r) {
if (l == r) {
sgm[o].lp = sgm[o].rp = ;
sgm[o].ls = sgm[o].rs = sgm[o].s = ;
return;
}
int mid = (l+r)>>;
build(Lr(o), l, mid);
build(Rr(o), mid+, r);
sgm[o] = merge(sgm[Lr(o)], sgm[Rr(o)], l, mid, r);
}
void pushdown(int o) {
sgm[Lr(o)].lp += lazy[o], sgm[Lr(o)].rp += lazy[o];
sgm[Rr(o)].lp += lazy[o], sgm[Rr(o)].rp += lazy[o];
lazy[Lr(o)] += lazy[o], lazy[Rr(o)] += lazy[o];
lazy[o] = ;
}
void update(int o, int l, int r, int a, int b, int key) {
if (a <= l && r <= b) {
sgm[o].lp += key, sgm[o].rp += key;
lazy[o] += key;
return;
}
pushdown(o);
int mid = (l+r)>>;
if (a <= mid) update(Lr(o), l, mid, a, b, key);
if (b > mid) update(Rr(o), mid+, r, a, b, key);
sgm[o] = merge(sgm[Lr(o)], sgm[Rr(o)], l, mid, r);
}
node query(int o, int l, int r, int a, int b) {
if (a <= l && r <= b) return sgm[o];
pushdown(o);
int mid = (l+r)>>;
if (a <= mid && b > mid) {
node t1 = query(Lr(o), l, mid, a, b);
node t2 = query(Rr(o), mid+, r, a, b);
return merge(t1, t2, l, mid, r);
}else if (a <= mid) return query(Lr(o), l, mid, a, b);
else return query(Rr(o), mid+, r, a, b);
}
}T;
void work() {
scanf("%d%d", &n, &m);
T.build(, , n-);
while (m--) {
scanf("%d", &opt);
if (opt == ) {
scanf("%d%d%d%d%d", &l, &r, &a, &k, &p);
if (l != ) T.update(, , n-, l-, l-, a);
if (l <= p-) T.update(, , n-, l, p-, k);
if (p <= r-) T.update(, , n-, p, r-, -k);
if (r != n) T.update(, , n-, r, r, -a-(*p-l-r)*k);
}else {
scanf("%d%d", &l, &r);
if (l == r) printf("1\n");
else printf("%d\n", T.query(, , n-, l, r-).s+);
}
}
}
int main() {
work();
return ;
}
[测试题]wows的更多相关文章
- Android基础测试题(四)
看了前两道题大家有没有发现,测试题少了(一),大家猜猜测试题(一)是什么? Android基础测试题(四): 需求: 建一个方法,格式化输出2016-11-14 10:15:26格式的当前时间,然后截 ...
- Android基础测试题(二)
今天给大家带来的是Android基础测试题(二) 题目要求: 定义一个5位长度的整型数组并初始化,然后构建方法根据用户传入的数字判断是否存在数组中,如果存在,返回所在位置,如果不存在,返回-1 首先第 ...
- mysql测试题
MySQL测试题 一.表关系 请创建如下表,并创建相关约束 创建数据库create database school charset utf8; 建表create table class(cid int ...
- 百度在线笔试编程测试题(Python):整数分解成素数的积
编程测试题: 输入一个正整数将其分解成素数的乘积,输入格式连续输入m个数,然后将这m个数分别分解,如 输入: 2 10 20 输出: 2 5 2 2 5 Python code: def primes ...
- ES6入门系列四(测试题分析)
0.导言 ES6中新增了不少的新特性,来点测试题热热身.具体题目来源请看:http://perfectionkills.com/javascript-quiz-es6/. 以下将一题一题来解析what ...
- hadoop概述测试题和基础模版代码
hadoop概述测试题和基础模版代码 1.Hadoop的创始人是DougCutting?() A.正确 B.错误答对了!正确答案:A解析:参考课程里的文档,这个就不解释了2.下列有关Hadoop的说法 ...
- C语言编写的随机产生四则运算测试题
题目:编写一个四则运算测试题的程序,要求每道题都要随机产生 解题思路: 1.编写测试题,且为30道,就要用到循环函数,因此想到用for()函数 2.随机产生两个数,就想到用rand()函数. 注:1. ...
- 关于Linux测试题
Linux 测试题: 1. 在Linux系统中,以 文件 方式访问设备 . 2. 某文件的权限为:drw-r--r--,用数值形式表示该权限,则该八进制数为: 644 ,该文件属性是 目录 . 3. ...
- linux测试题
http://www.2cto.com/os/201307/225399.html 2013最新linux运维面试题 在对linux基本知识的归纳总结之后,这里是一份linux的测试题.希望能帮助大 ...
随机推荐
- 【福大软工】 W班级总成绩排名2
评分链接: 选题报告 结对第二次作业 需求分析 随堂测试 总分排名:
- 听翁恺老师mooc笔记(16)--程序设计与C语言
问题1:计算机遍布生活的各个方面,若你需要一个功能可以下载APP,我们需要的大部分功能都可以找到对应的APP,如果没有可以自己写一个软件,但是很少人需要这么做,那么我们为什么学习计算机编程语言? 学习 ...
- Beta 第二天
今天遇到的困难: 组员对github极度的不适应 Android Studio版本不一致项目难以打开运行 移植云端的时候,愚蠢的把所有项目开发环境全部搬上去.本身云的内存小,性能差,我们花费了太多时间 ...
- 事后诸葛亮——城市安全风险管理项目Postmortem结果
设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 本系统希望实现快速识别危害因素,使工作人员对风险作出准确的评估.即让使用者熟悉潜在的危险因素,知道 ...
- C语言——第二次作业(2)
作业要求一 PTA作业的提交列表 作业要求二 题目1.删除字符串中数字字符(函数题) 1.设计思路 - (1)算法 第一步:调用定义的函数. 第二步:定义i=0.j=0,i为原字符数组角标,j为删除后 ...
- 如何使用ILAsm与ILDasm修改.Net exe(dll)文件
一.背景 最近项目组新上项目,交付的时间比较急迫,原本好的分支管理习惯没有遵守好,于是出现下面状况: 多个小伙伴在不同的分支上开发. 原本QA环境也存在一个阻碍性的bug A 一位同事在QA环境发布了 ...
- var 和 let 的异同?
相同点 声明后未赋值表现一致 不同点 1.使用未声明的变量表现不同 2.变量作用范围不同 3.var可以声明多次 let只能声明一次 let的好处就是当我们在写代码的时候可以避免在不知道的情况下重复声 ...
- 深度学习之 seq2seq 进行 英文到法文的翻译
深度学习之 seq2seq 进行 英文到法文的翻译 import os import torch import random source_path = "data/small_vocab_ ...
- zuul入门(2)zuul的过滤器分类和加载
一.Groovy编写的Filter 1.可以放到指定目录加载 创建一个pre类型的filter,在run方法中获取HttpServletRequest 然后答应header信息 在代码中加入groov ...
- IDE-Android Studio -FAQ-使用习惯(不断更新 欢迎留言)
摘要: 从ecplise工具切换到android studio后遇到了很多问题,起初亦非常痛苦,城墙内外阅博无数才得以解决.所以把当时遇到的问题记录下来,方便后来人学习. 另如果有遇到未纪录的问题欢迎 ...