莫队貌似是过不了的,这题是我没见过的科技...

  首先区间按右端点排序,然后一个扫描线,扫到某个区间右端点时候计算答案,线段树上节点的信息并不需要明确定义,我们只要求线段树做到当前扫到now时,查询[L,now]即为这一段的答案。

  朴素的不加优化的做法,我们在每一个点R加进来的时候要更新1~R-1所有点,这样显然是会TLE的。

  强调一遍我们只要求线段树做到当前扫到now时,查询[L,now]即为这一段的答案,因此我们记录一下更新到现在的最小的绝对值mn,对于线段树上每一节点都维护一个set,维护这个节点代表的区间里的数有序,每次新加进来一个数,我们直接查询他的前驱后继,算出绝对值后与mn比较,若是大于mn显然这个区间就不用更新了。为什么?再强调一遍线段树上节点的信息并不需要明确定义,我们只要求线段树做到当前扫到now时,查询[L,now]即为这一段的答案。

  这样一个类似最优性剪枝之后的东西能保证复杂度吗?实际上是可以的。

  至少在这题上,最坏的情况是一个这样的序列: 1 n n/2 n/4 n/8 n/16,也就是对于每一个位置顶多被递归到叶子logn次,也就是最坏复杂度$O(nlog^3n)$,但实际上是到不了这个复杂度的...也就可以过了

  思考与扩展:这样一个东西可以用在离线处理一个区间某种信息的最值上

  感谢栋栋的悉心教导我这样一个大傻逼QAQ

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<set>
#define ll long long
using namespace std;
const int maxn=,inf=;
struct poi{int l,r,pos;}q[maxn*];
int n,m,x,y,z,tot,mn;
int tree[maxn<<],a[maxn*],ans[maxn*];
set<int>s[maxn<<];
void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
inline int abs(int x){return x>=?x:-x;}
inline int min(int a,int b){return a>b?b:a;}
void build(int x,int l,int r)
{
tree[x]=inf;if(l==r)return;
int mid=(l+r)>>;
build(x<<,l,mid);build(x<<|,mid+,r);
}
void update(int x,int l,int r,int cx,int delta)
{
if(l==r){if(l==cx)return;tree[x]=min(tree[x],abs(a[l]-delta));mn=min(mn,tree[x]);return;}
if(r<=cx)
{
set<int>::iterator it=s[x].lower_bound(delta);
if((it==s[x].end()||abs(*it-delta)>=mn)&&(it==s[x].begin()||abs(*(--it)-delta)>=mn))
{
mn=min(mn,tree[x]);
return;
}
int mid=(l+r)>>;
update(x<<|,mid+,r,cx,delta);
update(x<<,l,mid,cx,delta);
tree[x]=min(tree[x<<],tree[x<<|]);
return;
}
int mid=(l+r)>>;
if(cx<=mid)update(x<<,l,mid,cx,delta);
else update(x<<|,mid+,r,cx,delta),update(x<<,l,mid,cx,delta);
tree[x]=min(tree[x<<],tree[x<<|]);
}
void pushset(int x,int l,int r,int cx,int delta)
{
s[x].insert(delta);
if(l==r)return;
int mid=(l+r)>>;
if(cx<=mid)pushset(x<<,l,mid,cx,delta);
else pushset(x<<|,mid+,r,cx,delta);
}
int query(int x,int l,int r,int cl,int cr)
{
if(cl<=l&&r<=cr)return tree[x];
int mid=(l+r)>>,ret=inf;
if(cl<=mid)ret=min(ret,query(x<<,l,mid,cl,cr));
if(cr>mid)ret=min(ret,query(x<<|,mid+,r,cl,cr));
return ret;
}
bool cmp(poi a,poi b){return a.r<b.r;}
int main()
{
read(n);
for(int i=;i<=n;i++)read(a[i]);build(,,n);
read(m);
for(int i=;i<=m;i++)read(q[i].l),read(q[i].r),q[i].pos=i;
sort(q+,q++m,cmp);
for(int i=,j=;i<=m;i++)
{
for(;j<=q[i].r;j++)
{
mn=inf;
update(,,n,j,a[j]);
pushset(,,n,j,a[j]);
}
if(q[i].l==q[i].r)ans[q[i].pos]=inf;
else ans[q[i].pos]=query(,,n,q[i].l,q[i].r-);
}
for(int i=;i<=m;i++)printf("%d\n",ans[i]);
return ;
}

LibreOJ #6190. 序列查询(线段树+剪枝)的更多相关文章

  1. 【题解】P4247 [清华集训]序列操作(线段树修改DP)

    [题解]P4247 [清华集训]序列操作(线段树修改DP) 一道神仙数据结构(DP)题. 题目大意 给定你一个序列,会区间加和区间变相反数,要你支持查询一段区间内任意选择\(c\)个数乘起来的和.对1 ...

  2. 对权值线段树剪枝的误解--以HDU6703为例

    引子 对hdu6703,首先将问题转化为"询问一个排列中大于等于k的值里,下标超过r的最小权值是多少" 我们采用官方题解中的做法:权值线段树+剪枝 对(a[i],i)建线段树,查询 ...

  3. BZOJ_1798_[AHOI2009]维护序列_线段树

    BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...

  4. hdu 4521 小明系列问题——小明序列(线段树 or DP)

    题目链接:hdu 4521 本是 dp 的变形,却能用线段树,感觉好强大. 由于 n 有 10^5,用普通的 dp,算法时间复杂度为 O(n2),肯定会超时.所以用线段树进行优化.线段树维护的是区间内 ...

  5. Codeforces 444 C. DZY Loves Colors (线段树+剪枝)

    题目链接:http://codeforces.com/contest/444/problem/C 给定一个长度为n的序列,初始时ai=i,vali=0(1≤i≤n).有两种操作: 将区间[L,R]的值 ...

  6. 数据结构(括号序列,线段树||点分治,堆):ZJOI 2007 捉迷藏

    [题目描述] Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双向走廊组成,这N- ...

  7. 2018.07.08 hdu4521 小明系列问题——小明序列(线段树+简单dp)

    小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Proble ...

  8. 【BZOJ】1798: [Ahoi2009]Seq 维护序列seq 线段树多标记(区间加+区间乘)

    [题意]给定序列,支持区间加和区间乘,查询区间和取模.n<=10^5. [算法]线段树 [题解]线段树多重标记要考虑标记与标记之间的相互影响. 对于sum*b+a,+c直接加上即可. *c后就是 ...

  9. 【hdu5217-括号序列】线段树

    题意:给一串括号,有2个操作,1.翻转某个括号.2.查询某段区间内化简后第k个括号是在原序列中的位置.1 ≤ N,Q ≤ 200000. 题解: 可以知道,化简后的序列一定是)))((((这种形式的. ...

随机推荐

  1. unity发布自定义分辨率

    如果你需要发布unity时想要使用自己设置的分辨率仅需要一下几个步骤: 打开Build Setting->PlayerSetting->Resolution and Presentatio ...

  2. 【wx:for】小程序列表渲染的使用说明

    wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件. 默认数组的当前项的下标变量名默认为 index,数组当前项的变量名默认为 item,即: {{index}} . {{it ...

  3. JavaScript 数组操作方法 和 ES5数组拓展

    JavaScript中数组有各种操作方法,以下通过举例来说明各种方法的使用: 数组操作方法 push 在数组最后添加一个元素 var arr=[3,4,5,6] console.log(arr) // ...

  4. POJ 2455 Secret Milking Machine(最大流+二分)

    Description Farmer John is constructing a new milking machine and wishes to keep it secret as long a ...

  5. 软工冲刺-Alpha 冲刺 (3/10)

    队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 很胖,刚学,照猫画虎做了登录与注册界面. 展示GitHub ...

  6. 福大软工1816:Alpha(5/10)

    Alpha 冲刺 (5/10) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务: 文字/口头描述: 1.忙于复习,本次无成果 展示 ...

  7. mysql入门 — (1)

    使用cd进入到mysql/bin文件夹下面,或者配置完环境之后,直接在cmd中使用mysql,然后回车开启mysql. 登录 为了安全考虑,在这里只设置了本地root用户可以连接上数据库.使用的指令是 ...

  8. lintcode-172-删除元素

    172-删除元素 给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度. 元素的顺序可以改变,并且对新的数组不会有影响. 样例 给出一个数组 [0,4,4,0,0,2,4,4],和值 4 ...

  9. LintCode-212.空格替换

    空格替换 设计一种方法,将一个字符串中的所有空格替换成 %20 .你可以假设该字符串有足够的空间来加入新的字符,且你得到的是"真实的"字符长度. 你的程序还需要返回被替换后的字符串 ...

  10. 某一线互联网公司前端面试题总结css部分

    1,css3选择器 :not(selector) 选择页面内所有type!=text的类型: input:not([type=text]){ color: red; font-weight: bold ...