LOJ 2736 「JOISC 2016 Day 3」回转寿司 ——堆+分块思路
题目:https://loj.ac/problem/2736
如果每个询问都是 l = 1 , r = n ,那么每次输出序列的 n 个数与本次操作的数的最大值即可。可以用堆维护。
不同区间的询问,可以分块!
考虑如果 l = 1 , r = n ,怎么知道最后的序列每个位置是什么。
可以这样:把所有操作的数字都放进小根堆里,依次遍历每个位置,如果堆顶比该位置的值小,就把该位置的值换成堆顶的值,堆里删掉原堆顶,加入该位置原来的值。
分块的话,每个块开两个大根堆,一个 yq 维护原序列的数字,一个 q 维护新加入的数字,再维护住 a[ ] 表示上次更新之后每个位置的值。
对整块操作一个数 x ,可以知道 yq 和 q 两个堆总体的最大值会被删掉(如果这个最大值是 > x 的)。于是在最大值所在的堆里删掉最大值,把 x 放进 q 里。
最后想知道这块每个位置的值,就拿着 q 在各位置走一遍,一边换一番。所以之所以要开一个 yq ,是为了体现 “原来在自己后面的比自己小的值不能挪到自己位置上” 。
每个询问,如果是在不整的块上,就先把那个块按上面的步骤做一遍,那么 a[ ] 维护的就是真实值了;做完把 q 清空,然后暴力枚举位置把 a[ ] 更新,再把 yq 更新即可。
经过一个零散块或者整块之后,操作的 x 可能改变;把改变后的 x 当作输入给下一个块就行了。
复杂度是 \( n \sqrt{n} logn \) ,9 s 还是可以的。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
int Mx(int a,int b){return a>b?a:b;}
const int N=4e5+,M=;
int n,m,a[N],bs,bh[N],L[M],R[M];
priority_queue<int> q[M],yq[M];
priority_queue<int,vector<int>,greater<int> > tq[M];
int bl(int l,int r,int x)
{
int k=bh[l];
while(tq[k].size())tq[k].pop();
while(q[k].size())tq[k].push(q[k].top()),q[k].pop();
if(tq[k].size())//
{
for(int i=L[k];i<=R[k];i++)
{
int d=tq[k].top(); if(d>=a[i])continue;
tq[k].pop(); tq[k].push(a[i]); a[i]=d;
}
}
for(int i=l;i<=r;i++) if(x<a[i])swap(a[i],x);
while(yq[k].size())yq[k].pop();
for(int i=L[k];i<=R[k];i++)yq[k].push(a[i]);
return x;
}
int solve(int l,int r,int x)
{
if(bh[l]==bh[r])return bl(l,r,x);
x=bl(l,R[bh[l]],x); int k;
for(k=bh[l]+;k<=m&&R[k]<=r;k++)//k<=m
{
if(yq[k].size()&&q[k].size())
{
int d0=q[k].top(), d1=yq[k].top();
if(Mx(d0,d1)<=x)continue;
if(d0>d1)
{q[k].pop(); q[k].push(x); x=d0;}
else
{yq[k].pop(); q[k].push(x); x=d1;}//q.push
}
else if(yq[k].size())
{
int d=yq[k].top();
if(d>x){yq[k].pop();q[k].push(x);x=d;}
}
else if(q[k].size())
{
int d=q[k].top();
if(d>x){q[k].pop();q[k].push(x);x=d;}
}
}
if(k<=m&&R[k-]<r)x=bl(L[k],r,x);//k<=m//R[k-1] not R[k]
return x;
}
int main()
{
n=rdn(); int Q=rdn(); bs=sqrt(n);
for(int i=;i<=n;i++)a[i]=rdn();
L[]=; m=;
for(int i=,j=;i<=n;i++)
{
j++; if(j>bs){R[m]=i-;m++;L[m]=i;j=;}
bh[i]=m; yq[m].push(a[i]);
}
R[m]=n;
int l,r,x;
while(Q--)
{
l=rdn();r=rdn();x=rdn();
if(l<=r)x=solve(l,r,x);
else x=solve(l,n,x), x=solve(,r,x);
printf("%d\n",x);
}
return ;
}
LOJ 2736 「JOISC 2016 Day 3」回转寿司 ——堆+分块思路的更多相关文章
- 「JOISC 2016 Day 3」回转寿司
https://loj.ac/problem/2736 题解 挺有意思的题. 考虑这种操作不好直接维护,还有时限比较长,所以考虑分块. 考虑一个操作对整个块的影响,无非就是可能把最大的拿走,再把新的元 ...
- Loj #2731 「JOISC 2016 Day 1」棋盘游戏
Loj 2731 「JOISC 2016 Day 1」棋盘游戏 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少 ...
- LOJ 2737 「JOISC 2016 Day 3」电报 ——思路+基环树DP
题目:https://loj.ac/problem/2737 相连的关系形成若干环 / 内向基环树 .如果不是只有一个环的话,就得断开一些边使得图变成若干链.边的边权是以它为出边的点的点权. 基环树的 ...
- LOJ #2731. 「JOISC 2016 Day 1」棋盘游戏(dp)
题意 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少有一个棋子,也至少有一个空位. 游戏的目标是:在还没有放棋 ...
- [LOJ#2732] 「JOISC 2016 Day 2」雇佣计划
参考博文 (不过个人感觉我讲的稍微更清楚一点) 题目就是让我们求图中满足数值大于等于B的连通块数量 然后我们可以尝试转换为求连通块两端所产生的“谷”的数量,显然一个连通块对谷可以贡献2的答案,最终答案 ...
- 「JOISC 2016 Day 1」棋盘游戏
「JOISC 2016 Day 1」棋盘游戏 先判无解:第1,3行有连续的空格或四个角有空格. 然后可以发现有解的情况第1,3行可以在任意时间摆放. 对于某一列,若第2行放有棋子,那么显然可以把棋盘分 ...
- loj 2392「JOISC 2017 Day 1」烟花棒
loj 答案显然满足二分性,先二分一个速度\(v\) 然后显然所有没有点火的都会往中间点火的人方向走,并且如果两个人相遇不会马上点火,要等到火快熄灭的时候才点火,所以这两个人之后应该在一起行动.另外有 ...
- loj2734「JOISC 2016 Day 2」女装大佬 || 洛谷P3615 如厕计划
loj2734 洛谷P3615 http://218.5.5.242:9021/problem/185 不会做... 题解(来自ditoly): 这一步更详细的解释(来自kkksc03): 还是从后面 ...
- [LOJ #2833]「JOISC 2018 Day 1」帐篷
题目大意:有一个$n\times m$的网格图,若一个人的同一行或同一列有人,他就必须面向那个人,若都无人,就可以任意一个方向.若一个人无法确定方向,则方案不合法,问不同的方案数.$n,m\leqsl ...
随机推荐
- Android:AndroidManifest.xm中xmlns的作用
有了它,你就可以alt+/作为提示,提示你输入什么,不该输入什么,什么是对的,什么是错的,也可以理解为语法文件.或者语法判断器什么的 这个主要作用是在运行的时候那些控件的属性都是通过它来识别的,如果上 ...
- global $GLOBALS 区别
PHP代码 复制代码 代码如下: <?php // 例子1 function test_global() { global $var1, $var2; $var2 =& $var1; } ...
- vuejs 1.x与2.x差异
1.x与2.x区别 v-for列表查询中 当前下标:$index --> index 1.x 用法 v-for="v in myData" =>$index获取下标 / ...
- JAVA_全局配置文件(配置网址,url等等)_第二种方式
@ComponentScan主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中 1.application-local.yml 配置文件 2.Service 3. ...
- Linux不在显示器上方总是显示企鹅
/********************************************************************************* * Linux不在显示器上方总是显 ...
- 【err】VIDEOIO ERROR: V4L: index 0 is not correct!Unable to connect to camera
前言 新到手一块板子,程序编译成功之后,运行出现错误,不能连接到摄像头. 问题 VIDEOIO ERROR: V4L: index is not correct! Unable to connect ...
- seo:网站地图提交
对于SEO,网站地图的好处就更多了: 1.为搜索引擎蜘蛛提供可以浏览整个网站的链接简单的体现出网站的整体框架出来给搜索引擎看: 2.为搜索引擎蜘蛛提供一些链接,指向动态页面或者采用其他方法比较难以到达 ...
- 图片上传并回显Ajax异步篇
图片上传并回显Ajax异步篇 图片如何无刷新的上传到服务器呢?继前两篇文章后,我们来实战一下如何无刷新的异步上传图片,我们还是先看一下效果 在实战前呢,我们需要做些准备工作.比如说,了解一下FormD ...
- POJ 2751:Seek the Name, Seek the Fame(Hash)
Seek the Name, Seek the Fame Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 24077 Ac ...
- window cmd-常用命令
1.常用命令 dir 文件列表 cd 改变目录md 创建目录 rd 删除目录 type 显示文件内容 fc 比较目录 attrib 修改文件属性 copy 复制文件 del 删除文件 ren 文件改名 ...