传送门

题意:
给出两个长度为NNN的整数序列A1A2...ANA_1A_2...A_NA1​A2​...AN​,B1B2...BNB_1B_2...B_NB1​B2​...BN​。有MMM组询问(opt,l,r,d)(opt,l,r,d)(opt,l,r,d),令n=r−l+1n=r-l+1n=r−l+1
若opt=Aopt=Aopt=A:∀i∈[1,n],ai=Al+i−1+d,bi=Bl+i−1\forall i\in[1,n],a_i=A_{l+i-1}+d,b_i=B_{l+i-1}∀i∈[1,n],ai​=Al+i−1​+d,bi​=Bl+i−1​
若opt=Bopt=Bopt=B:∀i∈[1,n],ai=Al+i−1,bi=Bl+i−1+d\forall i\in[1,n],a_i=A_{l+i-1},b_i=B_{l+i-1}+d∀i∈[1,n],ai​=Al+i−1​,bi​=Bl+i−1​+d
求min(max{a1,a2,...,ap,bp+1,bp+2,...,bn}∣0≤p≤n)min(max\{a_1,a_2,...,a_p,b_{p+1},b_{p+2},...,b_n\}|0\leq p\leq n)min(max{a1​,a2​,...,ap​,bp+1​,bp+2​,...,bn​}∣0≤p≤n)

题解:
记maxa=max{a1,a2,...,ap}max_a=max\{a_1,a_2,...,a_p\}maxa​=max{a1​,a2​,...,ap​},随着ppp的增大,maxamax_amaxa​单调不降。
记maxb=max{bp+1,bp+2,...,bn}max_b=max\{b_{p+1},b_{p+2},...,b_n\}maxb​=max{bp+1​,bp+2​,...,bn​},随着ppp的增大,maxbmax_bmaxb​单调不升。
max(maxa,maxb)max(max_a,max_b)max(maxa​,maxb​)一定先不升,再不降,因此最优的ppp可以二分得到:
若p=midp=midp=mid时,

  • maxa>maxbmax_a>max_bmaxa​>maxb​,那么最优的ppp在[l,mid][l,mid][l,mid]中;
  • maxa≤maxbmax_a\leq max_bmaxa​≤maxb​,那么最优的ppp在[mid+1,r][mid+1,r][mid+1,r]中。

可以用线段树上二分来得到最优的ppp。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pr;
#define FR first
#define SE second
namespace IO{char buf[1000010],*cur=buf+1000010;inline char getc(){(cur==buf+1000010)?fread(cur=buf,1,1000010,stdin):0;return *cur++;}char buff[1000010],*curr=buff;inline void flush(){fwrite(buff,1,curr-buff,stdout);}inline void putc(const char &ch){(curr==buff+1000010)?fwrite(curr=buff,1,1000010,stdout):0;*curr++=ch;}inline void rd(int &x){x=0;char ch=getc();int f=1;while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}x*=f;}char st[60];int tp;void PT(int x){if(x==0)putc('0');else{if(x<0){putc('-');x=-x;}while(x>0){st[++tp]=x%10+'0';x/=10;}}while(tp)putc(st[tp--]);}
}
using IO::getc;
using IO::putc;
using IO::rd;
using IO::PT;
int n,q;
const int N=1000010;
int maxa[N<<2],maxb[N<<2],tga[N<<2],tgb[N<<2];
int A[N],B[N];
void pushup(int u){maxa[u]=max(maxa[u<<1],maxa[u<<1|1]);maxb[u]=max(maxb[u<<1],maxb[u<<1|1]);
}
void Add(int u,int x,int y){maxa[u]+=x;maxb[u]+=y;tga[u]+=x;tgb[u]+=y;
}
void pushdown(int u){Add(u<<1,tga[u],tgb[u]);Add(u<<1|1,tga[u],tgb[u]);tga[u]=tgb[u]=0;
}
void build(int u,int l,int r){if(l==r){maxa[u]=A[l];maxb[u]=B[l];return;}int mid=(l+r)>>1;build(u<<1,l,mid);build(u<<1|1,mid+1,r);pushup(u);
}
void update(int u,int l,int r,int L,int R,int d,bool ty){if(l==L&&r==R){if(ty) Add(u,d,0);else Add(u,0,d);return;}pushdown(u);int mid=(l+r)>>1;if(R<=mid) update(u<<1,l,mid,L,R,d,ty);else if(mid<L) update(u<<1|1,mid+1,r,L,R,d,ty);else{update(u<<1,l,mid,L,mid,d,ty);update(u<<1|1,mid+1,r,mid+1,R,d,ty);}pushup(u);
}
pr ans[N<<2];
void pre(int u,int l,int r,int L,int R){if(l==L&&r==R){ans[u]=pr(maxa[u],maxb[u]);return;}pushdown(u);int mid=(l+r)>>1;if(R<=mid){pre(u<<1,l,mid,L,R);ans[u]=ans[u<<1];}else if(mid<L){pre(u<<1|1,mid+1,r,L,R);ans[u]=ans[u<<1|1];}else{pre(u<<1,l,mid,L,mid);pre(u<<1|1,mid+1,r,mid+1,R);ans[u].FR=max(ans[u<<1].FR,ans[u<<1|1].FR);ans[u].SE=max(ans[u<<1].SE,ans[u<<1|1].SE);}
}
int solve(int u,int l,int r,int L,int R){if(l==L&&r==R){if(l==r) return min(maxa[u],maxb[u]);int mid=(l+r)>>1;pushdown(u);int s1=maxa[u<<1],s2=maxb[u<<1|1];if(s1>s2) return min(s1,max(s2,solve(u<<1,l,mid,l,mid)));else return min(s2,max(s1,solve(u<<1|1,mid+1,r,mid+1,r)));} int mid=(l+r)>>1;if(R<=mid) return solve(u<<1,l,mid,L,R);else if(mid<L) return solve(u<<1|1,mid+1,r,L,R);else{int s1=ans[u<<1].FR,s2=ans[u<<1|1].SE;if(s1>s2) return min(s1,max(s2,solve(u<<1,l,mid,L,mid)));else return min(s2,max(s1,solve(u<<1|1,mid+1,r,mid+1,R)));}
}
char opt[10];
int main(){rd(n);rd(q);for(int i=1;i<=n;i++) rd(A[i]);for(int i=1;i<=n;i++) rd(B[i]);build(1,1,n);int l,r,d;while(q--){char c=getc();while(c!='A'&&c!='B')c=getc();rd(l);rd(r);rd(d);if(c=='A')update(1,1,n,l,r,d,1);else update(1,1,n,l,r,d,0);rd(l);rd(r);pre(1,1,n,l,r);PT(solve(1,1,n,l,r));putc('\n');} IO::flush();return 0;
}

[XSY4170] 妹子(线段树上二分)相关推荐

  1. HDU 4747 Mex【线段树上二分+扫描线】

    [题意概述] 一个区间的Mex为这个区间没有出现过的最小自然数,现在给你一个序列,要求求出所有区间的Mex的和. [题解] 扫描线+线段树. 我们在线段树上维护从当前左端点开始的前缀Mex,显然从左到 ...

  2. [NOIP2015模拟10.27] [JZOJ4270] 魔道研究 解题报告(动态开点+权值线段树上二分)

    Description "我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力." --<The Grimoire of Mar ...

  3. POJ 2828-Buy Tickets(线段树上二分)

    题意: 有N个人排队,每一个人都有一个val来对应,每一个后来人都会插入当前队伍的某一个位置pos.要求把队伍最后的状态输出. 题解: 这题我们会发现,如果正着操作,每次加入会带来相对位置的变化,不太 ...

  4. H - Hello Ms. Ze(树状数组套主席树,线段树上二分)

    H - Hello Ms. Ze 给定nnn种不同的材料,第iii种材料有aia_iai​个,有mmm个操作,操作分为两类: 把第xxx种材料修改为yyy个, 只用[l,r][l, r][l,r]区间 ...

  5. 2019牛客暑假多校7E:Find the median【线段树上二分】

    题目: 2019牛客暑期多校训练营第七场E:Find the median 题意: 给出N个操作,每次操作向数组中插入[L,R]的数字,每次操作后询问数组中的中位数 分析: 如果L,R都比较小,就可以 ...

  6. CF817F MEX Queries(线段树上二分)

    题意 维护一个01串,一开始全部都是0 3种操作 1.把一个区间都变为1 2.把一个区间都变为0 3.把一个区间的所有数字翻转过来 每次操作完成之后询问区间最小的0的位置 l,r<=10^18 ...

  7. [CTSC2018]混合果汁 二分 套 主席树上二分

    题意: n种果汁,第iii种果汁的美味程度是did_idi​有lil_ili​​升,价格是pip_ipi​升 mmm个询问,要求使用果汁的总量不小于LimLimLim,价格不超过GGG,最大化所用的果 ...

  8. [ZJOI2015] 幻想乡战略游戏(树链剖分 + 线段树二分 + 带权重心)

    problem luogu-P3345 solution 这是一个带权重心的题,考察动态点分治.点分治?呵,不可能的,这辈子都不可能写点分治 我们重新考虑重心的性质:以这个点为根时,所有子树的大小不会 ...

  9. P5044-[IOI2018] meetings 会议【dp,笛卡尔树,线段树二分】

    正题 题目链接:https://www.luogu.com.cn/problem/P5044 题目大意 给出一个长度为nnn的序列hhh,定义dis(x,y)=max{hi}(x≤i≤y)dis(x, ...

最新文章

  1. 决定系数 均方误差mse_回归模型评价指标 SSE, MSE、RMSE、MAE、R-SQUARED
  2. 神经网络的分类等位面
  3. 第五章 MongoDb索引优化 5.4
  4. project 打印的时候上面的表格和下面的图例中间有个很大的空白,这块东西怎么能去掉呢?
  5. C++ 处理异常相关
  6. Linux 下串口编程入门教程
  7. 架构蓝图--软件架构 4+1 视图模型
  8. u盘在计算机上不显示错误,u盘为什么在电脑上不显示
  9. mysql简述cs结构与bs结构的区别_什么是BS和CS结构?
  10. 团队协作工具,如何加强团队协作能力
  11. Ubuntu 制作离线软件安装包
  12. (搞笑)经典!一些很彪悍的句子 !!
  13. python编程培训多少钱-编程培训多少钱,python编程培训多少钱
  14. 浅谈汽车OTA的现状与未来发展趋势
  15. 瓦工 -- 叫我怎么相信你
  16. 转载:汶川大地震中业余无线电应急通讯发挥作用
  17. python 处理EXCEL 追加写
  18. 【Python 八股文 】- Python基础
  19. python 灰度共生矩阵进行特征提取(代码)
  20. Schol-AR增强现实技术让图像跃然纸上

热门文章

  1. 神舟笔记本电源管理软件_笔记本电脑长期不用充不上电了?原来问题就出在这儿...
  2. java 计时_Breitling(百年灵)世界时间终极计时腕表
  3. python 廖雪峰数据分析统计服_廖雪峰python教程阅读量统计
  4. java获取jsp对象的属性_java-从jsp el中的对象获取布尔属性
  5. leetcode56. 合并区间
  6. 7-3 树的同构 (25 分)(思路加详解)来呀baby!!!!!!!!
  7. C++实现AOE网中的关键路径算法及机动时间计算算法(邻接表存储)
  8. [PAT乙级]1046 划拳
  9. C++实现链式存储二叉树
  10. C++string容器-插入和删除