【序列莫队+二分答案+树状数组】POJ2104-K-th Number
【题目大意】
给出一个长度为n的序列和m组查询(i,j,k),输出[i,j]中的第k大数。
【思路】
先离散化然后莫队分块。用树状数组来维护当前每个值的个数,然后对于每次询问二分答案即可。
又一次实力写错二分…(生无可恋脸.jpg)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN=+;
const int MAXM=+;
struct node
{
int l,r,k,pos,id,ans;
}q[MAXM];
bool cmp(node x,node y)
{
return (x.pos==y.pos)?x.r<y.r:x.pos<y.pos;
}
bool cmpid(node x,node y)
{
return (x.id<y.id);
}
struct discretize
{
int num,pos;
bool operator < (const discretize &x) const {return (num<x.num);}
}tmp[MAXN];
int n,m;
int a[MAXN],e[MAXN];
int ori[MAXN];//离散化后的i对应的原数字为ori[i] int lowbit(int x)
{
return (x&(-x));
} void modify(int p,int x)
{
while (p<=n)
{
e[p]+=x;
p+=lowbit(p);
}
} int sum(int p)
{
int ret=;
while (p>)
{
ret+=e[p];
p-=lowbit(p);
}
return ret;
} void init()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
{
scanf("%d",&tmp[i].num);
tmp[i].pos=i;
}
sort(tmp+,tmp+n+);
for (int i=,j=;i<=n;i++)
{
if (i== || tmp[i].num!=tmp[i-].num) ++j,ori[j]=tmp[i].num;
a[tmp[i].pos]=j;
}
int block=(int)sqrt(n);
for (int i=;i<=m;i++)
{
scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].k);
q[i].id=i;
q[i].pos=(q[i].l-)/block+;
}
sort(q+,q+m+,cmp);
} int binary_search(int k)
{
int lb=,ub=n;
while (ub-lb>)
{
int mid=(ub+lb)>>;
if (sum(mid)>=k) ub=mid;else lb=mid;//注意一下二分怎么写
}
return ub;
} void solve()
{
int l=,r=;
memset(e,,sizeof(e));
for (int i=;i<=m;i++)
{
while (l<q[i].l) modify(a[l],-),l++;
while (l>q[i].l) l--,modify(a[l],);
while (r<q[i].r) r++,modify(a[r],);
while (r>q[i].r) modify(a[r],-),r--;
q[i].ans=binary_search(q[i].k);
}
sort(q,q+m+,cmpid);
for (int i=;i<=m;i++) printf("%d\n",ori[q[i].ans]);
} int main()
{
init();
solve();
return ;
}
【序列莫队+二分答案+树状数组】POJ2104-K-th Number的更多相关文章
- [CSP-S模拟测试]:序列(二分答案+树状数组)
题目传送门(内部题98) 输入格式 第一行一个整数$n$,第二行$n$个整数$a_1\sim a_n$,第三行$n$个整数$b_1\sim b_n$. 输出格式 一行一个整数表示$\max(r-l+1 ...
- AtCoder Regular Contest 101 (ARC101) D - Median of Medians 二分答案 树状数组
原文链接https://www.cnblogs.com/zhouzhendong/p/ARC101D.html 题目传送门 - ARC101D 题意 给定一个序列 A . 定义一个序列 A 的中位数为 ...
- CodeForces - 220B Little Elephant and Array (莫队+离散化 / 离线树状数组)
题意:N个数,M个查询,求[Li,Ri]区间内出现次数等于其数值大小的数的个数. 分析:用莫队处理离线问题是一种解决方案.但ai的范围可达到1e9,所以需要离散化预处理.每次区间向外扩的更新的过程中, ...
- CodeForces - 375D Tree and Queries (莫队+dfs序+树状数组)
You have a rooted tree consisting of n vertices. Each vertex of the tree has some color. We will ass ...
- cf1073D Berland Fair (二分答案+树状数组)
用一个树状数组维护前缀和,每次我二分地找一个位置,使得我能一路买过去 但这个买不了 那以后肯定也都买不了了,就把它改成0,再从头二分地找下一个位置,直到这一圈我可以跑下来 然后就看跑这一圈要花多少钱. ...
- 4418: [Shoi2013]扇形面积并|二分答案|树状数组
为何感觉SHOI的题好水. ..又是一道SB题 从左到右枚举每个区间,遇到一个扇形的左区间就+1.遇到右区间就-1,然后再树状数组上2分答案,还是不会码log的.. SHOI2013似乎另一道题发牌也 ...
- luogu2336 喵星球上的点名 (SA+二分答案+树状数组)
离散化一下然后把姓名串和询问串都放一起做SA 和bzoj3277串类似地,满足某一询问的后缀(就是和这个询问对应的后缀的LCP>=这个询问长度的后缀)的排名也是一个区间,把这个区间二分出来即可 ...
- 【BZOJ4009】[HNOI2015]接水果 DFS序+整体二分+扫描线+树状数组
[BZOJ4009][HNOI2015]接水果 Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, ...
- BZOJ 4009: [HNOI2015]接水果 (整体二分+扫描线 树状数组)
整体二分+扫描线 树状数组 具体做法看这里a CODE #include <cctype> #include <cstdio> #include <cstring> ...
随机推荐
- js 的function为什么可以添加属性
(1) function person(){ this.name = 'Tom'; } (2) function person(){} person.name = 'Tom'; (3) functio ...
- javascript中null与undefined的区别
1.null null是一个对象,表示一个空对象指针,typeof(null)返回object,null参与运算时会转化为0,将对象初始化为null,可以知道变量是否保存了对象的引用 2.undefi ...
- 2017-2018-1 20179205《Linux内核原理与设计》第五周作业
<Linux内核原理与设计>第五周作业 视频学习及操作分析 一.用户态.内核态和中断 内核态在CPU执行中对应高执行级别,执行级别为0级,具有特权指令,可以访问任意物理地址:用户态执行级别 ...
- python模块(requests,logging)
一.requests Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythone ...
- 【Matlab】让Matlab程序发出声音
我有时候运行一段很长的代码,在等待的时候去做别的事,希望程序运行完可以有一个提示音. 这可以用matlab的一个函数sound实现,该函数的输入参量是音频数据向量.采样频率和转换位数. % 响一声 s ...
- C基础 一个可以改变linux的函数getch
引言 - getch简述 引用老的TC版本getch说明. (文章介绍点有点窄, 应用点都是一些恐龙游戏时代的开发细节) #include <conio.h> /* * 立即从客户端 ...
- cacti (不可以利用yum安装cacti的配置)
我们如果用yum不可以安装cacti,我们则可以利用tar包来安装!!! //cacti的配置准备 [root@localhost ~]# yum install -y epel-release [r ...
- linux命令(18):chmod命令
1. 命令格式: chmod [-cfvR] [--help] [--version] mode file 2. 命令功能: 用于改变文件或目录的访问权限,用它控制文件或目录的访问权限. 3. 命令参 ...
- 基于rest_framework和redis实现购物车的操作,结算,支付
前奏: 首先,要在主机中安装redis,windows中安装,下载一个镜像,直接进行下一步的安装,安装成功后,在cmd中输入redis-cli 安装python的依赖库: redis 和 ...
- hdu 3572(构图+最大流)
Task Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...