放一个比赛链接

先考虑打完暴力后 \(k = 1\) 的特殊性质。

当队列容量为 \(1\) 时,队中的人 \(i\) 会被第一个满足 \(i \leq j\) 且 \(b_i \leq a_j\) 的人淘汰,并且队列中的人会变成 \(j\),考虑倍增加速这个过程,令 \(f_{i,j}\) 表示第 \(i\) 个人进队后淘汰过程发生 \(2^j\) 次后队中的人,答案就是 \(\max_{f_{l,i} \leq r}(f_{l,i})\),我们预处理 ST 表二分求出 \(f_{i,0}\) 在递推即可求出 \(f\) 数组,所以总时间是 \(O(n \log n)\) 的。

接着手玩几组数据,发现 \(b_i\) 较大的几个人总是不会被淘汰,这是为什么?

我们发现因为每次假若要淘汰只会淘汰 \(b_i\) 最小的,而区间中 \(b_i\) 前 \(k-1\) 大的人 一定不会成为最小的,所以我们可以确定区间中 \(b_i\) 前 \(k-1\) 大的人一定在队中, 并且不是排名最后的一个人

考虑怎么求最后一个人。

令区间 \(b_i\) 前 \(k-1\) 大的人全部入队时考虑到第 \(x\) 个人,那么我们发现在考虑第 \(x-1\) 个人时,区间 \([l,x-1]\) 中前 \(k-1\) 大一定也在队中,那么第 \(x\) 个人实际上就是淘汰了考虑第 \(x-1\) 个人时队列中最后一个人,因此,区间 \([l,x-1]\) 中第 \(k-1\) 大的人因为不是排名最后的一个人,所以就会被保留在队中。也就是说此时队列中最后一个人是区间 \([l,x-1]\) 中第 \(k-1\) 大!

然后考虑这个人会不会被淘汰,假若被淘汰那么此时问题变成一个与 \(k=1\) 相似的问题,就从淘汰此人的人开始倍增往后面跳。

最后用主席树维护区间,这道题目就解决了。

#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
const int maxn = 5e5+114;
int a[maxn],b[maxn],f[maxn][21];
long long c[maxn];
int st[maxn][21][2];
int lg[maxn];
int n,q;
inline void init(){
for(int i=1;i<=n;i++) st[i][0][0]=a[i],st[i][0][1]=b[i];
for(int j=1;j<=lg[n];j++)
for(int i=1;i+(1<<j)-1<=n;i++)
st[i][j][0]=max(st[i][j-1][0],st[i+(1<<(j-1))][j-1][0]),st[i][j][1]=max(st[i][j-1][1],st[i+(1<<(j-1))][j-1][1]);
}
inline int qmx(int l,int r,int type){
if(l>r) return 0;
int k=lg[r-l+1];
return max(st[l][k][type],st[r-(1<<k)+1][k][type]);
}
inline int ask(int l,int r){
for(int i=20;i>=0;i--){
if(f[l][i]<=r&&f[l][i]!=0){
l=f[l][i];
}
}
return l;
}
struct Node{
int sum,ls,rs;
long long val;
}tr[maxn*22];
int root[maxn],tot;
int g[maxn];
inline void add(int cur,int lst,int lt,int rt,int pos){
tr[cur].sum=tr[lst].sum+1;
tr[cur].val=tr[lst].val+c[g[pos]];
if(lt==rt){
return ;
}
int mid=(lt+rt)>>1;
if(pos<=mid){
tr[cur].rs=tr[lst].rs;
tr[cur].ls=++tot;
add(tr[cur].ls,tr[lst].ls,lt,mid,pos);
}
else{
tr[cur].ls=tr[lst].ls;
tr[cur].rs=++tot;
add(tr[cur].rs,tr[lst].rs,mid+1,rt,pos);
}
}
inline long long query(int ql,int qr,int lt,int rt,int L,int R){
if(ql>qr) return 0;
if(rt<ql||lt>qr){
return 0;
}
if(ql<=lt&&rt<=qr){
return tr[R].val-tr[L].val;
}
int mid=(lt+rt)>>1;
long long res=0;
res+=query(ql,qr,lt,mid,tr[L].ls,tr[R].ls);
res+=query(ql,qr,mid+1,rt,tr[L].rs,tr[R].rs);
return res;
}
inline int kth(int lt,int rt,int L,int R,int k){
if(lt==rt) return lt;
int mid=(lt+rt)>>1;
if((tr[tr[R].rs].sum-tr[tr[L].rs].sum)>=k){
return kth(mid+1,rt,tr[L].rs,tr[R].rs,k);
}
else{
return kth(lt,mid,tr[L].ls,tr[R].ls,k-(tr[tr[R].rs].sum-tr[tr[L].rs].sum));
}
}
inline int ChiFAN(int l,int r,int x){
int L=l,R=r+1;
while(L+1<R){
int mid=(L+R)>>1;
if(qmx(mid,r,1)<x){
R=mid;
}
else{
L=mid;
}
}
return L;
}//第 k-1 个大出现的地方
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
lg[0]=1;
for(int i=1;i<maxn;i++) lg[i]=log2(i);
cin>>n>>q;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++) g[b[i]]=i;
for(int i=1;i<=n;i++) cin>>c[i];
init();
for(int i=1;i<=n;i++){
root[i]=++tot;
add(root[i],root[i-1],1,n,b[i]);
}
for(int i=1;i<=n;i++){
int l=i,r=n;
if(qmx(i+1,n,0)<b[i]){
f[i][0]=n+1;
continue ;
}
while(l+1<r){
int mid=(l+r)>>1;
if(qmx(i+1,mid,0)>=b[i]){
r=mid;
}
else{
l=mid;
}
}
f[i][0]=r;
}
for(int j=1;j<=20;j++){
for(int i=1;i<=n;i++){
f[i][j]=f[f[i][j-1]][j-1];
}
}
while(q--){
int l,r,k;
cin>>l>>r>>k;
if(k==1){
cout<<c[ask(l,r)]<<'\n';
}
else{
int p=g[kth(1,n,root[l-1],root[r],k-1)];
int e=ChiFAN(l,r,b[p]);
int t=g[kth(1,n,root[l-1],root[e-1],k-1)];
if(qmx(e+1,r,0)>=b[t]){
int L=e,R=r;
while(L+1<R){
int mid=(L+R)>>1;
if(qmx(e+1,mid,0)>=b[t]){
R=mid;
}
else{
L=mid;
}
}
t=R;
for(int i=20;i>=0;i--){
if(f[t][i]<=r&&f[t][i]!=0) t=f[t][i];
}
}
cout<<query(b[p],n,1,n,root[l-1],root[r])+c[t]<<'\n';
}
}
}

UNR #7 Day2 T1 火星式选拔题解的更多相关文章

  1. Noip2011 提高组 Day1 T1 铺地毯 + Day2 T1 计算系数

    Day1 T1 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小 ...

  2. Noip2014 提高组 Day1 T1 生活大爆炸版石头剪刀布 + Day2 T1 无线网络发射器选址

    Day1 T1 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升 ...

  3. [火星补锅] 水题大战Vol.2 T1 && luogu P1904 天际线 题解 (线段树)

    前言: 当时考场上并没有想出来...后来也是看了题解才明白 解析: 大家(除了我)都知道,奇点和偶点会成对出现,而出现的前提就是建筑的高度突然发生变化.(这个性质挺重要的,我之前没看出来) 所以就可以 ...

  4. 济南学习 Day2 T1 am

    T1 题意:从1− n中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数 最大可能是多少. 解析: 1.  质因数分解 2.  1->n用质因数指数的相加的形式将1*n累乘起来 3.   ...

  5. 【NOIP2015提高组】Day2 T1 跳石头

    题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不含起点和终 点的岩石).在比赛过程中,选手们将从 ...

  6. noip 2016 day2 t1组合数问题

    题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...

  7. 3730 无线网络发射选址[NOIP 0214 day2 T1]

    3730 无线网络发射选址  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 青铜 Bronze 题解  查看运行结果     题目描述 Description 随着智能手机的日 ...

  8. NOIP2015 DAY2 T1跳石头

    传送门 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块 ...

  9. Noip2016 提高组 Day2 T1 组合数问题

    题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...

  10. T1 找试场 题解

    拖延症又犯了QwQ. 今天上午考试了,按照惯例,我仍然要把我会的所有题的题解写一遍. 1.找试场(way.cpp/in/out) 问题描述 小王同学在坐标系的(0,0)处,但是他找不到考试的试场,于是 ...

随机推荐

  1. fastposter v2.11.0 天花板级的海报生成器

    fastposter v2.11.0 天花板级的海报生成器 fastposter海报生成器是一款快速开发海报的工具.只需上传一张背景图,在对应的位置放上组件(文字.图片.二维.头像)即可生成海报. 点 ...

  2. MindSpore梯度进阶操作

    技术背景 在MindSpore深度学习框架中,我们可以使用mindspore.grad对函数式编程的函数直接计算自动微分,也可以使用mindspore.ops.GradOperation求解Cell类 ...

  3. rocketMQ 文章

    10 DefaultMQPushConsumer 使用示例与注意事项.md (lianglianglee.com) 手动回滚事务: (29条消息) spring 控制事务回滚重要知识点:Transac ...

  4. iis worker process w3wp 进程 占用率100%

    今天电脑特别的卡,我没当回事,但是实在是卡得不行了,我打开任务管理器,发现 iis worker process 进程已经快100%了,我之前在iis上发布了一个webservice,我就把这个网站给 ...

  5. 轻松绕过 Graphql 接口爬取有米有数的商品数据

    轻松绕过 Graphql 接口爬取有米有数的商品数据 有米有数数据的 API 接口,使用的是一种 API 查询语言 graphql.所有的 API 只有一个入口,具体的操作隐藏在请求数据体里面传输. ...

  6. 痞子衡嵌入式:不同J-Link版本对于i.MXRT1170连接复位后处理行为有所不同

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是不同J-Link版本对于i.MXRT1170连接复位后处理行为. 痞子衡之前写过一篇旧文 <i.MXRT1170上用J-Link连 ...

  7. 鸿蒙极速入门(二)-开发准备和HelloWorld

    一.开发准备 本篇博客基于的系统版本:华为官方HarmonyOS版本3.1.OpenHarmony版本4.0Beta 开发语言 ArkTS语言(推荐) JS语言(支持) Java语言(已放弃支持) 从 ...

  8. 行列式求值,从 $n!$ 优化到 $n^3$

    前置知识 \(\sum\) 为累加符号,\(\prod\) 为累乘符号. 上三角矩阵指只有对角线及其右上方有数值其余都是 \(0\) 的矩阵. 如果一个矩阵的对角线全部为 \(1\) 那么这个矩阵为单 ...

  9. 8.18考试总结(NOIP模拟43)[第一题·第二题·第三题·第四题]

    愿你和重要的人,在来日重逢. 前言 题目名字起的很随意... 这天 Luogu 的运势好像是大凶(忌:打模拟赛,注意报零). 但是考得还不错,拿到了这么多场模拟赛以来第二三个场上AC. 所以说,我爱大 ...

  10. uniapp 小程序分享功能

    上个月在做小程序的项目时,甲方需要给小程序添加个分享的功能,查看uniapp官方文档后,发现uniapp有自带的小程序分享功能(https://uniapp.dcloud.io/api/plugins ...