题目链接:http://www.ifrog.cc/acm/problem/1157

1157 - 造物主的戒律

Time Limit:20s Memory Limit:512MByte

Submissions:681Solved:69

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 大家想知道这游戏叫什么吗 叫liber7 这个叫由乃的 真的有毒。 ——来自另一个出题人。 ---------------------- 484觉得图多。 我会告诉你我删了好多张了么。 当然会,图好多还超级大。 我都给它缩小了。 ——来自一个上题人

SOLUTION
“玲珑杯”ACM比赛 Round #20

思路:主席树模板题;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<bitset>
#include<set>
#include<map>
using namespace std;
#define LL long long
#define pi (4*atan(1.0))
#define eps 1e-8
#define bug(x)  cout<<"bug"<<x<<endl;
const int N=8e5+100,M=1e6+10,inf=1e9+10;
const LL INF=1e18+10,mod=998244353;struct Chairmantree
{int rt[N*20],ls[N*20],rs[N*20],sum[N*20];int tot;void init(){tot=0;memset(ls,0,sizeof(ls));memset(rs,0,sizeof(rs));memset(sum,0,sizeof(sum));memset(rt,0,sizeof(rt));}void build(int l,int r,int &pos){pos=++tot;sum[pos]=0;if(l==r)return;int mid=(l+r)>>1;build(l,mid,ls[pos]);build(mid+1,r,rs[pos]);}void update(int p,int c,int pre,int l,int r,int &pos){pos=++tot;ls[pos]=ls[pre];rs[pos]=rs[pre];sum[pos]=sum[pre]+c;if(l==r)return;int mid=(l+r)>>1;if(p<=mid)update(p,c,ls[pre],l,mid,ls[pos]);elseupdate(p,c,rs[pre],mid+1,r,rs[pos]);}int rank(int s,int e,int L,int R,int l,int r){if(L<=l&&r<=R)return sum[e]-sum[s];int mid=(l+r)>>1;int ans=0;if(L<=mid)ans+=rank(ls[s],ls[e],L,R,l,mid);if(R>mid)ans+=rank(rs[s],rs[e],L,R,mid+1,r);return ans;}int query(int L,int R,int l,int r,int k){if(l==r)return l;int mid=(l+r)>>1;int num=sum[ls[R]]-sum[ls[L]];if(k<=num)return query(ls[L],ls[R],l,mid,k);else return query(rs[L],rs[R],mid+1,r,k-num);}
};
Chairmantree tree;
int a[N],b[N];
struct is
{int l,r,k1,k2,x;
}q[N];
int getpos(int x,int cnt)
{int pos=lower_bound(b+1,b+cnt,x)-b;return pos;
}
int main()
{int n,m;while(~scanf("%d%d",&n,&m)){for(int i=1;i<=n;i++){scanf("%d",&a[i]);b[i]=a[i];}for(int i=1;i<=m;i++){scanf("%d%d%d%d%d",&q[i].l,&q[i].r,&q[i].x,&q[i].k1,&q[i].k2);b[n+i]=q[i].x;}sort(b+1,b+1+n+m);int num=unique(b+1,b+1+n+m)-b;tree.init();tree.build(1,num-1,tree.rt[0]);for(int i=1;i<=n;i++){int p=getpos(a[i],num);tree.update(p,1,tree.rt[i-1],1,num-1,tree.rt[i]);}//for(int i=1;i<num;i++)//    printf("%d ",tree.rt[i]);//printf("\n");for(int i=1;i<=m;i++){int l=q[i].l,r=q[i].r,x=q[i].x,k1=q[i].k1,k2=q[i].k2;int p1=getpos(x,num);int p=tree.rank(tree.rt[l-1],tree.rt[r],1,p1,1,num-1);//cout<<"xxx "<<p<<" "<<num-1<<endl;int ans1=-1,ans2=-1;if(p>=k1)ans1=tree.query(tree.rt[l-1],tree.rt[r],1,num-1,k1);if(p+k2<=(r-l+1))ans2=tree.query(tree.rt[l-1],tree.rt[r],1,num-1,p+k2);//printf("%d\n",b[tree.query(tree.rt[l-1],tree.rt[r],1,num-1,k)]);if(ans1!=-1)printf("%d ",b[ans1]);else printf("-1 ");if(ans2!=-1)printf("%d\n",b[ans2]);else printf("-1\n");}}return 0;
}

转载于:https://www.cnblogs.com/jhz033/p/7440149.html

玲珑杯 1157 - 造物主的戒律 主席树+离散化相关推荐

  1. SPOJ - COT Count on a tree(LCA+主席树+离散化)

    题目链接:点击查看 题目大意:给出一棵树,每个点都有一个权值,现在给出m个询问,每次询问的格式是u,v,k,要求输出u-v这条路径上第k大的数 题目分析:一看到第k大的数就会想到主席树,既然是在树上的 ...

  2. [luoguP1168]中位数(主席树+离散化)

    传送门 模板题一道,1A. --代码 1 #include <cstdio> 2 #include <algorithm> 3 #define ls son[now][0], ...

  3. HDU - 6601 Keen On Everything But Triangle(主席树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a ,再给出 q 次询问,每次询问给出一个区间 [ l , r ] ,要求从区间内选出三个数,使得构成的三角形周长最大,如果无解输出 - 1 ...

  4. HDU - 4866 Shooting(主席树+扫描线)

    题目链接:点击查看 题目大意:给出 n 条平行于 x 轴的线段,每条线段都的 [ l , r ] 都位于 [ 1 , X ] 之间,每条线段的高度为 d,也就是距离 x 轴的位置,接下来给出 m 次询 ...

  5. 模板三连击:树状数组+线段树+主席树

    没事儿干,复习模板...... 1.树状数组 本来不想写这个的,但是反正就几分钟就打完了,所以就写了,水AC数. 洛谷 P3374 [模板]树状数组 1 1 #include<cstdio> ...

  6. HDU - 3804 Query on a tree(主席树维护最大值+离散化)

    题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个权值,给出m个查询:a,b:问从点1到点a的唯一路径上,在边权小于等于b的边中选出边权最大的值输出,若没有符合条件的边则输出-1: 题目分析: ...

  7. BZOJ #2874. 训练士兵(差分+离散化+主席树)

    BZOJ #2874. 训练士兵 description solution code description Ryz正在着手于训练一批精锐士兵 Ryz手下有n*m个士兵,排成一个n行m列的方阵.在一天 ...

  8. Bzoj 1901: Zju2112 Dynamic Rankings 主席树,可持久,树状数组,离散化

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 6321  Solved: 2628 [ ...

  9. PAT (Basic Level) Practise 1045 快速排序(离散化+主席树区间内的区间求和)

    1045. 快速排序(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 著名的快速排序算法里有一个经典的划分 ...

最新文章

  1. 为什么叫python编程-月薪上万的Python编程,为什么你还没入门就放弃了?
  2. c#窗口科学计算机,c#窗口科学计算器连等如何实现,大神帮忙一下好么?
  3. STM32程序设计(跑马灯)以及STM32原理图绘制(通过ad软件)
  4. java编写一个测试类_java写一个类,并测试它
  5. 【集合】CFdiv.2#600B Silly Mistake
  6. javase(8)_集合框架_List、Set、Map
  7. 在阿里云容器服务上基于Istio实现出口Egress流量管理
  8. 毕业设计总结(惯性导航)
  9. docker pull报错:Timeout exceeded while awaiting headers解决思路
  10. 删除的手机短信怎么恢复
  11. 苹果手机如何找回id密码_iPhone手机ID总是忘记密码,轻松一招帮你找回,原来这么简单...
  12. poj 4124:海贼王之伟大航路
  13. EAS的WEB开发入门
  14. MBA-day2数学-应用题-比例问题
  15. 泛型(3):泛型方法
  16. 2022-2028年全球与中国奶酪格栅机行业市场需求预测分析
  17. Cocos Creator 2.4+加载本地图片和微信头像
  18. c++ 时间类型详解 time_t
  19. 如何使用计算机自带的刻录软件,win7自带刻录软件怎么用?win7如何用自带刻录软件...
  20. 好看轻量级北邮人导航源码

热门文章

  1. python爬虫教程入门-Python爬虫系列 - 入门教学
  2. pythonweb开发-Python Web开发
  3. python心得1000字-经典教材《统计学习导论》现在有了Python版
  4. python 贴吧自动回复机-python_库学习_02_微信自动回复机器人
  5. python2好还是python3好-新手入门选择Python2还是Python3
  6. 如何使用python批量下载-使用 Python + Selenium 批量下载素材
  7. python程序员工作怎样-12个Python程序员面试必备问题与答案(小结)
  8. 学好python工资一般多少钱-Python工资多少?就业发展前景怎么样?
  9. python代码打好了怎么运行-python代码是怎样运行的
  10. python matplotlib散点图-python matplotlib更新函数的散点图