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」回转寿司相关推荐

  1. 【题解】「JOISC 2016 Day 3」回转寿司

    想一下传送带 (233) 我记得我和 lh 说了可以对于一个整块把一堆操作放在一起处理 暴力匹配是 O(nq)O(nq)O(nq) 的. 但是如果加一个优先队列呢? 那你就可以在 O(BlogQi)O ...

  2. 「JOISC 2018 Day 3」比太郎的聚会

    「JOISC 2018 Day 3」比太郎的聚会 题意: ​ 给你一个\(DAG\),若干组询问,每次给出一个终点和若干个点,问从给出点以外的点出发,到达终点的最长路.(\(|V|\leq 1e5 | ...

  3. 「6月雅礼集训 2017 Day7」回转寿司

    [题目大意] 给一个n个数的序列,q次操作,每次选择区间$[l,r]$,给出数p,对于区间$[l,r]$的每个数$x$,做如下操作: 如果$x > p$,就交换$x$和$p$.求每次操作后$p$ ...

  4. LOJ#2833 「JOISC 2018 Day 1」帐篷 dp

    题目描述 译自 JOISC 2018 Day1 T3「テント / Tents」 JOI 君经营着一座露营地.露营地被划分为 H 行 W 列的矩阵,各行平行于东西方向,而各列平行于南北方向.从北向南数第 ...

  5. LOJ #2838. 「JOISC 2018 Day 3」比太郎的聚会 根号分治

    这道题的数据范围中有两个需要注意到的点: 1. 边都是由编号小的点连向编号大的点. 2. 总点数只有 $10^5$ 个. 所以我们可以考虑采取根号分治的做法: 对于点数大于 $\sqrt n$ 的部分 ...

  6. [LOJ]#2838. 「JOISC 2018 Day 3」比太郎的聚会 根号分治

    Solution 以后不会做题还是要考虑根号分治啊-- 对于给出点数≥n\ge\sqrt n≥n​,直接O(n)O(n)O(n)DP: 对于给出点数<n<\sqrt n<n​,可以预 ...

  7. 「JOISC 2017 Day 3」自然公园 题解

    因为感觉网上题解很少,所以想来写一点感性+理性混合的题解qwq 而且犯了很多弱智错误) 考虑我们可以以以下形式确定每一条边: 我们维护一个包含0号节点的连通块 每次挑选一个点 x x x,满足 x x ...

  8. 「JOISC 2020 Day4」治疗计划(线段树+dijkstra最短路)

    「JOISC 2020 Day4」治疗计划 description solution 设dpi:1−Ridp_i:1-R_idpi​:1−Ri​ 都能被救治成功的最小花费 两个治疗方案[Li,Ri], ...

  9. 【LOJ】#3030. 「JOISC 2019 Day1」考试

    LOJ#3030. 「JOISC 2019 Day1」考试 看起来求一个奇怪图形(两条和坐标轴平行的线被切掉了一个角)内包括的点个数 too naive! 首先熟练的转化求不被这个图形包含的个数 -- ...

最新文章

  1. php配置mongodb扩展、安装mongodb服务教程
  2. LeetCode 76. Minimum Window Substring / 567. Permutation in String
  3. Oracle的SQL语句
  4. WiFi已攻占世界 芯片原厂、模组方案商盘点
  5. python学习之wxPython
  6. 目前计算机应用最广泛的区域是,自考《计算机应用基础》试题练习(一)
  7. 芝麻HTTP: Python爬虫利器之PyQuery的用法
  8. 好程序员分享使用JavaScript正则表达式如何去掉双引号
  9. 安全编码最佳实践:PHP及编程语言安全
  10. Android动画效果
  11. centos 6.6 mysql5.7_centos6.6 下安装mysql5.7
  12. cricheditview实现语法高亮和行号_Markdown语法详解及工具介绍
  13. 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务(老罗学习笔记5)...
  14. AOJ-754 数根
  15. Atitit.iso格式蓝光 BDMV 结构说明
  16. 网页嵌入暴风影音播放插件
  17. iapp软件库源码分享
  18. 注册表知识和技巧大全
  19. 关于防火墙DMZ区的使用和防火墙的DMZ区域规则的配置
  20. iPhone6和iPhone6Plus的适配

热门文章

  1. mxnet安装及NDArray初体验
  2. 自制Flash FLV视频播放器
  3. Linux I/O多路复用
  4. cocoapods 终极方案
  5. loadrunner中变量和参数之间的转化实例
  6. oracle系统级别启动数据库
  7. ASP.NET MVC 3拥抱动态类型,徐汇区网站设计
  8. [Flash开发笔记] 关于Flash中的ASO文件
  9. [力扣] 304. 二维区域和检索 - 矩阵不可变
  10. CCS5.5 中报错 Does not match the target type,not loaded 的一种情况