样例1输入: 
6 7
8 6 7 4 5 9
2 4 5
4 1 4
6 2 7
1 5 2
3 4 8
4 3 1
3 1 3
样例1输出:
7
9
8
7
8
6

样例1每次提供完新寿司后,顾客拥有的寿司价格依次为:
1.8 5 6 4 5 9
2.8 5 6 4 4 5
3.7 5 6 4 4 5
4.2 5 6 4 4 5
5.2 5 6 4 4 5
6.2 5 5 1 4 4

7.2 5 3 1 4 4

样例2输入:
4 2
5 2 4 7
1 4 3
1 4 1
样例2输出:
7
5
 
样例3输入:
10 10
19 5 8 17 14 3 9 10 7 6
1 8 4
7 3 2
5 9 10
4 8 3
10 3 6
8 7 4
6 6 3
2 9 12
6 3 7
9 6 3
样例3输出:
19
10
14
17
8
10
3
12
7

9

n<=40w,q<=2.5w,时限4s

很有意思的一道题。区间问题除了线段树等数据结构之外,一般用分块和莫队解决,而这道题有在线操作的意味,因此后者pass~

考虑分块,显然,每一次进入区间后,寿司的数量是不会变的,而且,寿司滚出这个区间之后显然是这段区间+新寿司中的最大值,因此我们可以用大根堆来维护每一个块的最大值,那么每一个块滚出寿司最大值之后,最后滚出的寿司必然也是最大值。

整块搞好了,那么如何处理散块呢?只有散块我们需要具体的值,所以我们可以像线段树一样向块打标记,等到成为散块处理的时候再更新。因为是按顺序滚的,而且每个人都会选择最小值,所以我们用小根堆维护。

至此,小根堆+大根堆+分块完美解决,时间复杂度q√nlogn

……值得注意的是,直接用stl会炸,因此我们需要一些优化~详见代码

#include<bits/stdc++.h>
using namespace std;
const int N = 4e5+10,M = 25010,Maxsiz = 637;
#define Inc(i,L,r) for(register int i=(L);i<=(r);++i)
int n,Q,a[N];
int siz,bl[N];
vector<int>vec[Maxsiz];//记录修改操作
priority_queue<int>Max[Maxsiz];//大根堆
inline void construct(int idx){Max[idx]=priority_queue<int>(a+(idx-1)*siz+1,a+min(idx*siz,n)+1);//重构操作就是重新把一段区间塞进去,要比单纯的push()pop()快?
}
inline void init(){scanf("%d%d",&n,&Q);Inc(i,1,n)scanf("%d",&a[i]);siz=sqrt(n);Inc(i,1,n)bl[i]=(i-1)/siz+1;Inc(i,1,n)Max[bl[i]].push(a[i]);//初始化块的最大值
}
inline void update(int idx){//我们注意到,每次只会流动一个,是不是和线段树的标记下传很像?if(vec[idx].empty())return ;priority_queue<int,vector<int>,greater<int> >Min(vec[idx].begin(),vec[idx].end());Inc(i,(idx-1)*siz+1,min(idx*siz,n)){int HeapTop=Min.top();if(a[i]>HeapTop)Min.pop(),Min.push(a[i]),a[i]=HeapTop;}construct(idx);vec[idx].clear();
}
inline int Query(int L,int r,int k){int ret=k;if(bl[r]-bl[L]<=1){update(bl[L]);//只有处理散块的时候,我们才更新 if(bl[r]^bl[L])update(bl[r]);Inc(i,L,r)if(a[i]>ret)swap(a[i],ret);construct(bl[L]);if(bl[r]^bl[L])construct(bl[r]);}else {update(bl[L]);Inc(i,L,bl[L]*siz)if(a[i]>ret)swap(a[i],ret);construct(bl[L]);Inc(i,bl[L]+1,bl[r]-1){ vec[i].push_back(ret);//我们假装把寿司扔进这个块里让它滚一遍int tmp=ret;Max[i].push(tmp);ret=Max[i].top();//最大的会滚出来 Max[i].pop();}update(bl[r]);Inc(i,(bl[r]-1)*siz+1,r)if(a[i]>ret)swap(a[i],ret);construct(bl[r]);}return ret;
}
inline void solv(){while(Q--){int L,r,k;scanf("%d%d%d",&L,&r,&k);if(L<=r)cout<<Query(L,r,k)<<"\n";else cout<<Query(1,r,Query(L,n,k))<<'\n';}
}
int main(){init();solv();return 0;
}

回转寿司——有趣的分块相关推荐

  1. android消息池,回转寿司你一定吃过!——Android消息机制(构造)

    消息机制的故事寿司陈放在寿司碟上,寿司碟按先后顺序被排成队列送上传送带.传送带被启动后,寿司挨个呈现到你面前,你有三种享用寿司的方法. 将Android概念带入后,就变成了Android消息机制的故事 ...

  2. (线段树)P5459 [BJOI2016]回转寿司

    P5459 [BJOI2016]回转寿司 添加链接描述https://www.luogu.com.cn/problem/P5459 思路:题目意思就是求出有多少个区间和在L~R范围内,这符合线段树的区 ...

  3. bzoj 4627: [BeiJing2016]回转寿司 -- 权值线段树

    4627: [BeiJing2016]回转寿司 Time Limit: 10 Sec  Memory Limit: 256 MB Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店. ...

  4. BZOJ4627 回转寿司 值域线段树

    Problem Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 司带给小Z的味觉感受是不一样的,我们定义小Z对每盘寿司都 ...

  5. bzoj 4627 回转寿司(权值线段树)

    回转寿司 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 司带给小Z的味觉感受是不一样的,我们定义小Z对每盘寿司都有一个 ...

  6. K - 回转寿司(值域段数(板题) + 动态开点)

    回转寿司 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 司带给小Z的味觉感受是不一样的,我们定义小Z对每盘寿司都有一个 ...

  7. Bzoj4627 [BeiJing2016]回转寿司

    Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 329  Solved: 149 [Submit][Status][Discuss] Descript ...

  8. bzoj4627[BeiJing2016]回转寿司

    bzoj4627[BeiJing2016]回转寿司 题意: 求在一个序列中和在区间[l,r]中的连续子序列的个数.序列大小≤100000,序列元素可以为负数. 题解: 题目要求这个:l<=sum ...

  9. BZOJ 4627: [BeiJing2016]回转寿司 cdq

    4627: [BeiJing2016]回转寿司 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 624  Solved: 273 [Submit][S ...

最新文章

  1. mockjs针对value生成随机数值(随机字符串,数值,日期,url,图片地址,email,ip等)
  2. linux 内核 linux kernel travel
  3. 已知向量坐标求三角形面积
  4. hdu 2072 单词数
  5. 设计模式------观察者模式
  6. 求最大公约数问题(信息学奥赛一本通-T1207)
  7. centos下mysql 命令,CentOS下mysql 常用命令
  8. 从此,我就踏入IT行业拉
  9. php7 opcode,php7最小化安装 vld扩展安装并查看php代码的opcode ast测试
  10. 【考试记录】20181003
  11. uniapp实现头像上传
  12. 开关电源中的电感电容
  13. it,GitHub与GitLab的区别
  14. SRGAN-超分辨率图像复原
  15. 电脑的学名为电子计算机
  16. bat实现ftp上传文件
  17. 云的新出路迷你云?轻松搭建私有云平台 转载7
  18. 电脑开机时网络连接一直转圈,出现红叉
  19. AC/DC电源的设计原理
  20. 三维重建 | 关键技术及建模流程综述「AI核心算法」

热门文章

  1. 【Web技术】1005- 关于 JS 与 CSS 是否阻塞 DOM 的渲染和解析
  2. 利用EL表达式替换回车符
  3. SEO没有效果,你是否浅尝辄止了?
  4. PDF编辑器怎么使用?PDF编辑器的操作方法
  5. recaptcha java_谷歌recaptcha验证码java解决方案
  6. 6-10 找出大于num的最小素数 (10 分)
  7. 【厚积薄发】FairyGUI使用经验分享
  8. python rgb2gray_Python--图像处理(2)
  9. LoRa Server@Windows:一键安装
  10. java从github下载项目_在github下载的java项目通过idea打开(全流程图文,傻瓜式)