https://loj.ac/problem/504

一类套路题.

首先这个玩意可以两个logn树套树做。。。。

naive地,把区间内的所有数拿出来放进堆里。不断取出。

太多了。

所以开始只保留那初始logn区间最小值,弹出之后再找出左右区间下一个

线段树维护最小值和最小值位置。

和超级钢琴,异或粽子,K个串都一样。

或者说k短路。

只不过这个是线段树载体。

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);(fl==true)&&(x=-x);}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}
namespace Modulo{
const int mod=;
il int ad(int x,int y){return x+y>=mod?x+y-mod:x+y;}
il int sub(int x,int y){return ad(x,mod-y);}
il int mul(int x,int y){return (ll)x*y%mod;}
il void inc(int &x,int y){x=ad(x,y);}
il void inc2(int &x,int y){x=mul(x,y);}
il int qm(int x,int y=mod-){int ret=;while(y){if(y&) ret=mul(x,ret);x=mul(x,x);y>>=;}return ret;}
template<class ...Args>il int ad(const int a,const int b,const Args &...args) {return ad(ad(a,b),args...);}
template<class ...Args>il int mul(const int a,const int b,const Args &...args) {return mul(mul(a,b),args...);}
}
// using namespace Modulo;
namespace Miracle{
const int N=5e5+;
const int inf=0x3f3f3f3f;
int n,m;
struct tr{
int mi,p;
int tag;
}t[*N];
#define ls (x<<1)
#define rs (x<<1|1)
#define mid ((l+r)>>1)
void pushup(int x){
t[x].mi=min(t[ls].mi,t[rs].mi);
if(t[ls].mi==t[x].mi) t[x].p=t[ls].p;
else t[x].p=t[rs].p;
}
void Max(int x,int c){
t[x].mi=max(t[x].mi,c);
t[x].tag=max(t[x].tag,c);
}
void pushdown(int x){
if(t[x].tag){
Max(ls,t[x].tag);
Max(rs,t[x].tag);
t[x].tag=;
}
}
int a[N];
void build(int x,int l,int r){
if(l==r){
t[x].mi=a[l];
t[x].p=l;
return;
}
build(ls,l,mid);
build(rs,mid+,r);
pushup(x);
}
void chan(int x,int l,int r,int L,int R,int c){
if(L<=l&&r<=R){
Max(x,c);
return;
}
pushdown(x);
if(L<=mid) chan(ls,l,mid,L,R,c);
if(mid<R) chan(rs,mid+,r,L,R,c);
pushup(x);
}
pii query(int x,int l,int r,int L,int R){ if(L<=l&&r<=R){
return mk(t[x].p,t[x].mi);
}
pushdown(x);
if(L>mid) return query(rs,mid+,r,L,R);
if(R<=mid) return query(ls,l,mid,L,R);
pii le=query(ls,l,mid,L,R);
pii ri=query(rs,mid+,r,L,R);
le.se=min(le.se,ri.se);
if(ri.se==le.se) le.fi=ri.fi;
return le;
}
struct po{
int v,p,l,r;
po(){}
po(int vv,int pp,int le,int ri){
v=vv;p=pp;l=le;r=ri;
}
bool friend operator <(po a,po b){
return a.v>b.v;
}
void op(){
cout<<" po "<<v<<" "<<p<<" "<<l<<" "<<r<<endl;
}
}; priority_queue<po>q;
void push(int x,int l,int r,int L,int R,int k){
if(L<=l&&r<=R){
if(t[x].mi<k) q.push(po(t[x].mi,t[x].p,l,r));
return;
}
pushdown(x);
if(L<=mid) push(ls,l,mid,L,R,k);
if(mid<R) push(rs,mid+,r,L,R,k);
} void clear(priority_queue<po>&q){
priority_queue<po>tmp;
q.swap(tmp);
}
int mem[+],num;
int main(){
rd(n);
for(reg i=;i<=n;++i){
rd(a[i]);
}
build(,,n);
// return 0; rd(m);
// cout<<" 22223 "<<endl;
int op,l,r,k,x;
while(m--){
rd(op);rd(l);rd(r);rd(k);
if(op==){
// continue;
// cout<<" op==1 "<<endl;
chan(,,n,l,r,k);
}else{
// cout<<" op==2 "<<endl;
rd(x);
clear(q);
push(,,n,l,r,k);
// cout<<" size "<<q.size()<<endl;
num=;
while(x&&!q.empty()){
po now=q.top();q.pop();
// now.op();
if(now.v>=k) break;
mem[++num]=now.v;
if(now.l<=now.p-){
// cout<<" findl "<<endl;
pii lp=query(,,n,now.l,now.p-);
// cout<<" endq "<<endl;
q.push(po(lp.se,lp.fi,now.l,now.p-));
// cout<<" enl "<<endl;
}
if(now.p+<=now.r){
// cout<<" findr "<<endl;
pii lp=query(,,n,now.p+,now.r);
q.push(po(lp.se,lp.fi,now.p+,now.r));
// cout<<" enr "<<endl;
}
--x;
}
if(x){
puts("-1");
}else{
prt(mem,,num);
}
}
}
return ;
} }
signed main(){
// freopen("data.in","r",stdin);
// freopen("my.out","w",stdout);
Miracle::main();
return ;
} /*
Author: *Miracle*
*/
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);(fl==true)&&(x=-x);}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}
namespace Modulo{
const int mod=;
il int ad(int x,int y){return x+y>=mod?x+y-mod:x+y;}
il int sub(int x,int y){return ad(x,mod-y);}
il int mul(int x,int y){return (ll)x*y%mod;}
il void inc(int &x,int y){x=ad(x,y);}
il void inc2(int &x,int y){x=mul(x,y);}
il int qm(int x,int y=mod-){int ret=;while(y){if(y&) ret=mul(x,ret);x=mul(x,x);y>>=;}return ret;}
template<class ...Args>il int ad(const int a,const int b,const Args &...args) {return ad(ad(a,b),args...);}
template<class ...Args>il int mul(const int a,const int b,const Args &...args) {return mul(mul(a,b),args...);}
}
// using namespace Modulo;
namespace Miracle{
const int N=5e5+;
const int inf=0x3f3f3f3f;
int n,m;
struct tr{
int mi,p;
int tag;
}t[*N];
#define ls (x<<1)
#define rs (x<<1|1)
#define mid ((l+r)>>1)
void pushup(int x){
t[x].mi=min(t[ls].mi,t[rs].mi);
if(t[ls].mi==t[x].mi) t[x].p=t[ls].p;
else t[x].p=t[rs].p;
}
void Max(int x,int c){
t[x].mi=max(t[x].mi,c);
t[x].tag=max(t[x].tag,c);
}
void pushdown(int x){
if(t[x].tag){
Max(ls,t[x].tag);
Max(rs,t[x].tag);
t[x].tag=;
}
}
int a[N];
void build(int x,int l,int r){
if(l==r){
t[x].mi=a[l];
t[x].p=l;
return;
}
build(ls,l,mid);
build(rs,mid+,r);
pushup(x);
}
void chan(int x,int l,int r,int L,int R,int c){
if(L<=l&&r<=R){
Max(x,c);
return;
}
pushdown(x);
if(L<=mid) chan(ls,l,mid,L,R,c);
if(mid<R) chan(rs,mid+,r,L,R,c);
pushup(x);
}
pii query(int x,int l,int r,int L,int R){ if(L<=l&&r<=R){
return mk(t[x].p,t[x].mi);
}
pushdown(x);
if(L>mid) return query(rs,mid+,r,L,R);
if(R<=mid) return query(ls,l,mid,L,R);
pii le=query(ls,l,mid,L,R);
pii ri=query(rs,mid+,r,L,R);
le.se=min(le.se,ri.se);
if(ri.se==le.se) le.fi=ri.fi;
return le;
}
struct po{
int v,p,l,r;
po(){}
po(int vv,int pp,int le,int ri){
v=vv;p=pp;l=le;r=ri;
}
bool friend operator <(po a,po b){
return a.v>b.v;
}
void op(){
cout<<" po "<<v<<" "<<p<<" "<<l<<" "<<r<<endl;
}
}; priority_queue<po>q;
void push(int x,int l,int r,int L,int R,int k){
if(L<=l&&r<=R){
if(t[x].mi<k) q.push(po(t[x].mi,t[x].p,l,r));
return;
}
pushdown(x);
if(L<=mid) push(ls,l,mid,L,R,k);
if(mid<R) push(rs,mid+,r,L,R,k);
} void clear(priority_queue<po>&q){
priority_queue<po>tmp;
q.swap(tmp);
}
int mem[+],num;
int main(){
rd(n);
for(reg i=;i<=n;++i){
rd(a[i]);
}
build(,,n);
// return 0; rd(m);
// cout<<" 22223 "<<endl;
int op,l,r,k,x;
while(m--){
rd(op);rd(l);rd(r);rd(k);
if(op==){
// continue;
// cout<<" op==1 "<<endl;
chan(,,n,l,r,k);
}else{
// cout<<" op==2 "<<endl;
rd(x);
clear(q);
push(,,n,l,r,k);
// cout<<" size "<<q.size()<<endl;
num=;
while(x&&!q.empty()){
po now=q.top();q.pop();
// now.op();
if(now.v>=k) break;
mem[++num]=now.v;
if(now.l<=now.p-){
// cout<<" findl "<<endl;
pii lp=query(,,n,now.l,now.p-);
// cout<<" endq "<<endl;
q.push(po(lp.se,lp.fi,now.l,now.p-));
// cout<<" enl "<<endl;
}
if(now.p+<=now.r){
// cout<<" findr "<<endl;
pii lp=query(,,n,now.p+,now.r);
q.push(po(lp.se,lp.fi,now.p+,now.r));
// cout<<" enr "<<endl;
}
--x;
}
if(x){
puts("-1");
}else{
prt(mem,,num);
}
}
}
return ;
} }
signed main(){
// freopen("data.in","r",stdin);
// freopen("my.out","w",stdout);
Miracle::main();
return ;
} /*
Author: *Miracle*
*/

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

  1. LOJ504「LibreOJ β Round」ZQC 的手办

    https://loj.ac/problem/504 题解 对于区间取\(\max\),这个比较好办,直接在线段树上打标记就行了. 如果让我们弹出前\(n\)个数,我们可以用类似超级钢琴的思想,队列中 ...

  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. python web自动化测试框架搭建(功能&接口)——接口公共方法

    接口公共方法有:数据引擎.http引擎.Excel引擎 1.数据引擎:获取用例.结果检查.结果统计 # -*- coding:utf-8 -*- from XlsEngine import XlsEn ...

  2. 【NOIP2017】列队【可持久化线段树】

    题目链接 题目描述 Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×mn×m名学生,方阵的行数为 n ...

  3. 全文搜索 ElasticSearch

    今天突然想了解一下ES,看看有什么优势,能不能用在项目中. 说到ES就不得不了解它的底层技术-全文检索 Ref: 全文检索的基本原理 https://blog.csdn.net/wangmaohong ...

  4. telnet批量检测端口状态(linux)

    批量检测端口通信: 准备文件树状图 telnet.sh 脚本内容如下: 文件说明 telnet_alive.txt  : 活动的端口 telnet_die.txt    :  离线的端口 telnet ...

  5. ELK日志分析系统之logstash7.x最新版安装与配置

    2 .Logstash的简介 2.1 logstash 介绍 LogStash由JRuby语言编写,基于消息(message-based)的简单架构,并运行在Java虚拟机(JVM)上.不同于分离的代 ...

  6. securecrt(CRT)导入会话

    securecrt是个非常流行的远程管理维护工具,支持fssh.ssh2.telnet等多种协议,也支持中文.设备管理多了,自行手工添加也是很累的活.偷下懒,从别人那复制下文件,倒入到自己的secur ...

  7. mybatis输出映射总结

    使用resultType作为输出映射 只有查询出来的列名和pojo中的属性名一致时,才会映射成功, 如果不一致,可以使用resultMap最为输出类型 不管是输出单个对象还是列表(list中包括poj ...

  8. 关于分布式唯一ID,snowflake的一些思考及改进(完美解决时钟回拨问题)

    1.写唯一ID生成器的原由 在阅读工程源码的时候,发现有一个工具职责生成一个消息ID,方便进行全链路的查询,实现方式特别简单,核心源码不过两行,根据时间戳以及随机数生成一个ID,这种算法ID在分布式系 ...

  9. linux的各种安装配置和编译首页

    VMware与Centos系统安装 https://www.cnblogs.com/LLBFWH/articles/10991478.html centos7安装python3 以及tab补全功能 h ...

  10. JS的video在手机上有些手机能播放,而有些不能原因

    一,一开始我video是这样写的,直接给地址,然后有很多手机却不能播放,或者说卡在一开始的页面,是什么原因呢? <video id='video' > <source src='xx ...