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

●题目以被上传(改了改说法),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语言第三次作业总结

    本次作业的亮点 总体情况 大部分同学基本掌握了单层循环结构的写法,懂得了代码调试的过程 PTA通过率及作业质量都不错,希望再接再厉 推荐博客 黄毓颖 推荐理由:代码思路清晰,格式良好:调试过程相当形象 ...

  2. 第四十四条:为所有导出的API元素编写文档注释

    简而言之,要为API编写文档,文档注释是最好,最有效的途径.对于所有可导出的API元素来说,使用文档注释应该被看作是强制性的.要 采用一致的风格来遵循标准的约定.记住,在文档注释内部出现任何的HTML ...

  3. centos 开放端口

    1.修改文件/etc/sysconfig/iptables [root@zsq ~]# cd /etc/sysconfig/[root@zsq sysconfig]# vi iptables 文件内容 ...

  4. Browser Object Model

    BOM:浏览器提供的一系列对象 window对象是BOM最顶层对象 * 计时器setInterval(函数,时间)设置计时器 时间以毫秒为单位 clearInterval(timer) 暂停计时器se ...

  5. Unity使用脚本进行批量动态加载贴图

    先描述一下我正在做的这个项目,是跑酷类音游. 那么跑酷类音游在绘制跑道上的时候,就要考虑不同的砖块显示问题.假设我有了一个节奏列表,那么我们怎么将不同的贴图贴到不同的砖块上去呢? 我花了好几个小时才搞 ...

  6. Python 列表嵌套多种实现方式

    #coding=utf-8 list=[] for i in range(1,101): list.append(i) # print(list) tempList=[] newList=[] whi ...

  7. c#动态加载卸载DLL

    前段时间工作的时候遇到一个问题.就是需要每次启动程序的时候动态替换掉某个dll,所以就百度了这方面的资料.这次记录下来让自己以后可以看. 根据自己的理解,动态卸载dll需要有以下条件: 1:dll在加 ...

  8. Linux知识积累 (9) 创建用户、分配权限和更改所有者

    一.useradd和adduser 1.useradd命令: 用于Linux中创建的新的系统用户. useradd可用来建立用户帐号.帐号建好之后,再用passwd设定帐号的密码. 而可用userde ...

  9. BAT美团滴滴java面试大纲(带答案版)之三:多线程Lock

    继续面试大纲系列文章. 这是多线程的第二篇. 多线程就像武学中对的吸星大法,理解透了用好了可以得道成仙,俯瞰芸芸众生:而滥用则会遭其反噬. 在多线程编程中要渡的第二个“劫”,则是Lock.在很多时候, ...

  10. VMware虚拟机安装

            学习Linux系统最好的方式就是在自己的虚拟机上安装Linux:接下来就给大家简单介绍一下VMware虚拟机的安装以及Linux的安装:VMware虚拟机只是为了更好的学习Linux: ...