2021.11.4测试T1-妹子
题目
今天测试,直接挂完了
写了四个小时,最后发现自己题目理解错误了
有两个区间,在输入了 \(l\) 和 \(r\) 以后,进行查询
\]
即在选定了 \(l\) 和 \(r\) 以后,选定一个\(p\)将\(a\)区间从\(1\)到\(p\),\(b\)区间从\(p+1\)到\(r\)组成一个新的区间,求其最大值,在对不同\(p\)的取值取最小值
\]
第一种情况当\(a\)的最大值在\(b\)的最大值的前面那么所选区间就一定会经过两个最大值之一 则答案为:
\]
第二种: \(a\)的最大值在\(b\)的最大值后面
(1)当一定经过两个或两个之一时,则答案和第一种相同 (2)两个都不经过
则在区间\([x_1,x_2]\)查找\(a\)的最大和\(b\)的最大,再进行比较其位置
如果为第一种,则答案为
\]
第二种则继续,利用分治思想
直到停止
主要结构:线段树存储最值,区间,加上懒标以及最重要的最值的位置
1:build
1 void build(int k,int l,int r,int cas){
2 t[k].l=l,t[k].r=r;
3 if(l==r){
4 if(cas==1) t[k].mx=a[l];
5 else t[k].mx=b[l];
6 t[k].pos=l;
7 t[k].lz=0;
8 return;
9 }
10 int mid=(l+r)>>1;
11 build(lc,l,mid,cas);
12 build(rc,mid+1,r,cas);
13 pushup(k);
14 }
2:更新
1 void update(int k,int l,int r,int val){
2 if(t[k].l>=l && t[k].r<=r){
3 t[k].lz+=val;
4 t[k].mx+=val;
5 return;
6 }
7 pushdown(k);
8 int mid=(t[k].l+t[k].r)>>1;
9 if(l<=mid) update(lc,l,r,val);
10 if(r>mid) update(rc,l,r,val);
11 pushup(k);
12 }
3:pushup与pushdown
1 void pushup(int k){
2 if(t[lc].mx>=t[rc].mx){
3 t[k].mx=t[lc].mx;
4 t[k].pos=t[lc].pos;
5 }
6 else{
7 t[k].mx=t[rc].mx;
8 t[k].pos=t[rc].pos;
9 }
10 }
11 void pushdown(int k){
12 if(t[k].lz){
13 t[lc].mx+=t[k].lz;
14 t[rc].mx+=t[k].lz;
15 t[lc].lz+=t[k].lz;
16 t[rc].lz+=t[k].lz;
17 t[k].lz=0;
18 }
19 }
4:查询区间位置
node query(int k,int l,int r){
if(t[k].l>=l && t[k].r<=r) return (node){t[k].mx,t[k].pos};
pushdown(k);
int mid=(t[k].l+t[k].r)>>1;
node res,now;res.mx=-inf;
if(l<=mid){
now=query(lc,l,r);
if(res.mx<now.mx){
res.mx=now.mx;
res.pos=now.pos;
}
}
if(r>mid){
now=query(rc,l,r);
if(res.mx<now.mx){
res.mx=now.mx;
res.pos=now.pos;
}
}
return res;
}
因为有两个区间,所以建树定义结构体:
struct tree{
struct nde{
int l,r,mx,pos,lz;//pos表示最值位置
}t[N<<2];
void pushup(int k){
if(t[lc].mx>=t[rc].mx){
t[k].mx=t[lc].mx;
t[k].pos=t[lc].pos;
}
else{
t[k].mx=t[rc].mx;
t[k].pos=t[rc].pos;
}
}
void pushdown(int k){
if(t[k].lz){
t[lc].mx+=t[k].lz;
t[rc].mx+=t[k].lz;
t[lc].lz+=t[k].lz;
t[rc].lz+=t[k].lz;
t[k].lz=0;
}
}
void build(int k,int l,int r,int cas){
t[k].l=l,t[k].r=r;
if(l==r){
if(cas==1) t[k].mx=a[l];
else t[k].mx=b[l];
t[k].pos=l;
t[k].lz=0;
return;
}
int mid=(l+r)>>1;
build(lc,l,mid,cas);
build(rc,mid+1,r,cas);
pushup(k);
}
void update(int k,int l,int r,int val){
if(t[k].l>=l && t[k].r<=r){
t[k].lz+=val;
t[k].mx+=val;
return;
}
pushdown(k);
int mid=(t[k].l+t[k].r)>>1;
if(l<=mid) update(lc,l,r,val);
if(r>mid) update(rc,l,r,val);
pushup(k);
}
node query(int k,int l,int r){
if(t[k].l>=l && t[k].r<=r) return (node){t[k].mx,t[k].pos};
pushdown(k);
int mid=(t[k].l+t[k].r)>>1;
node res,now;res.mx=-inf;
if(l<=mid){
now=query(lc,l,r);
if(res.mx<now.mx){
res.mx=now.mx;
res.pos=now.pos;
}
}
if(r>mid){
now=query(rc,l,r);
if(res.mx<now.mx){
res.mx=now.mx;
res.pos=now.pos;
}
}
return res;
}
}A,B;//又学到了
最后总代码:
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define lc k<<1
4 #define rc k<<1|1
5 #define num ch-'0'
6 void get(int &res)
7 {
8 char ch;bool flag=0;
9 while(!isdigit(ch=getchar()))
10 (ch=='-')&&(flag=true);
11 for(res=num;isdigit(ch=getchar());res=res*10+num);
12 (flag)&&(res=-res);
13 }
14 const int N=6e5+5,inf=0x3f3f3f3f;
15 int n,m,a[N],b[N];
16 struct node{
17 int mx,pos;
18 };
19 struct tree{
20 struct nde{
21 int l,r,mx,pos,lz;
22 }t[N<<2];
23 void pushup(int k){
24 if(t[lc].mx>=t[rc].mx){
25 t[k].mx=t[lc].mx;
26 t[k].pos=t[lc].pos;
27 }
28 else{
29 t[k].mx=t[rc].mx;
30 t[k].pos=t[rc].pos;
31 }
32 }
33 void pushdown(int k){
34 if(t[k].lz){
35 t[lc].mx+=t[k].lz;
36 t[rc].mx+=t[k].lz;
37 t[lc].lz+=t[k].lz;
38 t[rc].lz+=t[k].lz;
39 t[k].lz=0;
40 }
41 }
42 void build(int k,int l,int r,int cas){
43 t[k].l=l,t[k].r=r;
44 if(l==r){
45 if(cas==1) t[k].mx=a[l];
46 else t[k].mx=b[l];
47 t[k].pos=l;
48 t[k].lz=0;
49 return;
50 }
51 int mid=(l+r)>>1;
52 build(lc,l,mid,cas);
53 build(rc,mid+1,r,cas);
54 pushup(k);
55 }
56 void update(int k,int l,int r,int val){
57 if(t[k].l>=l && t[k].r<=r){
58 t[k].lz+=val;
59 t[k].mx+=val;
60 return;
61 }
62 pushdown(k);
63 int mid=(t[k].l+t[k].r)>>1;
64 if(l<=mid) update(lc,l,r,val);
65 if(r>mid) update(rc,l,r,val);
66 pushup(k);
67 }
68 node query(int k,int l,int r){
69 if(t[k].l>=l && t[k].r<=r) return (node){t[k].mx,t[k].pos};
70 pushdown(k);
71 int mid=(t[k].l+t[k].r)>>1;
72 node res,now;res.mx=-inf;
73 if(l<=mid){
74 now=query(lc,l,r);
75 if(res.mx<now.mx){
76 res.mx=now.mx;
77 res.pos=now.pos;
78 }
79 }
80 if(r>mid){
81 now=query(rc,l,r);
82 if(res.mx<now.mx){
83 res.mx=now.mx;
84 res.pos=now.pos;
85 }
86 }
87 return res;
88 }
89 }A,B;
90 int check(int l,int r){
91 if(l>r) return -inf;
92 node ma=A.query(1,l,r);
93 node mb=B.query(1,l,r);
94 if(ma.pos<=mb.pos) return min(ma.mx,mb.mx);
95 else{
96 return min(min(ma.mx,mb.mx),max(check(mb.pos+1,ma.pos-1),max(A.query(1,l,mb.pos).mx,B.query(1,ma.pos,r).mx)));
97 }
98 }
99 int main(){
100 //freopen("girl.in","r",stdin);
101 //freopen("girl.out","w",stdout);
102 get(n);get(m);
103 for(int i=1;i<=n;i++) get(a[i]);
104 for(int i=1;i<=n;i++) get(b[i]);
105 A.build(1,1,n,1);B.build(1,1,n,2);
106 char str;int l,r,k;
107 for(int i=1;i<=m;i++){
108 cin>>str;
109 get(l);get(r);get(k);
110 if(str=='A') A.update(1,l,r,k);
111 else B.update(1,l,r,k);
112 get(l);get(r);
113 cout<<check(l,r)<<endl;
114 }
115 return 0;
116 }
2021.11.4测试T1-妹子的更多相关文章
- 2021.11.2-测试T1数独
痛苦 题目 数 独 [问题描述] 给定一个9*9矩阵,对其进行几种操作,分别是插入,删除,合并,查询,输出 主要学到了一些特别的操作. (1)备份( 本蒟蒻第一次了解到) (2)对与数据的一些特别的改 ...
- 日常Javaweb 2021/11/19
Javaweb Dao层: //连接数据库,实现增查功能 package dao; import java.sql.Connection; import java.sql.DriverManager; ...
- 日常Java 2021/11/18
用idea实现Javaweb登录页面 <%-- Created by IntelliJ IDEA. User: Tefuir Date: 2021/11/18 Time: 18:14 To ch ...
- 2021.11.30 eleveni的水省选题的记录
2021.11.30 eleveni的水省选题的记录 因为eleveni比较菜,eleveni决定先刷图论,再刷数据结构,同时每天都要刷dp.当然,对于擅长的图论,eleveni决定从蓝题开始刷.当然 ...
- 2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分)
2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分) https://www.luogu.com.cn/problem/P2375 题意: PS:这道神题的背景让人疑惑,重 ...
- 2021.11.14 CF1583E Moment of Bloom(LCA+图上构造)
2021.11.14 CF1583E Moment of Bloom(LCA+图上构造) https://www.luogu.com.cn/problem/CF1583E 题意: She does h ...
- 2021.11.11 EXKMP
2021.11.11 EXKMP https://www.luogu.com.cn/problem/P5410 下标以1开头: #include<cstdio> #include<i ...
- 2021.11.11 P4052 [JSOI2007]文本生成器(AC自动机+DP)
2021.11.11 P4052 [JSOI2007]文本生成器(AC自动机+DP) https://www.luogu.com.cn/problem/P4052 题意: JSOI 交给队员 ZYX ...
- 2021.11.10 fail树
2021.11.10 fail树 https://blog.csdn.net/niiick/article/details/87947160 1. AC自动机与fail树的神奇关系 1.1 AC自动机 ...
随机推荐
- Shell系列(4)- 历史命令
格式:history [选项] [历史命令保存文件] 选项: -c:清空历史命令 -w:把缓存中的历史命令写入到历史命令保存文件~ /.bash_history;用户的家目录下 例子: [root@l ...
- 博客主题-Next风格
适配方法 下载压缩包,按照文件名将内容复制粘贴到对应框中即可. 注意事项 请将主题设置为custom 禁用默认css 下载连接 Next.rar version:2020-07-10 next.rar ...
- javascript 标签切换
* index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- python pip 安装使用国内镜像源
国内镜像源 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 ...
- [转载]SELinux安全系统基础
链接:http://www.cnblogs.com/xiaoluo501395377/archive/2013/05/26/3100444.html 本篇随笔将记录一下学习SELinux的一些心得与体 ...
- VS2013的switch case缩进问题
原来的 更改设置 改完后
- Abp vNext 番外篇-疑难杂症丨浅谈扩展属性与多用户设计
说明 Abp vNext基础篇的文章还差一个单元测试模块就基本上完成了我争取10.1放假之前给大家赶稿出来,后面我们会开始进阶篇,开始拆一些东西,具体要做的事我会单独开一个文章来讲 缘起 本篇文章缘起 ...
- PC Register简介
PC Regiter介绍: JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息,CPU只有把数据装载 ...
- k8s deployment controller源码分析
deployment controller简介 deployment controller是kube-controller-manager组件中众多控制器中的一个,是 deployment 资源对象的 ...
- js 判断两个对象是否相等
最近碰到的一个面试题,不算高频,记录一下 判断两个对象是否相等,大致分为三步 首先判断两个比较对象是不是 Object 如果都是对象 再比较 对象的长度是否相等 如果两个对象的长度相等 再比较对象属性 ...