●线段树题之wows
●模拟考试的一道似乎是学长出的题,还不错,挺考代码能力的。以此记录。
●题目以被上传(改了改说法),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的更多相关文章
- hdu 3397 Sequence operation(很有意思的线段树题)
Sequence operation Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- 线段树题集 (cf版)
lazy区间修改 : http://acm.hdu.edu.cn/showproblem.php?pid=4902 (hdu4902) http://acm.hdu.edu.cn/showpr ...
- BZOJ1067&P2471 [SCOI2007]降雨量[线段树裸题+细节注意]
dlntqlwsl 很裸的一道线段树题,被硬生生刷成了紫题..可能因为细节问题吧,我也栽了一次WA50分.不过这个隐藏条件真的对本菜鸡来说不易发现啊. 未知的年份连续的就看成一个就好了,把年份都离散化 ...
- Mango DS Traning #49 ---线段树3 解题手记
Training address: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=38994#overview B.Xenia and B ...
- A线段树
线段树专题 顾琪坤 1.简介: 打acm的时候,经常会碰到一类问题,比方给你n个数的序列,然后动态的更改某些数的值,然后又动态地询问某个区间的值的和或者其它乱七八糟的东西,对于单个更改或者询问,也许很 ...
- UPC 2224 Boring Counting ★(山东省第四届ACM程序设计竞赛 tag:线段树)
[题意]给定一个长度为N的数列,M个询问区间[L,R]内大于等于A小于等于B的数的个数. [题目链接]http://acm.upc.edu.cn/problem.php?id=2224 省赛的时候脑抽 ...
- [luogu P3801] 红色的幻想乡 [线段树][树状数组]
题目背景 蕾米莉亚的红雾异变失败后,很不甘心. 题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一 ...
- [luogu P3797] 妖梦斩木棒 [线段树]
题目背景 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段.现在这个木棒可以看做由三种小段构成,中间的 ...
- 线段树模板hdu 1166:敌兵布阵
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- python的PEP8 代码风格指南
PEP8 代码风格指南 这篇文章原文实际上来自于这里:https://www.python.org/dev/peps/pep-0008/ 知识点 代码排版 字符串引号 表达式和语句中的空格 注释 版本 ...
- bzoj千题计划108:bzoj1018: [SHOI2008]堵塞的交通traffic
http://www.lydsy.com/JudgeOnline/problem.php?id=1018 关键点在于只有两行 所以一个2*m矩形连通情况只有6种 编号即对应代码中的a数组 线段树维护 ...
- Angular组件——组件生命周期(一)
组件声明周期以及angular的变化发现机制 红色方法只执行一次. 变更检测执行的绿色方法和和组件初始化阶段执行的绿色方法是一个方法. 总共9个方法. 每个钩子都是@angular/core库里定义的 ...
- Comet之SSE(Server - Sent - Envent,服务器发送事件)
1.SSE API 先要创建一个新的EventSource对象,并传进一个入口点: var source = new EventSource("myenvent.php"); △: ...
- django三种文件下载方式
一.概述 在实际的项目中很多时候需要用到下载功能,如导excel.pdf或者文件下载,当然你可以使用web服务自己搭建可以用于下载的资源服务器,如nginx,这里我们主要介绍django中的文件下载. ...
- thinkphp中的常见静态常亮
thinkphp __PUBLIC__的定义 __ROOT__等常量的定义 1 2 3 4 5 6 7 8 9 '__TMPL__' => APP_TMPL_PATH, // 项目 ...
- clang++ 链接问题 和 VS Code
clang++ 链接问题 和 VS Code 如果你在windows上使用clang 并且同时安装有vs和mingw, clang链接是会自动使用msvs, 链接时会有LINK error LINK ...
- WPF 自定义DataGrid控件样式
内容转自https://www.cnblogs.com/xiaogangqq123/archive/2012/05/07/2487166.html 一.DataGrid基本样式(一) 小刚已经把Dat ...
- JSON(三)——java中对于JSON格式数据的解析之json-lib与jackson
java中对于JSON格式数据的操作,主要是json格式字符串与JavaBean之间的相互转换.java中能够解析JSON格式数据的框架有很多,比如json-lib,jackson,阿里巴巴的fast ...
- 在GridControl表格控件中实现多层级主从表数据的展示
在一些应用场景中,我们需要实现多层级的数据表格显示,如常规的二级主从表数据展示,甚至也有多个层级展示的需求,那么我们如何通过DevExpress的GridControl控表格件实现这种业务需求呢?本篇 ...