linlong 1157 - 造物主的戒律(主席树)

1157 - 造物主的戒律

Time Limit:20s Memory Limit:512MByte

Submissions:661Solved:68

DESCRIPTION

造物主的戒律,空气,变成数据结构!
于是空气变成了数据结构~
给你一个序列,每次查询区间中小于等于x的所有数字里面第k1k1小的值以及大于x的所有数字里面第k2k2小的值,如果不存在,输出-1
每次输出两个数,对于每个数如果不存在,则单独输出-1

INPUT
第一行两个数n,m第二行n个数表示序列a后面m行每行五个数l,r,x,k1,k2
OUTPUT
对于每个查询输出答案
SAMPLE INPUT
5 5
1 2 3 4 5
1 5 3 1 2
2 5 2 1 3
2 3 3 3 3
3 3 3 3 3
3 3 3 3 3

SAMPLE OUTPUT
1 5
2 5
-1 -1
-1 -1
-1 -1
HINT
n,m<= 400000 ,0 <= a[i] <= 1000000000


解:首先查询在这个区间中比x小的数的个数,如果小于k1 ans1=-1,否则查询第k1小的数,如果cnt+k2>r-l+1则ans2=-1 否则查询cnt+k2大的数;

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<map>
#include <bits/stdc++.h>
using namespace std;
const int N = 4e5+100;
typedef long long LL;
int rt[N], ls[N*100], rs[N*100], sum[N*100];
int a[N], b[N], tot, tmp;
void build(int &o,int l,int r)
{
    o= ++tot,sum[o]=0;
    if(l==r) return ;
    int mid=(l+r)/2;
    build(ls[o],l,mid);
    build(rs[o],mid+1,r);
    return ;
}
void update(int &o,int l,int r,int last,int p)
{
    o= ++tot;
    ls[o]=ls[last],rs[o]=rs[last];
    sum[o]=sum[last]+1;
    if(l==r) return ;
    int mid=(l+r)/2;
    if(p<=mid) update(ls[o],l,mid,ls[last],p);
    else update(rs[o],mid+1,r,rs[last],p);
    return ;
}
void query(int ss,int tt,int l,int r,int p)
{
    if(l==r)
    {
        tmp+=(sum[tt]-sum[ss]);
        return ;
    }
    int mid=(l+r)/2;
    if(p<=mid)
    {
        query(ls[ss],ls[tt],l,mid,p);
    }
    else
    {
        tmp+=(sum[ls[tt]]-sum[ls[ss]]);
        query(rs[ss],rs[tt],mid+1,r,p);
    }
    return ;
}
int query1(int ss,int tt,int l,int r,int cnt)
{
    if(l==r) return l;
    int tmp1=sum[ls[tt]]-sum[ls[ss]];
    int mid=(l+r)/2;
    if(tmp1>=cnt) return query1(ls[ss],ls[tt],l,mid,cnt);
    else return query1(rs[ss],rs[tt],mid+1,r,cnt-tmp1);
}

int main()
{
    int n, q;
    scanf("%d %d", &n, &q);
    for(int i=1; i<=n; i++) scanf("%d", &a[i]), b[i]=a[i];
    sort(b+1,b+n+1);
    int k=unique(b+1,b+n+1)-(b+1);
    tot=0;
    build(rt[0],1,k);
    for(int i=1; i<=n; i++)
    {
        int pos=lower_bound(b+1,b+k+1,a[i])-(b);
        update(rt[i],1,k,rt[i-1],pos);
    }
    while(q--)
    {
        int l, r, x, k1, k2;
        scanf("%d %d %d %d %d", &l, &r, &x, &k1, &k2);
        tmp=0;
        int pos=lower_bound(b+1,b+k+1,x)-b;
        if(b[pos]!=x) pos--;
        query(rt[l-1],rt[r],1,k,pos);
        int ans1=0, ans2=0;
        if(tmp<k1) ans1=-1;
        else    ans1=b[query1(rt[l-1],rt[r],1,k,k1)];
        if(tmp+k2>r-l+1) ans2=-1;
        else  ans2=b[query1(rt[l-1],rt[r],1,k,tmp+k2)];
        printf("%d %d\n",ans1,ans2);
    }
    return 0;
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/* * @Author: LinLong * @LastEditors: LinLong * @Description: 上课进度上传 */ import { ref, onMounted, onUnmounted } from 'vue' import { getItem, setItem } from '@/hooks' import { uselearningProgress } from '@/stores' import { updatedLearningProgress } from '@/apiList/learningProgress' const learningProgressStore = uselearningProgress() //学习进度仓库 const currentProgressFile = ref(null) //当前学习进度文件 const heartbeatTime = 30 * 1000 //30秒 let timer = null //时间函数 export function useClassProgress(onBeforeRouteLeave) { //从仓库获取用户点击的课程->项目->任务->文件 learningProgressStore.$subscribe((mutation, state) => { const { currentProgress } = state // console.log('%c--currentProgress-->', 'background:#18C36E;color:#3F4040;', currentProgress) currentProgressFile.value = { classId: currentProgress.classId, courseId: currentProgress.courseId, courseId_text: currentProgress.courseId_text, projectId: currentProgress.pid == 0 ? currentProgress.id : currentProgress.pid, // projectId: currentProgress.id, taskId: currentProgress.pid == 0 ? null : currentProgress.id, pid_text: currentProgress.pid_text, name: currentProgress.name, file: currentProgress.url, userId: getItem('userInfo').id, } // console.log('%c-----state 学习进度------->', 'background:#18C36E;color:#3F4040;', currentProgress) }) //生命周期页面挂载完毕 onMounted(() => { //接收iframe 异步框架消息 window.addEventListener('message', (e) => { if (e.origin.includes('8013')) { const data = e.data setItem('postMessage', data) // console.log('%c-----监听postMessage子级------->', 'background:#18C36E;color:#3F4040;', JSON.parse(data)) } }) //浏览器tab标签切换或最小化事件设置暂停提交 上课记录 document.addEventListener('visibilitychange', () => { if (document.visibilityState === 'hidden') { timer ? clearTimeout(timer) : (timer = null) //清除定时器 } else if (document.visibilityState === 'visible') { timer ? clearTimeout(timer) : (timer = null) //先清除一次定时器 sendMessage() //继续发送学习进度 } }) //发送统计信息至后端 sendMessage() function sendMessage() { console.log('%c---对方水电费水电费水电费->', 'background:#18C36E;color:#3F4040;') timer ? clearTimeout(timer) : (timer = false) //先清除一次定时器 timer = setTimeout(() => { const sendData = { ...getItem('postMessage'), ...currentProgressFile.value, } // console.log('%c------准备发送的信息sendData------>', 'background:#18C36E;color:#3F4040;', sendData) updatedLearningProgress(sendData).then((res) => { if (res.success) sendMessage() }) }, heartbeatTime) //heartbeatTime } }) //生命周期页面销毁之前 onUnmounted(() => { clearTimeout(timer) // //路由离开 // onBeforeRouteLeave(() => { // clearTimeout(timer) // }) }) }
04-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值