玲珑杯 1157 - 造物主的戒律 主席树+离散化
题目链接:http://www.ifrog.cc/acm/problem/1157
Time Limit:20s Memory Limit:512MByte
Submissions:681Solved:69
造物主的戒律,空气,变成数据结构!
于是空气变成了数据结构~
给你一个序列,每次查询区间中小于等于x的所有数字里面第k1k1小的值以及大于x的所有数字里面第k2k2小的值,如果不存在,输出-1
每次输出两个数,对于每个数如果不存在,则单独输出-1
#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 - 造物主的戒律 主席树+离散化相关推荐
- SPOJ - COT Count on a tree(LCA+主席树+离散化)
题目链接:点击查看 题目大意:给出一棵树,每个点都有一个权值,现在给出m个询问,每次询问的格式是u,v,k,要求输出u-v这条路径上第k大的数 题目分析:一看到第k大的数就会想到主席树,既然是在树上的 ...
- [luoguP1168]中位数(主席树+离散化)
传送门 模板题一道,1A. --代码 1 #include <cstdio> 2 #include <algorithm> 3 #define ls son[now][0], ...
- HDU - 6601 Keen On Everything But Triangle(主席树)
题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a ,再给出 q 次询问,每次询问给出一个区间 [ l , r ] ,要求从区间内选出三个数,使得构成的三角形周长最大,如果无解输出 - 1 ...
- HDU - 4866 Shooting(主席树+扫描线)
题目链接:点击查看 题目大意:给出 n 条平行于 x 轴的线段,每条线段都的 [ l , r ] 都位于 [ 1 , X ] 之间,每条线段的高度为 d,也就是距离 x 轴的位置,接下来给出 m 次询 ...
- 模板三连击:树状数组+线段树+主席树
没事儿干,复习模板...... 1.树状数组 本来不想写这个的,但是反正就几分钟就打完了,所以就写了,水AC数. 洛谷 P3374 [模板]树状数组 1 1 #include<cstdio> ...
- HDU - 3804 Query on a tree(主席树维护最大值+离散化)
题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个权值,给出m个查询:a,b:问从点1到点a的唯一路径上,在边权小于等于b的边中选出边权最大的值输出,若没有符合条件的边则输出-1: 题目分析: ...
- BZOJ #2874. 训练士兵(差分+离散化+主席树)
BZOJ #2874. 训练士兵 description solution code description Ryz正在着手于训练一批精锐士兵 Ryz手下有n*m个士兵,排成一个n行m列的方阵.在一天 ...
- Bzoj 1901: Zju2112 Dynamic Rankings 主席树,可持久,树状数组,离散化
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 6321 Solved: 2628 [ ...
- PAT (Basic Level) Practise 1045 快速排序(离散化+主席树区间内的区间求和)
1045. 快速排序(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 著名的快速排序算法里有一个经典的划分 ...
最新文章
- 为什么叫python编程-月薪上万的Python编程,为什么你还没入门就放弃了?
- c#窗口科学计算机,c#窗口科学计算器连等如何实现,大神帮忙一下好么?
- STM32程序设计(跑马灯)以及STM32原理图绘制(通过ad软件)
- java编写一个测试类_java写一个类,并测试它
- 【集合】CFdiv.2#600B Silly Mistake
- javase(8)_集合框架_List、Set、Map
- 在阿里云容器服务上基于Istio实现出口Egress流量管理
- 毕业设计总结(惯性导航)
- docker pull报错:Timeout exceeded while awaiting headers解决思路
- 删除的手机短信怎么恢复
- 苹果手机如何找回id密码_iPhone手机ID总是忘记密码,轻松一招帮你找回,原来这么简单...
- poj 4124:海贼王之伟大航路
- EAS的WEB开发入门
- MBA-day2数学-应用题-比例问题
- 泛型(3):泛型方法
- 2022-2028年全球与中国奶酪格栅机行业市场需求预测分析
- Cocos Creator 2.4+加载本地图片和微信头像
- c++ 时间类型详解 time_t
- 如何使用计算机自带的刻录软件,win7自带刻录软件怎么用?win7如何用自带刻录软件...
- 好看轻量级北邮人导航源码
热门文章
- python爬虫教程入门-Python爬虫系列 - 入门教学
- pythonweb开发-Python Web开发
- python心得1000字-经典教材《统计学习导论》现在有了Python版
- python 贴吧自动回复机-python_库学习_02_微信自动回复机器人
- python2好还是python3好-新手入门选择Python2还是Python3
- 如何使用python批量下载-使用 Python + Selenium 批量下载素材
- python程序员工作怎样-12个Python程序员面试必备问题与答案(小结)
- 学好python工资一般多少钱-Python工资多少?就业发展前景怎么样?
- python代码打好了怎么运行-python代码是怎样运行的
- python matplotlib散点图-python matplotlib更新函数的散点图