https://loj.ac/problem/504

题解

对于区间取\(\max\),这个比较好办,直接在线段树上打标记就行了。

如果让我们弹出前\(n\)个数,我们可以用类似超级钢琴的思想,队列中每个元素是一个线段树节点,弹出时记录最值的位置,然后分成两半继续做就行了。

代码

#include<bits/stdc++.h>
#define N 500009
using namespace std;
typedef long long ll;
int n,a[N],m;
int tr[N<<2],pos[N<<2],la[N<<2];
int ans[N],top;
bool tag[N<<2];
inline ll rd(){
ll x=0;char c=getchar();bool f=0;
while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return f?-x:x;
}
struct node{
int nw,l,r;
inline bool operator <(const node &b)const{
return tr[nw]>tr[b.nw];
}
};
priority_queue<node>q;
inline void pushup(int cnt){
tr[cnt]=tr[cnt<<1];pos[cnt]=pos[cnt<<1];
if(tr[cnt<<1|1]<tr[cnt])tr[cnt]=tr[cnt<<1|1],pos[cnt]=pos[cnt<<1|1];
}
inline void pushdown(int cnt){
la[cnt<<1]=max(la[cnt<<1],la[cnt]);
la[cnt<<1|1]=max(la[cnt<<1|1],la[cnt]);
tr[cnt<<1]=max(tr[cnt<<1],la[cnt]);
tr[cnt<<1|1]=max(tr[cnt<<1|1],la[cnt]);
la[cnt]=0;
}
void build(int cnt,int l,int r){
if(l==r){
pos[cnt]=l;
tr[cnt]=a[l];
tag[cnt]=1;
return;
}
int mid=(l+r)>>1;
build(cnt<<1,l,mid);
build(cnt<<1|1,mid+1,r);
pushup(cnt);
}
void upd(int cnt,int l,int r,int L,int R,int x){
if(l>=L&&r<=R){
tr[cnt]=max(tr[cnt],x);
la[cnt]=max(la[cnt],x);
return;
}
int mid=(l+r)>>1;
if(la[cnt])pushdown(cnt);
if(mid>=L)upd(cnt<<1,l,mid,L,R,x);
if(mid<R)upd(cnt<<1|1,mid+1,r,L,R,x);
pushup(cnt);
}
void query(int cnt,int l,int r,int L,int R){
if(l>=L&&r<=R){
q.push(node{cnt,l,r});
return;
}
int mid=(l+r)>>1;
if(la[cnt])pushdown(cnt);
if(mid>=L)query(cnt<<1,l,mid,L,R);
if(mid<R)query(cnt<<1|1,mid+1,r,L,R);
}
int main(){
n=rd();
for(int i=1;i<=n;++i)a[i]=rd();
build(1,1,n);
m=rd();
int opt,l,r,k,x;
while(m--){
opt=rd();l=rd();r=rd();k=rd();
if(opt==1){
upd(1,1,n,l,r,k);
}
else{
x=rd();
while(!q.empty())q.pop();
query(1,1,n,l,r);
for(int i=1;i<=x;++i){
if(q.empty())break;
int cnt=q.top().nw;
node y=q.top();q.pop();
if(tr[cnt]>=k)break;
ans[++top]=tr[cnt];
if(tag[cnt])continue;
pushdown(cnt);
if(y.l<=pos[cnt]-1)query(cnt,y.l,y.r,y.l,pos[cnt]-1);
if(pos[cnt]+1<=y.r)query(cnt,y.l,y.r,pos[cnt]+1,y.r);
}
if(top==x){for(int i=1;i<=top;++i)printf("%d ",ans[i]);puts("");}
else puts("-1");
top=0;
}
}
return 0;
}

LOJ504「LibreOJ β Round」ZQC 的手办的更多相关文章

  1. 「LibreOJ β Round」ZQC 的手办

    https://loj.ac/problem/504 一类套路题. 首先这个玩意可以两个logn树套树做.... naive地,把区间内的所有数拿出来放进堆里.不断取出. 太多了. 所以开始只保留那初 ...

  2. LOJ#505. 「LibreOJ β Round」ZQC 的游戏(最大流)

    题意 题目链接 Sol 首先把第一个人能吃掉的食物删掉 然后对每个人预处理出能吃到的食物,直接限流跑最大流就行了 判断一下最后的最大流是否等于重量和 注意一个非常恶心的地方是需要把除1外所有人都吃不到 ...

  3. #505. 「LibreOJ β Round」ZQC 的游戏

    题目描述 首先一定是让ZQC吃掉他能吃到的所有的球,这样才能尽可能的满足ZQC的质量是所有玩家中最大的. 在满足某一个玩家的质量不会超过ZQC的情况下,让这个玩家吃掉尽可能多的球,让其他玩家吃掉的尽可 ...

  4. #503. 「LibreOJ β Round」ZQC 的课堂 容斥原理+Treap

    题目: 题解: 比较容易发现 : \(x,y\) 的贡献是独立的. 所以可以分开考虑. 假设我们考虑 \(x\).向量在 \(x\) 方向的投影依次是 : \(\{a_1,a_2, ... ,a_n\ ...

  5. LOJ#503. 「LibreOJ β Round」ZQC 的课堂(容斥+FHQTreap)

    题面 传送门 题解 首先\(x\)和\(y\)两维互相独立,可以分开考虑,我们以\(x\)为例 我们把\(x\)做个前缀和,那么就是问有多少\(i\)满足\(s_is_{i-1}<0\),其中\ ...

  6. loj#501 「LibreOJ β Round」ZQC 的树列

    分析 代码(我的代码是瞎jb水过去的) #include<bits/stdc++.h> using namespace std; #define li long long li a[]; ...

  7. loj#500 「LibreOJ β Round」ZQC 的拼图

    分析 二分倍数 然后考虑dp[i][j]表示选到第i个x轴覆盖到j的情况y轴最多覆盖多少 贡献柿子可以画图然后相似三角形得到 代码 #include<bits/stdc++.h> usin ...

  8. [LOJ#500]「LibreOJ β Round」ZQC的拼图

    题目   点这里看题目. 分析   首先不难发现答案具有单调性,因此可以二分答案.答案上限为\(V=2m\times \max\{a_i, b_i\}\).   考虑如何去判断当前的答案.设这个答案为 ...

  9. loj #547. 「LibreOJ β Round #7」匹配字符串

    #547. 「LibreOJ β Round #7」匹配字符串   题目描述 对于一个 01 串(即由字符 0 和 1 组成的字符串)sss,我们称 sss 合法,当且仅当串 sss 的任意一个长度为 ...

随机推荐

  1. 浅谈CSS的模块化

    一.简介 Web前端模块化:HTML模块化.CSS模块化以及JS模块化三个部分: 二.CSS模块化背景 对于小型项目来说,css的量还不至于庞大,问题没有凸显,而如果要开发和持续维护一个较为大型的项目 ...

  2. java文件编译后,出现xx$1.class的原因

    java编译后的文件名字带有$接数字的就是匿名内部类的编译结果,接名字的就是内部类的编译结果 例如:TestFrame$1.class是匿名内部类的编译结果, TestFrame$MyJob.clas ...

  3. [Python3] 002 Python3 中常用的命名规则

    目录 1. 什么可以用来命名? 1.1 老三样: 字母.数字.下划线 1.2 其他 2. 什么不能用来命名? Python3 中的"关键字" 3. 命名"小贴士" ...

  4. 使用ntpdate 同步 linux的时间

    1. linux 查看时间和时区的命令 timedatectl 效果为: Local time: Sun -- :: CST Universal time: Sun -- :: UTC RTC tim ...

  5. MySQL-快速入门(3)运算符

    1.常见的运算符:算术运算符.比较运算符.逻辑运算符.位运算符. 算术运算符:+.-.*./.%(求余). 比较运算符:>.<.=.>=.<=.!=.in.between an ...

  6. Linux 创建与删除(5)

    相对于Windows下的右键新建文件与删除,我更喜爱Linux下的命令式创建与删除,真的方便.不过Windows下也可以借助工具来实现,比如git bash.cmder等等终端工具. 创建文件 新建文 ...

  7. C++中的class和struct区别

    1,经过不停的改进,结构体 struct 变得原来越不像它在 C 语言中的样子了: 1,struct 在 C 语言中仅为了定义一个变量的集合,仅此而已,不能定义函数: 2,struct 在 C++ 中 ...

  8. Django 调试models 输出的SQL语句 定位查看结果

    django 调试models变得更为简单了,不用像之前的版本, 手工去调用django query, 才能打印出之前的代码是执行的什么SQL语句. 1.3开始只需在settings.py里,配置如下 ...

  9. PCIeのType0与Type1型配置请求与BAR(基地址寄存器)

    PCIe中存在两种配置空间Type0&type1,TYPE0对应非桥设备(Endpoint),Type1对应桥设备(Root和Switch端口中的P2P桥)因为Root每个端口总都含有一个P2 ...

  10. Jpa/Hibernate ManyToOne 关联非主键列 延迟加载失效

    @ManyToOne配置延迟加载,如果是关联主键列, @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "billid", ...