Loj 504 ZQC的手办
Loj 504 ZQC的手办
- 用线段树维护,每个节点存储区间内最小值 \(val\) 以及最小值出现的一个位置 \(pos\) .
- 对操作 \(1\) ,只需打标记即可,因为我们不维护其他的信息(如区间和),只对最小值修改,容易完成.
- 对操作 \(2\) ,用一个四元组 \((l,r,v,pos)\) 以 \(v\) 形成的小根堆来查询区间前 \(x\) 小的值,每次取出堆顶,加入答案,再不断对线段树询问 \(p\) 两侧的 \((val,pos)\),插入堆中,重复做 \(x\) 次即可.注意特判元素不足或堆顶 \(v\geq x\) 的无解情况.
- 总时间复杂度为 \(O(logn\cdot (n+\sum x))\).
以前好像做过一道类似的题?总之用线段树同时维护最小值即其位置是一种经典的套路做法.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pii pair<int,int>
#define root Tree[o]
#define lson Tree[o<<1]
#define rson Tree[o<<1|1]
#define inf (1e9)+7
inline int read()
{
int x=0;
bool pos=1;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
pos=0;
for(;isdigit(ch);ch=getchar())
x=x*10+ch-'0';
return pos?x:-x;
}
const int MAXN=5e5+10;
int n,m;
struct node{
int l,r;
int val,pos;
int tag;
node()
{
tag=0;
}
}Tree[MAXN<<2];
struct data{
int l,r,v,pos;
data(int x,int y,int c,int d)
{
l=x,r=y,v=c,pos=d;
}
bool operator < (const data &rhs) const
{
return v>rhs.v;
}
};
priority_queue<data> q;
vector<int> ans;
int a[MAXN];
void pushup(int o)
{
if(lson.val<rson.val)
root.pos=lson.pos;
else
root.pos=rson.pos;
root.val=min(lson.val,rson.val);
}
void Modifiy(int o,int v)
{
root.val=max(root.val,v);
root.tag=v;
}
void pushdown(int o)
{
if(root.tag)
{
Modifiy(o<<1,root.tag);
Modifiy(o<<1|1,root.tag);
root.tag=0;
}
}
void BuildTree(int o,int l,int r)
{
root.l=l,root.r=r;
if(l==r)
{
root.pos=l;
root.val=a[l];
return;
}
int mid=(l+r)>>1;
BuildTree(o<<1,l,mid);
BuildTree(o<<1|1,mid+1,r);
pushup(o);
}
void update(int o,int L,int R,int k)
{
int l=root.l,r=root.r;
if(l>R || r<L)
return;
if(L<=l && r<=R)
{
Modifiy(o,k);
return;
}
pushdown(o);
int mid=(l+r)>>1;
if(L<=mid)
update(o<<1,L,R,k);
if(R>mid)
update(o<<1|1,L,R,k);
pushup(o);
}
pii query(int o,int L,int R)//min,pos
{
int l=root.l,r=root.r;
pii res=mp(inf,-1);
if(l>R || r<L)
return res;
if(L<=l && r<=R)
return mp(root.val,root.pos);
pushdown(o);
int mid=(l+r)>>1;
if(L<=mid)
res=min(res,query(o<<1,L,R));
if(R>mid)
res=min(res,query(o<<1|1,L,R));
return res;
}
int main()
{
n=read();
for(int i=1;i<=n;++i)
a[i]=read();
BuildTree(1,1,n);
m=read();
while(m--)
{
int op=read(),l=read(),r=read(),k=read();
if(op==1)
update(1,l,r,k);
else
{
int x=read();
if(r-l+1<x)
{
puts("-1");
continue;
}
while(!q.empty())
q.pop();
ans.clear();
pii u=query(1,l,r);
q.push(data(l,r,u.first,u.second));
for(int i=1;i<=x;++i)
{
data u=q.top();
q.pop();
if(u.v<k)
ans.push_back(u.v);
else
break;
if(u.l<u.pos)
{
pii w=query(1,u.l,u.pos-1);
q.push(data(u.l,u.pos-1,w.first,w.second));
}
if(u.r>u.pos)
{
pii w=query(1,u.pos+1,u.r);
q.push(data(u.pos+1,u.r,w.first,w.second));
}
}
int siz=ans.size();
if(siz<x)
puts("-1");
else
{
for(int i=0;i<siz;++i)
printf("%d ",ans[i]);
puts("");
}
}
}
return 0;
}
Loj 504 ZQC的手办的更多相关文章
- LOJ504「LibreOJ β Round」ZQC 的手办
https://loj.ac/problem/504 题解 对于区间取\(\max\),这个比较好办,直接在线段树上打标记就行了. 如果让我们弹出前\(n\)个数,我们可以用类似超级钢琴的思想,队列中 ...
- 「LibreOJ β Round」ZQC 的手办
https://loj.ac/problem/504 一类套路题. 首先这个玩意可以两个logn树套树做.... naive地,把区间内的所有数拿出来放进堆里.不断取出. 太多了. 所以开始只保留那初 ...
- 【LOJbeta round1】ZQC的手办
NOI2012-超级钢琴的升级版. 用线段树维护最小值及其出现位置,接下来就跟超级钢琴一个做法了. #include<bits/stdc++.h> #define N 500010 #de ...
- LOJ#505. 「LibreOJ β Round」ZQC 的游戏(最大流)
题意 题目链接 Sol 首先把第一个人能吃掉的食物删掉 然后对每个人预处理出能吃到的食物,直接限流跑最大流就行了 判断一下最后的最大流是否等于重量和 注意一个非常恶心的地方是需要把除1外所有人都吃不到 ...
- LOJ #559. 「LibreOJ Round #9」ZQC 的迷宫
一道ZZ结论题,主要是来写一写交互题的. 我们要先知道一句话: 扶着墙是肯定可以走出简单迷宫的. 然后我们冷静分析问题.若这个迷宫是\(n\times m\)的,那么最多有\(2mn+n+m\)个墙壁 ...
- LOJ#503. 「LibreOJ β Round」ZQC 的课堂(容斥+FHQTreap)
题面 传送门 题解 首先\(x\)和\(y\)两维互相独立,可以分开考虑,我们以\(x\)为例 我们把\(x\)做个前缀和,那么就是问有多少\(i\)满足\(s_is_{i-1}<0\),其中\ ...
- loj#501 「LibreOJ β Round」ZQC 的树列
分析 代码(我的代码是瞎jb水过去的) #include<bits/stdc++.h> using namespace std; #define li long long li a[]; ...
- loj#500 「LibreOJ β Round」ZQC 的拼图
分析 二分倍数 然后考虑dp[i][j]表示选到第i个x轴覆盖到j的情况y轴最多覆盖多少 贡献柿子可以画图然后相似三角形得到 代码 #include<bits/stdc++.h> usin ...
- [LOJ#500]「LibreOJ β Round」ZQC的拼图
题目 点这里看题目. 分析 首先不难发现答案具有单调性,因此可以二分答案.答案上限为\(V=2m\times \max\{a_i, b_i\}\). 考虑如何去判断当前的答案.设这个答案为 ...
随机推荐
- 锁(3)-- DB锁
1 前言 数据库大并发操作要考虑死锁和锁的性能问题.看到网上大多语焉不详(尤其更新锁),所以这里做个简明解释,为下面描述方便,这里用T1代表一个数据库执行请求,T2代表另一个请求,也可以理解为T1为一 ...
- Python基础笔记系列十:模块
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 模块 #1.类比于java中的jar包,模块能让你能够有逻辑地组织你的Py ...
- 《用 Python 学微积分》笔记 3
<用 Python 学微积分>原文见参考资料 1. 16.优化 用一个给定边长 4 的正方形来折一个没有盖的纸盒,设纸盒的底部边长为 l,则纸盒的高为 (4-l)/2,那么纸盒的体积为: ...
- C和C#两种方式实现邮件的简单发送
内容为通过两种方式发送邮件--1.C语言发送邮件 2.C#发送邮件 一,C语言进行邮件的发送 C语言发送邮件的步骤的简单解析: 1.创建TCP连接 socket() 2.连接到邮箱服务器 ...
- ANDROID教程目录
html5 如何打包成apk,将H5封装成android应用APK文件的几种方法
- Learning R笔记(一)
基本操作 帮助文档:?函数.演示:demo(函数).参数列表:formals(函数),返回为成对列表pairlist. 用all.equal函数检查浮点数是否相等,容忍度默认为1.5e-8,如果相等返 ...
- spring mvc:练习 @RequestParam(参数绑定到控制器)和@PathVariable(参数绑定到url模板变量)
spring mvc:练习 @RequestParam和@PathVariable @RequestParam: 注解将请求参数绑定到你的控制器方法参数 @PathVariable: 注释将一个方法参 ...
- yii2打印数据属性(字段名)/数据
yii2打印数据属性(字段名)/数据 单条数据: $model = $this->findModel($id);//打印字段名 $array = $model->attributes(); ...
- [转]基于Visual Studio 2010 进行敏捷/Scrum模式开发
http://www.infoq.com/cn/articles/visual-studio-2010-agile-scrum-development 根据Forrester Research今年第二 ...
- SPOJ-CLEANRBT-状压dp
CLEANRBT - Cleaning Robot #dynamic-programming #bfs Here, we want to solve path planning for a mobil ...