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] .根 ...
随机推荐
- 耿丹CS16-2班第五次作业汇总
Deadline: 2016-10-26 23:59 作业内容 实验4-1 求1到20的阶乘的和,其中求阶乘用函数完成. 实验4-2 写一个判素数的函数,在主函数输入一个整数,输出其是否是素数的信息. ...
- [mark] 使用Sublime Text 2时如何将Tab配置为4个空格
在Mac OS X系统下,Sublime Text是一款比较赞的编辑器. 作为空格党的自觉,今天mark一下使用Sublime Text 2时如何将Tab配置为4个空格: 方法来自以下两个链接: ht ...
- android 对话框 setMultiChoiceItems 设置 初始化勾选
只需要 设定第二个参数 boolean[] 值就好了
- dvd开发小程序
package dvdManager8; import java.util.Scanner; public class DvdSystem8 { static String[][] dvd = new ...
- List提取相同元素
List<int> currentList = Cls_Data.SoruceDataIntses[key]; preList = currentList.Intersect(preLis ...
- Xcode 常用快捷键
一.Xcode基本快捷键 1.1.新建项目 Shift + CMD + N 1.2.项目中新建文件 CMD + N 1.3.运行 CMD + R 1.4.编译 CMD + B 1.5.停止运行 CMD ...
- IO边读边写
using (FileStream fs = new FileStream(@"C:\Users\Desktop\lijia1.txt",FileMode.Open)) ...
- retrofit使用随记
1.请求接口 public interface RetrofitApi { /*注册*/ /*登录*/ @FormUrlEncoded //post请求带这个 @POST("url" ...
- php Your system does not support any of these drivers: gmagick,imagick,gd2
缺少这些库时,安装 : apt-get install php5-gd 就可以.
- 《learning hard C#学习笔记》读书笔记(20)异步编程
20.1 什么是异步编程异步编程就是把耗时的操作放进一个单独的线程中进行处理. 20.2 同步方式存在的问题 namespace 异步编程 { public partial class For ...