●模拟考试的一道似乎是学长出的题,还不错,挺考代码能力的。以此记录。

●题目以被上传(改了改说法),6128 Lence的方块们

(像手纸一样长的贴图……)

●题目大意:

有横向排布的n个点,每个点初始值都为0。

有m个操作(先输入操作类型com):

com==0:修改操作(接着输入l , r , a , k , p),解释见输入格式。(提供图帮助理解)。

com==1:查询操作(接着输入l , r),输出区间[ l , r ]内最长的等差数列的项数(要连续)。

●题解:

注意到是要找等差数列,即答案对应的区间个元素的差值应相等。即可以前后两元素的差值建线段树,然后维护区间最长的差值相等的一段。

(是不是思路很清晰,然而恶心的代码却搞了我大半个上午。)

●附上代码:

我上代码咯:(附上测试数据)
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
struct segment{
int l,r,nl,nr,mx,ml,mr,lazy;
}t[400005];
int n,m;
void pushdown(int u)
{
t[u*2].lazy+=t[u].lazy; t[u*2].nl+=t[u].lazy; t[u*2].nr+=t[u].lazy;
t[u*2+1].lazy+=t[u].lazy; t[u*2+1].nl+=t[u].lazy; t[u*2+1].nr+=t[u].lazy;
t[u].lazy=0;
}
void pushup(int u)
{
t[u].mx=max(t[u*2].mx,t[u*2+1].mx);
t[u].ml=t[u*2].ml;
t[u].mr=t[u*2+1].mr;
t[u].nl=t[u*2].nl;
t[u].nr=t[u*2+1].nr;
if(t[u*2].nr==t[u*2+1].nl)
{
t[u].mx=max(t[u].mx,t[u*2].mr+t[u*2+1].ml);
if(t[u*2].ml==(t[u*2].r-t[u*2].l+1)) t[u].ml+=t[u*2+1].ml;
if(t[u*2+1].mr==(t[u*2+1].r-t[u*2+1].l+1)) t[u].mr+=t[u*2].mr;
}
}
void build(int u,int l,int r)
{
t[u]=(segment){l,r,0,0,r-l+1,r-l+1,r-l+1};
if(l==r) return;
int mid=(l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
}
void add(int u,int l,int r,int x)
{
if(l<=t[u].l&&t[u].r<=r)
{
t[u].nl+=x;
t[u].nr+=x;
t[u].lazy+=x;
return;
}
if(t[u].lazy) pushdown(u);
int mid=(t[u].l+t[u].r)/2;
if(l<=mid) add(u*2,l,r,x);
if(mid<r) add(u*2+1,l,r,x);
pushup(u);
}
void query(int u,int l,int r,int &mx,int &lm,int &rm,int &ln,int &rn)
{
int lmx=0,lml,lmr,lnl,lnr,rmx=0,rml,rmr,rnl,rnr;
if(t[u].l==l&&t[u].r==r)
{
mx=t[u].mx; lm=t[u].ml; rm=t[u].mr; ln=t[u].nl; rn=t[u].nr;
return;
}
if(t[u].lazy) pushdown(u);
int mid=(t[u].l+t[u].r)/2;
if(l<=mid) query(u*2,l,min(mid,r),lmx,lml,lmr,lnl,lnr);
if(mid<r) query(u*2+1,max(mid+1,l),r,rmx,rml,rmr,rnl,rnr);
if(lmx*rmx!=0)
{
mx=max(lmx,rmx);
ln=lnl; rn=rnr; lm=lml; rm=rmr;
if(lnr==rnl)
{
mx=max(mx,lmr+rml);
if(lml==mid-l+1) lm+=rml;
if(rmr==r-(mid+1)+1) rm+=lmr;
}
}
else
{
if(lmx==0) swap(lmx,rmx),swap(lml,rml),swap(lmr,rmr),swap(lnl,rnl),swap(lnr,rnr);
mx=lmx; lm=lml; rm=lmr; ln=lnl; rn=lnr;
}
}
int main()
{
freopen("wows.in","r",stdin);
freopen("wows.out","w",stdout);
scanf("%d%d",&n,&m);n--;
build(1,1,n); int com;
for(int i=1,l,r,a,k,p;i<=m;i++)
{
scanf("%d",&com);
if(com==0)
{
scanf("%d%d%d%d%d",&l,&r,&a,&k,&p);
if(l>1) add(1,l-1,l-1,a);
if(p-1>=l) add(1,l,p-1,k);
if(r-1>=p) add(1,p,r-1,-k);
if(r<n) add(1,r,r,-(a+(2*p-l-r)*k));
}
if(com==1)
{
int ans,a1,a2,a3,a4;
scanf("%d%d",&l,&r); r--;
query(1,l,r,ans,a1,a2,a3,a4);
printf("%d\n",ans+1);
}
}
return 0;
}

●线段树题之wows的更多相关文章

  1. hdu 3397 Sequence operation(很有意思的线段树题)

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  2. 线段树题集 (cf版)

    lazy区间修改   : http://acm.hdu.edu.cn/showproblem.php?pid=4902   (hdu4902) http://acm.hdu.edu.cn/showpr ...

  3. BZOJ1067&P2471 [SCOI2007]降雨量[线段树裸题+细节注意]

    dlntqlwsl 很裸的一道线段树题,被硬生生刷成了紫题..可能因为细节问题吧,我也栽了一次WA50分.不过这个隐藏条件真的对本菜鸡来说不易发现啊. 未知的年份连续的就看成一个就好了,把年份都离散化 ...

  4. Mango DS Traning #49 ---线段树3 解题手记

    Training address: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=38994#overview B.Xenia and B ...

  5. A线段树

    线段树专题 顾琪坤 1.简介: 打acm的时候,经常会碰到一类问题,比方给你n个数的序列,然后动态的更改某些数的值,然后又动态地询问某个区间的值的和或者其它乱七八糟的东西,对于单个更改或者询问,也许很 ...

  6. UPC 2224 Boring Counting ★(山东省第四届ACM程序设计竞赛 tag:线段树)

    [题意]给定一个长度为N的数列,M个询问区间[L,R]内大于等于A小于等于B的数的个数. [题目链接]http://acm.upc.edu.cn/problem.php?id=2224 省赛的时候脑抽 ...

  7. [luogu P3801] 红色的幻想乡 [线段树][树状数组]

    题目背景 蕾米莉亚的红雾异变失败后,很不甘心. 题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一 ...

  8. [luogu P3797] 妖梦斩木棒 [线段树]

    题目背景 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段.现在这个木棒可以看做由三种小段构成,中间的 ...

  9. 线段树模板hdu 1166:敌兵布阵

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

随机推荐

  1. C语言--第二周作业

    ****学习内容总结**** 1.Git和编辑器截图 2.MOOC截图 3.阅读<提问的智慧>感想 读完<提问的智慧>之后,我认为在提问时,要根据以下步骤: 谨慎明确的描述症状 ...

  2. JAVA_SE基础——18.方法的递归

    方法的递归是指在一个方法的内部调用自身的过程,递归必须要有结束条件,不然就会陷入无限递归的状态,永远无法结束调用,接下来用一个最简单的例子来体现下方法递归,使用递归算法计算自然数之和: public ...

  3. Centos6.7的在虚拟机virulBox下的lamp平台的搭建

    实验环境: linux:小甲鱼带你学C语言,带你飞的提供的体积比较小的centos6.7和virtualBox mysql,apahce,php是燕十八在Linux基础进阶中提供的安装方式: 结果,安 ...

  4. JavaScript 基础学习1-day14

    JavaScript 基础学习1 知识预览JavaScript概述二 JavaScript的基础三 JavaScript的对象BOM对象DOM对象实例练习js扩展 JavaScript概述 JavaS ...

  5. Python之协程

    前言 在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位.按道理来说我们已经算是把cpu的利用率提高很多了.但是我们知道无论是创建多进程还是创建多线程来解决问题,都要消耗一定的时间来创建 ...

  6. IT 必备电脑快捷键

    IT 必备电脑快捷键 键盘上除了有字母.数字之外,还有一些特殊的按键:ctrl.shift.alt.tab ● ctrl键是英语control“控制”的意思,这个按键,单独按没有任何作用,都要和其他的 ...

  7. Java:现有线程T1/T2/T3,如何确保T1执行完成之后执行T2,T3在T2执行完成之后执行。

    要实现多个线程执行完成先后,就要知道如何实现线程之间的等待,java线程等待实现是join.java的jdk中join方法实现如下: public final synchronized void jo ...

  8. SqlServer优化:当数据量查询不是特别多,但数据库服务器的CPU资源一直100%时,如何优化?

    最近和同事处理一个小程序,数据量不是特别大,某表的的数据记录:7000W条记录左右,但是从改别执行一次查询时,却发现查询速度也不快,而且最明显的问题就是CPU100%. sql语句: select g ...

  9. js中获取元素的样式兼容性的写法

    1:设计元素的样式:el.style.color="red"||el.style["color"]="red"  获取元素的样式:el.st ...

  10. Ubuntu+vscode打不开

    前沿: vscode链接 参考链接 问题: 之前在Ubuntu上安装chrome, 结果chrome没装成功, 还把vscode给qiu坏了, 貌似是当时安装chrome时提示要升级一个包. 后来发现 ...