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自动机 ...
随机推荐
- DISCUZ论坛添加页头及页尾背景图片的几种方法
先给大家分享页头添加背景图片的两种方法:1. 第一种效果,是给discuz的整体框架添加背景图片,见图示: 添加方法如下:找到你现在使用模板common文件下的header.html文件,在<h ...
- Java基础系列(8)- 数据类型
数据类型 强类型语言 要求变量的使用合乎规定,所有的变量都必须先定义才能使用.Java是强类型语言. 弱类型语言 变量定义比较随意,比如"12"+3,可以是int型123,也可以是 ...
- 传说中 VUE 的“语法糖”到底是啥?
一.什么是语法糖? 语法糖也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是计算机语言中添加的一种语法,在不影响功能的情况下,添加某种简单的语 ...
- Kafka 3.0新特性
1.概述 Kafka是一个分布表示实时数据流平台,可独立部署在单台服务器上,也可部署在多台服务器上构成集群.它提供了发布与订阅的功能,用户可以发送数据到Kafka集群中,也可以从Kafka集群中读取数 ...
- 重新嫁接rm命令
### 重定义rm命令 #### 定义回收站目录trash_path='~/.trash'# 判断 $trash_path 定义的文件是否存在,如果不存在,那么就创建 $trash_path.if [ ...
- CF280C-Game on Tree【数学期望】
正题 题目链接:https://www.luogu.com.cn/problem/CF280C 题目大意 \(n\)个点的一棵树,每次选择一个没有染色的点把它和它的子树染黑,求期望全部染黑的步数. 解 ...
- 一、mybatis入门案例
今天学习了mybatis框架,简单记录一下mybatis第一个入门案例,目标是使用Mybatis作为持久层框架,执行查询数据的SQL语句并且获取结果集 基本步骤: 物理建模 逻辑建模 引入依赖 创建持 ...
- EF Core Sequence contains no elements
一.在.Net Core中使用Ef的聚合函数报错: 类似函数: 1,使用FirstOrDefault() 来代替 First() 2.使用SingleOrDefault 来代替 Single 3.使用 ...
- NOIP模拟72
T1 出了个大阴间题 解题思路 看了看数据,大概是个状压 DP,但是感觉记忆化搜索比较好写一点(然而并不是这样递归比迭代常熟大了许多..) 不难判断出来 b 的数值与合并的顺序无关于是我们可以预先处理 ...
- SudokuSolver 1.0:用C++实现的数独解题程序 【一】
SudokuSolver 1.0 用法与实现效果 SudokuSolver 是一个提供命令交互的命令行程序,提供的命令清单有: H:\Read\num\Release>sudoku.exe Or ...