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自动机 ...
随机推荐
- Java基础系列(22)- For循环详解
For循环 虽然所有循环结构都可以用while和dowhile表示,但是Java提供了另外一种语句for循环,使一些循环结构变动更加简单 for循环语句是支持迭代的一种通用结构,是最有效.最灵活的循环 ...
- YOLO v3 & Pascal VOC数据集
代码地址:https://github.com/YunYang1994/tensorflow-yolov3 https://hackernoon.com/understanding-yolo-f5a7 ...
- js模块化开发 AMD CMD Commonjs
在es6全面实行开来之前 js实现模块开发方案有: 1.AMD 异步模块开发定义 依赖前置,requireJs应用了这一规范 require([module], callback); 加载完后回调 ...
- 1.3redis小结--配置php reids拓展
1.执行php文件 输出phpinfo(); <?php phpinfo(); 2.根据PHPinfo的信息确定需要下载的 php_redis.dll , php_igbinary.dll 版 ...
- Redis三种集群模式介绍
三种集群模式 redis有三种集群模式,其中主从是最常见的模式. Sentinel 哨兵模式是为了弥补主从复制集群中主机宕机后,主备切换的复杂性而演变出来的.哨兵顾名思义,就是用来监控的,主要作用就是 ...
- Remote Sensing Images Semantic Segmentation with General Remote Sensing Vision Model via a Self-Supervised Contrastive Learning Method
论文阅读: Remote Sensing Images Semantic Segmentation with General Remote Sensing Vision Model via a Sel ...
- 如何评估 Serverless 服务能力?这份报告给出了 40 条标准
编者按:两年前,我们还在讨论什么是 Serverless,Serverless 如何落地.如今,已经有评测机构给出了 40 条标准来对 Serverless 的服务能力进行评估,这些评估细则既是技术生 ...
- CI/CD-企业级DevOps
CI/CD-企业级DevOps 什么是DevOps? DevOps是一种思想或方法论,它涵盖开发.测试.运维的整个过程! DevOps强调软件开发人员与软件测试.软件运维.质量保障(QA) 部门之间有 ...
- SQL Server链接服务器信息查询
exec sp_helpserver --查询链接服务器select * from sys.servers --查询链接服务器链接地址
- python T1119紧急措施
2021-10-18 题目: 近日,一些热门网站遭受黑客入侵,这些网站的账号.密码及 email 的数据惨遭泄露.你在这些网站上注册若干账号(使用的用户名不一定相同),但是注册时使用了相同的 emai ...