bzoj4491奇技淫巧线段树
20行的归并+10行的线段树(现在线段树真是越写越短了)+10行主程序(连主程序都缩过行) = =丧心病狂
struct里连开10个,用大括号直接初始化真是爽翻了
#include <cstdio>
#define mid ((l+r)>>1)
struct node
{
int ls,lj,rs,rj,s,ss,j,js,l,r;
} tr[],ans;
int a[];
int n,m,p,q;
inline int max(int p,int q){return(p>q)?p:q;}
node merge(node p,node q)
{
node ans;
ans.l=p.l;ans.r=q.r;
ans.ls=p.ls;ans.lj=p.lj;
ans.rs=q.rs;ans.rj=q.rj; if(p.s>q.s) ans.s=p.s,ans.ss=p.ss;
else ans.s=q.s,ans.ss=q.ss;
if(a[p.r]<=a[q.l])
if(ans.s<p.rs+q.ls)
ans.s=p.rs+q.ls,ans.ss=p.r-p.rs+;
if(ans.ss==p.l) ans.ls=ans.s;
if(ans.ss+ans.s-==q.r) ans.rs=ans.s; if(p.j>q.j) ans.j=p.j,ans.js=p.js;
else ans.j=q.j,ans.js=q.js;
if(a[p.r]>=a[q.l])
if(ans.j<p.rj+q.lj)
ans.j=p.rj+q.lj,ans.js=p.r-p.rj+;
if(ans.js==p.l) ans.lj=ans.j;
if(ans.js+ans.j-==q.r) ans.rj=ans.j;
return ans;
}
void build(int now,int l,int r)
{
if(l!=r)
build(now<<,l,mid),build(now<<|,mid+,r),tr[now]=merge(tr[now<<],tr[now<<|]);
else
tr[now]={,,,,,l,,l,l,l};
}
node que(int now,int l,int r,int p,int q)
{
if(l==p && r==q) return tr[now];
if(q<=mid) return que(now<<,l,mid,p,q);
else if(p>mid) return que(now<<|,mid+,r,p,q);
else return merge(que(now<<,l,mid,p,mid),que(now<<|,mid+,r,mid+,q));
}
int main()
{
for(scanf("%d",&n),p=;p<=n;p++)
scanf("%d",&a[p]);
build(,,n);
for(scanf("%d",&m);m;m--)
scanf("%d%d",&p,&q),ans=que(,,n,p,q),printf("%d\n",max(ans.s,ans.j));
return ;
}
事实上应该是1A的,但是输出的时候没回车(mdzz)错了一发
bzoj4491奇技淫巧线段树的更多相关文章
- bzoj3626: [LNOI2014]LCA奇技淫巧+树剖+线段树
题目求[a,b]到c的lca深度之和 显然是一个满足区间减法的操作 于是简化为 [1,b]到c的lca深度之和 (然并卵╮(╯▽╰)╭)然后就用奇技淫巧发现 a和b的lca深度=先把根节点到a的路 ...
- 2019.03.09 bzoj4491: 我也不知道题目名字是什么(线段树)
传送门 题意:给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串. 思路: 注意要求的是子串而不是子序列!!! 然后直接用线段树维护最大子段和的方式合并一 ...
- 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树
题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...
- 【BZOJ4491】我也不知道题目名字是什么 [线段树]
我也不知道题目名字是什么 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 给定一个序列A[i ...
- HDU1556---树状数组 | 线段树 |*
输入n,紧接n行,每行a,b n个气球,a,b表示从第a到第b个气球涂一次色,输出每个球最终的涂几次色 暴力超时,优化数据结构 1.树状数组 #include<iostream> #inc ...
- LUOGU P4088 [USACO18FEB]Slingshot(线段树)
传送门 解题思路 推了推式子发现是个二维数点,想了想似乎排序加线段树难写,就写了个树套树,结果写完看见空间才\(128M\)..各种奇技淫巧卡空间还是\(MLE\)到天上.后来只好乖乖的写排序+线段树 ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
随机推荐
- C++ 各种基本类型间的转换
常用的转换方法: 流转换 STL标准函数库中函数转换 流转换 流转换主要是用到了<sstream>库中的stringstream类. 通过stringstream可以完成基本类型间的转换, ...
- mysql nonInstall 版本的安装与配置
最近用到mysql,发现如果想使用最新版本64 bit mysql 需要独特的配置和使用方式 结合最近的研究总结一下安装过程. 首先下载:http://dev.mysql.com/downloads/ ...
- linux commands
abrt-cli --since ;查看abrt捕捉的异常 alias ;别名,alias rm='rm -i':使用“ \rm ” 使用原命令 alsamixer ;图形音量调节,q 增加左声道, ...
- java注解处理
1.自定义注解类型 package com.yc.annotation; import java.lang.annotation.ElementType; import java.lang.ann ...
- tp框架的增删改查
首先,我们来看一下tp框架里面的查询方法: 查询有很多种,代码如下: <?php namespace Admin\Controller; use Think\Controller; class ...
- HTTP访问错误大全
400 - 错误的请求. ·401 - 访问被拒绝.IIS 定义了许多不同的 401 错误,它们指明更为具体的错误原因.这些具体的错误代码在浏览器中显示,但不在 IIS 日志中显示: ·401.1 - ...
- CSS 布局
近日开发中,总感觉页面布局方面力不从心.以前也曾学过这方面的内容,但是不够系统,因此我打算整理一下. 在web 页面中一般有 table 和 css+div 两种布局方式. 其中css+div 又分为 ...
- Ubuntu下安装JDK以及相关配置
1.查看系统位数,输入以下命令即可 getconf LONG_BIT 2.下载对应的JDK文件,我这里下载的是jdk-8u60-linux-64.tar.gz 3.创建目录作为JDK的安装目录,这里选 ...
- Linux init
-bash: netstat: command not found #pacman -S net-tools
- maven权威指南学习笔记(四)—— maven生命周期(lifecycle)
定义: 生命周期是包含在一个项目构建中的一系列有序的阶段 举个例子来说就是maven 对一个工程进行: 验证(validate) -- 编译源码(compile) -- 编译测试源码(test-com ...