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

●题目以被上传(改了改说法),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. js计时功能

    //个位秒加 function time4jia() { //分钟60为上限 所有加停止 if (sz(a('time1').innerHTML) == 6) { return; } var m4 = ...

  2. 《招一个靠谱的移动开发》iOS面试题及详解(下篇)

    iOS面试知识点 现在进入本篇的正题.本篇的面试题是我认为比较好的iOS开发基础知识点,希望大家看过这后在理解的基础上掌握而不是死记硬背.死记硬背很快也会忘记的. 1 iOS基础 1.1 父类实现深拷 ...

  3. 我从业11年来遇到的最奇葩的raid0+1数据恢复经历

    我是一名数据恢复工程师,从事数据恢复行业已经11年了,前几天接到一组4块盘SCSI RAID0+1的数据恢复,客户说做了两组raid1,现在raid状态里显示有3快盘offline.如果两组盘分别作r ...

  4. JAVA_SE基础——13.选择结构语句

    if选择结构 语法: if(条件){ 代码块 } public class Test{ public static void main(String[] args){ int a = 5; if(a ...

  5. 浏览器端类EXCEL表格插件 版本更新 - 智表ZCELL产品V1.1.0.1版本发布

    智表(ZCELL),浏览器下纯JS表格控件,为您提供EXCEL般的智能体验! 纯国产化.高性价比的可靠解决方案. 更新说明     让大家久等了.因为最近忙其他项目,发布时间稍有延迟.  下次版本更新 ...

  6. MySQL默认储存引擎修改

    1.输入以下SQL语句查看当前储存引擎支持: SHOW ENGINES; 如图所示本机默认引擎为MyISAM: 2.若要修改引擎执行: ALTER TABLE 表名 ENGINE = 储存引擎名: 3 ...

  7. 新概念英语(1-139)Is that you, John?

    Lesson 139 Is that you, John? 是你吗,约翰? Listen to the tape then answer this question. Which John Smith ...

  8. JavaScript简单重写构造器的原型

    //简单重写原型对象: //一个构造函数Person function Person(){ } //重写Person的原型 //把Person的原型赋值给一个新的对象 是我们重写的过程 Person. ...

  9. Xshell与虚拟机不能正常连接

    1.发现Xshell与虚拟机下的两个CentOS都不能正常连接,在这些系统下采用ifconfig查询发现eth0都没有ip地址,进而想到可能是虚拟机的设置出了问题,后来又想到自己之前曾经尝试过设置VM ...

  10. JavaScript的对象/下

    JavaScript的对象 一.BOM对象 BOM----browser object model 1.window对象 所有浏览器都支持window对象. 概念上讲,一个html文档对应一个wind ...