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. Unity3D架构之PureMVC

    之前了解过UI实现框架大多是用MVC架构的,才听说有这么一个基于MVC的跨平台开源框架叫PureMVC,前几天用到了做了一下,写一写分析总结官网位置:http://puremvc.org/ PureM ...

  2. 上海站赛后总结&反思

    上海站赛后总结&反思 赛后反思一下,本应该做出3~4题的场,最后只出了2题. 先回顾一下比赛,比赛开始10分钟,队友dy就想出了B题是trie树的模板题,然后让mqy码,第一次交的时候有地方打 ...

  3. HTML表格<tr>行距调整

    CSS文件中: .myTable tr{     display:block; /*将tr设置为块体元素*/     margin-bottom:5px;}

  4. window.location.href后携带参数

    JS文件中: window.location.href后可携带参数,但是不安全,虽然在技术上是可以实现的 1.传参:window.location.href = "RecordCare.as ...

  5. JSP基础--动作标签

    JSP动作标签 1 JSP动作标签概述 动作标签的作用是用来简化Java脚本的! JSP动作标签是JavaWeb内置的动作标签,它们是已经定义好的动作标签,我们可以拿来直接使用. 如果JSP动作标签不 ...

  6. Waiter.js

    var Waiter = function() {     var dfd = [],         doneArr = [],         failArr = [],         slic ...

  7. Java实现红黑树

    转自:http://www.cnblogs.com/skywang12345/p/3624343.html 红黑树的介绍 红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉 ...

  8. [eclipse中使用Git插件] 008 - git操作pull、merge、stash、commit

    写在前面: 看标题其实还有001-007之类,本来准备写详细的类似教程一样的东东,但是懒了且时间有限(以后或许会补吧),所以跳到008,录下主要的操作. 所以本随笔的重点就是[pull+merge+s ...

  9. Uncaught TypeError: Cannot set property onclick' of null

    如果出现以上问题,只需要把<script src="xxx.js"></script> 移动到最后,</body>的前面;

  10. [Bzoj1008][HNOI2008]越狱(组合计数)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1008 组合计数的简单题,可能越狱的方案数等于总方案数-不可能越狱的方案数,则: 总方案数 ...