「JOISC 2016 Day 3」回转寿司
https://loj.ac/problem/2736
题解
挺有意思的题。
考虑这种操作不好直接维护,还有时限比较长,所以考虑分块。
考虑一个操作对整个块的影响,无非就是可能把最大的拿走,再把新的元素插进去。
对于散块我们可以重构,那么对于整块我们也可以快速查询。
现在的问题就是对于一个整块,我们打上了一堆标记,现在如何快速下放标记。
考虑到我们只需要知道最终的结果是什么,我们可以开一个小根堆存所有的标记,然后从左到右模拟就行了。
代码
#include<bits/stdc++.h>
#define N 400005
#define M 1002
using namespace std;
typedef long long ll;
int n,q,n1,a[N],be[N];
priority_queue<int>blo[M];
priority_queue<int,vector<int>,greater<int> >c[M];
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;
}
inline void rebuild(int x){if(c[x].empty())return;int l=(x-1)*n1+1,r=min(n,x*n1);for(int i=l;i<=r;++i){if(a[i]>c[x].top()){int xx=a[i];a[i]=c[x].top();c[x].pop();c[x].push(xx);}}while(!c[x].empty())c[x].pop();
}
inline int upd(int x,int l,int r,int val){rebuild(x);for(int i=l;i<=r;++i)if(a[i]>val)swap(a[i],val);while(!blo[x].empty())blo[x].pop();for(int i=(x-1)*n1+1;i<=min(n,x*n1);++i)blo[x].push(a[i]);return val;
}
inline int solve(int l,int r,int val){int be1=be[l],be2=be[r];if(be1==be2)return upd(be1,l,r,val);else{val=upd(be1,l,be1*n1,val);for(int i=be1+1;i<be2;++i){if(blo[i].top()>val){int xx=blo[i].top();blo[i].pop();blo[i].push(val);c[i].push(val);val=xx;}}return upd(be2,(be2-1)*n1+1,r,val);}
}
int main(){n=rd();q=rd();for(int i=1;i<=n;++i)a[i]=rd();n1=sqrt(n);for(int i=1;i<=n;++i){be[i]=(i-1)/n1+1;blo[be[i]].push(a[i]);}int l,r,x;while(q--){l=rd();r=rd();x=rd();if(l<=r)printf("%d\n",solve(l,r,x));else printf("%d\n",solve(1,r,solve(l,n,x)));}return 0;
}
转载于:https://www.cnblogs.com/ZH-comld/p/11093976.html
「JOISC 2016 Day 3」回转寿司相关推荐
- 【题解】「JOISC 2016 Day 3」回转寿司
想一下传送带 (233) 我记得我和 lh 说了可以对于一个整块把一堆操作放在一起处理 暴力匹配是 O(nq)O(nq)O(nq) 的. 但是如果加一个优先队列呢? 那你就可以在 O(BlogQi)O ...
- 「JOISC 2018 Day 3」比太郎的聚会
「JOISC 2018 Day 3」比太郎的聚会 题意: 给你一个\(DAG\),若干组询问,每次给出一个终点和若干个点,问从给出点以外的点出发,到达终点的最长路.(\(|V|\leq 1e5 | ...
- 「6月雅礼集训 2017 Day7」回转寿司
[题目大意] 给一个n个数的序列,q次操作,每次选择区间$[l,r]$,给出数p,对于区间$[l,r]$的每个数$x$,做如下操作: 如果$x > p$,就交换$x$和$p$.求每次操作后$p$ ...
- LOJ#2833 「JOISC 2018 Day 1」帐篷 dp
题目描述 译自 JOISC 2018 Day1 T3「テント / Tents」 JOI 君经营着一座露营地.露营地被划分为 H 行 W 列的矩阵,各行平行于东西方向,而各列平行于南北方向.从北向南数第 ...
- LOJ #2838. 「JOISC 2018 Day 3」比太郎的聚会 根号分治
这道题的数据范围中有两个需要注意到的点: 1. 边都是由编号小的点连向编号大的点. 2. 总点数只有 $10^5$ 个. 所以我们可以考虑采取根号分治的做法: 对于点数大于 $\sqrt n$ 的部分 ...
- [LOJ]#2838. 「JOISC 2018 Day 3」比太郎的聚会 根号分治
Solution 以后不会做题还是要考虑根号分治啊-- 对于给出点数≥n\ge\sqrt n≥n,直接O(n)O(n)O(n)DP: 对于给出点数<n<\sqrt n<n,可以预 ...
- 「JOISC 2017 Day 3」自然公园 题解
因为感觉网上题解很少,所以想来写一点感性+理性混合的题解qwq 而且犯了很多弱智错误) 考虑我们可以以以下形式确定每一条边: 我们维护一个包含0号节点的连通块 每次挑选一个点 x x x,满足 x x ...
- 「JOISC 2020 Day4」治疗计划(线段树+dijkstra最短路)
「JOISC 2020 Day4」治疗计划 description solution 设dpi:1−Ridp_i:1-R_idpi:1−Ri 都能被救治成功的最小花费 两个治疗方案[Li,Ri], ...
- 【LOJ】#3030. 「JOISC 2019 Day1」考试
LOJ#3030. 「JOISC 2019 Day1」考试 看起来求一个奇怪图形(两条和坐标轴平行的线被切掉了一个角)内包括的点个数 too naive! 首先熟练的转化求不被这个图形包含的个数 -- ...
最新文章
- php配置mongodb扩展、安装mongodb服务教程
- LeetCode 76. Minimum Window Substring / 567. Permutation in String
- Oracle的SQL语句
- WiFi已攻占世界 芯片原厂、模组方案商盘点
- python学习之wxPython
- 目前计算机应用最广泛的区域是,自考《计算机应用基础》试题练习(一)
- 芝麻HTTP: Python爬虫利器之PyQuery的用法
- 好程序员分享使用JavaScript正则表达式如何去掉双引号
- 安全编码最佳实践:PHP及编程语言安全
- Android动画效果
- centos 6.6 mysql5.7_centos6.6 下安装mysql5.7
- cricheditview实现语法高亮和行号_Markdown语法详解及工具介绍
- 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务(老罗学习笔记5)...
- AOJ-754 数根
- Atitit.iso格式蓝光 BDMV 结构说明
- 网页嵌入暴风影音播放插件
- iapp软件库源码分享
- 注册表知识和技巧大全
- 关于防火墙DMZ区的使用和防火墙的DMZ区域规则的配置
- iPhone6和iPhone6Plus的适配
热门文章
- mxnet安装及NDArray初体验
- 自制Flash FLV视频播放器
- Linux I/O多路复用
- cocoapods 终极方案
- loadrunner中变量和参数之间的转化实例
- oracle系统级别启动数据库
- ASP.NET MVC 3拥抱动态类型,徐汇区网站设计
- [Flash开发笔记] 关于Flash中的ASO文件
- [力扣] 304. 二维区域和检索 - 矩阵不可变
- CCS5.5 中报错 Does not match the target type,not loaded 的一种情况