思路:

把询问离线下来,查询max和查询min相似,现在只考虑查询max

令sum[l,r,x]表示l到r内的数为左端点,x为右端点的区间询问的答案
那么询问就是sun[l1,r1,r2]-sum[l1,r1,l1-1]
从1到n枚举x,维护区间线段树表示sum[l,r,x],发现从x-1转移到x的过程中,每个数加上了max(a[pos]..a[x])的答案。
用单调队列维护一个单调递减的序列,由于a数列是随机的,这个队列期望有log个元素,所以只需要对这log段暴力修改,复杂度nlog^2n
或者,只在元素进队和出队的时候做一些操作,写起来会复杂很多,但复杂度nlogn
From heheda
 
(其实先把所有的数求出来 做一遍    再取相反数 做一遍就好啦)
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
const int N=,mod=;
struct Node{
int id,l,r,pos,f;Node(){}
Node(int I,int L,int R,int P,int F){id=I,l=L,r=R,pos=P,f=F;}
}node[N];
bool cmp(Node a,Node b){if(a.pos!=b.pos)return a.pos<b.pos;return a.f<b.f;}
int n,t,l1,r1,l2,r2,stk[N],top,tree[N*],lazy[N*],ans[N],a[N],maxx;
void insert(int l,int r,int pos,int L,int R,int wei){
if(l>=L&&r<=R){lazy[pos]+=wei;tree[pos]+=(r-l+)*wei;return;}
int mid=(l+r)>>,lson=pos<<,rson=pos<<|;
if(mid<L)insert(mid+,r,rson,L,R,wei);
else if(mid>=R)insert(l,mid,lson,L,R,wei);
else insert(l,mid,lson,L,R,wei),insert(mid+,r,rson,L,R,wei);
tree[pos]=tree[lson]+tree[rson];
}
void push_down(int pos,int num){
int lson=pos<<,rson=pos<<|;
lazy[lson]+=lazy[pos],lazy[rson]+=lazy[pos];
tree[lson]+=lazy[pos]*(num-num/),tree[rson]+=lazy[pos]*(num>>);
lazy[pos]=;
}
int query(int l,int r,int pos,int L,int R){
if(l>=L&&r<=R)return tree[pos];
if(lazy[pos])push_down(pos,r-l+);
int mid=(l+r)>>,lson=pos<<,rson=pos<<|;
if(mid<L)return query(mid+,r,rson,L,R);
else if(mid>=R)return query(l,mid,lson,L,R);
else return query(l,mid,lson,L,R)+query(mid+,r,rson,L,R);
}
void solve(){
int now=;
for(int i=;i<=maxx;i++){
while(node[now].pos==i&&node[now].f==-)ans[node[now].id]-=query(,maxx,,node[now].l,node[now].r),now++;
while(top&&a[stk[top]]<=a[i])top--;
stk[++top]=i;
for(int j=;j<=top;j++)insert(,maxx,,stk[j-]+,stk[j],a[stk[j]]);
while(node[now].pos==i)ans[node[now].id]+=query(,maxx,,node[now].l,node[now].r),now++;
}
}
signed main(){
int fst=,sec=;
for(int i=;i<=;i++)
a[i]=fst^sec,fst=fst*%mod,sec=sec*%mod;
scanf("%lld",&t);
for(int i=;i<=t;i++){
scanf("%lld%lld%lld%lld",&l1,&r1,&l2,&r2);
node[++n]=Node(i,l1,r1,l2,-);
node[++n]=Node(i,l1,r1,r2,);
maxx=max(r1,max(maxx,r2));
}
sort(node+,node++n,cmp);
solve();
memset(tree,,sizeof(tree)),memset(lazy,,sizeof(lazy));
for(int i=;i<=;i++)a[i]=-a[i];
solve();
for(int i=;i<=t;i++)printf("%lld\n",ans[i]);
}

BZOJ 4262 线段树+期望的更多相关文章

  1. BZOJ 2752: [HAOI2012]高速公路(road) [线段树 期望]

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1219  Solved: 446[Submit] ...

  2. JZYZOJ1527 [haoi2012]高速公路 线段树 期望

    http://172.20.6.3/Problem_Show.asp?id=1527 日常线段树的pushdown写挂,果然每次写都想得不全面,以后要注意啊……求期望部分也不熟练,和平均数搞混也是or ...

  3. BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1820  Solved: 736[Submit][Status][Discuss] Descripti ...

  4. CF895 E. Eyes Closed(线段树 期望)

    题意 Sol 今天考试的T3,,我本来留了一个小时去写.但是T2一刚就刚了两个小时 最后也没来的及写.. 然后考完 开始写,,25min就A了.. 感觉自己太高估自己的思维,太低估自己的码力了... ...

  5. [CF895E] Eyes Closed(线段树,期望)

    Desctiption 传送门:Portal 大致题意: 给你一个序列, 支持两种操作: 1 l1 r1 l2 y2 在\([l1, r1]\)随机选择一个数a, \([l2, r2]\) 内随机选择 ...

  6. BZOJ 1798 (线段树||分块)的标记合并

    我原来准备做方差的.. 结果发现不会维护两个标记.. 就是操作变成一个 a*x+b ,每次维护a , b 即可 加的时候a=1 ,b=v 乘的时候a=v ,b=0 #include <cstdi ...

  7. bzoj 3999 线段树区间提取 有序链剖

    看错题目了,想成每个城市都可以买一个东西,然后在后面的某个城市卖掉,问最大收益.这个可以类似维护上升序列的方法在O(nlog^3n)的时间复杂度内搞定 这道题用到的一些方法: 1. 可以将有关的线段提 ...

  8. bzoj 3211 线段树

    开方操作最多进行5次就可以把出现的任何数变成1. 所以用线段树暴力修改,以后修改时只需看一下是否当前区间都是0或1,如果是那么就直接返回. /***************************** ...

  9. bzoj 1018 线段树维护连通性

    本题将一道LCT的题特殊化(支持加边和删边,询问图的连通性),将图变成了2×m的网格图,然后就神奇地可以用线段树来维护. 对于每个区间[l,r],维护其四个角落之间的连通性(仅仅通过[l,r]这段的边 ...

随机推荐

  1. C# 彻底关闭程序,包括循环

    System.Environment.Exit(System.Environment.ExitCode); this.Dispose(); this.Close();

  2. Java多线程中常见的几个问题

    我们都知道,在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 1.进程和线程的区别是什么? 进程是执行着的应用程序,而线程是进程内部的一个执行序列. ...

  3. SLAM: SLAM的发展历程(WIKI)

    参考维基百科: https://en.wikipedia.org/wiki/Simultaneous_localization_and_mapping 你们叫他SLAM,我还是习惯叫他三维重建.... ...

  4. asp.net mvc学习入门

    MVC是什么? M: Model就是我们获取的网页需要的数据 V: View就是我们的aspx页面,注意这是一个不包含后台代码文件的aspx页面.(其实带有.asp.cs文件也不会有编译错误,但是这样 ...

  5. PHP实现几秒前、几分钟前、几小时前、几天前

    /** * @Description: 将时间转换为几秒前.几分钟前.几小时前.几天前 * @Author: Yang * @param $the_time 需要转换的时间 * @return str ...

  6. javascript匿名函数及闭包深入理解及应用

    1.匿名函数 函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 1.1 函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式 第一种: ...

  7. BZOJ 4327: JSOI2012 玄武密码 后缀自动机

    Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...

  8. Golang - 复合类型

    目录 Golang - 复合类型 1. 指针 2. new()和make() 3. 数组 4. slice 5. Map 6. 结构体 7. 结构体参数 Golang - 复合类型 1. 指针 go语 ...

  9. 与公司2位经理的交流,Web开发知识库建设

    1.代码库3种类型 WebCommon:网站开发技术选型和最佳实践 FansCommons :各种可以复用的代码 CentronCore,CentronWeb 3种类型:通用,web,环境(通用+We ...

  10. 【Codeforces 933A】A Twisty Movement

    [链接] 我是链接,点我呀:) [题意] [题解] 因为只有1和2. 所以最后肯定是若干个1接着若干个2的情况. 即11...11222...222这样的. 1.首先考虑没有翻转的情况. 那么就直接枚 ...