【题目大意】

给出一个长度为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的更多相关文章

  1. [CSP-S模拟测试]:序列(二分答案+树状数组)

    题目传送门(内部题98) 输入格式 第一行一个整数$n$,第二行$n$个整数$a_1\sim a_n$,第三行$n$个整数$b_1\sim b_n$. 输出格式 一行一个整数表示$\max(r-l+1 ...

  2. AtCoder Regular Contest 101 (ARC101) D - Median of Medians 二分答案 树状数组

    原文链接https://www.cnblogs.com/zhouzhendong/p/ARC101D.html 题目传送门 - ARC101D 题意 给定一个序列 A . 定义一个序列 A 的中位数为 ...

  3. CodeForces - 220B Little Elephant and Array (莫队+离散化 / 离线树状数组)

    题意:N个数,M个查询,求[Li,Ri]区间内出现次数等于其数值大小的数的个数. 分析:用莫队处理离线问题是一种解决方案.但ai的范围可达到1e9,所以需要离散化预处理.每次区间向外扩的更新的过程中, ...

  4. 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 ...

  5. cf1073D Berland Fair (二分答案+树状数组)

    用一个树状数组维护前缀和,每次我二分地找一个位置,使得我能一路买过去 但这个买不了 那以后肯定也都买不了了,就把它改成0,再从头二分地找下一个位置,直到这一圈我可以跑下来 然后就看跑这一圈要花多少钱. ...

  6. 4418: [Shoi2013]扇形面积并|二分答案|树状数组

    为何感觉SHOI的题好水. ..又是一道SB题 从左到右枚举每个区间,遇到一个扇形的左区间就+1.遇到右区间就-1,然后再树状数组上2分答案,还是不会码log的.. SHOI2013似乎另一道题发牌也 ...

  7. luogu2336 喵星球上的点名 (SA+二分答案+树状数组)

    离散化一下然后把姓名串和询问串都放一起做SA 和bzoj3277串类似地,满足某一询问的后缀(就是和这个询问对应的后缀的LCP>=这个询问长度的后缀)的排名也是一个区间,把这个区间二分出来即可 ...

  8. 【BZOJ4009】[HNOI2015]接水果 DFS序+整体二分+扫描线+树状数组

    [BZOJ4009][HNOI2015]接水果 Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, ...

  9. BZOJ 4009: [HNOI2015]接水果 (整体二分+扫描线 树状数组)

    整体二分+扫描线 树状数组 具体做法看这里a CODE #include <cctype> #include <cstdio> #include <cstring> ...

随机推荐

  1. js_同步和异步

    刚开始写js那会,对这一块是知之甚少,太多太多的知识不足,致使做什么都很艰难.现在工作也有段时间了,知识也有了点积累, 写点什么分享一下. 同步和异步?这个问题是在使用ajax请求后台数据的时候出现的 ...

  2. linux 下 /bin /sbin 的区别 -- (转)

    /bin,/sbin,/usr/bin,/usr/sbin区别 /  : this is root directory                root 用户根目录 /bin : command ...

  3. 设计模式之Builder

    设计模式总共有23种模式这仅仅是为了一个目的:解耦+解耦+解耦...(高内聚低耦合满足开闭原则) 介绍: Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象. 将一个复杂 ...

  4. Java基础 变量和数据类型及相关操作

    Java基本语法: 1):Java语言严格区分大小写,好比main和Main是完全不同的概念. 2):一个Java源文件里可以定义多个Java类,但其中最多只能有一个类被定义成public类.若源文件 ...

  5. python实战===短信验证码的小项目

    项目地址 https://www.shiyanlou.com/courses/609/labs/2007/document flask的中文文档 http://docs.jinkan.org/docs ...

  6. python基础===trheading 模块

    '''threading模块''' import threading import time def music(func): for i in range(2): print("[+]i ...

  7. c#导出文件,下载文件,命名下载后的文件名

    Page.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpU ...

  8. 【bzoj3545】peaks

    离线一下,动态开点+线段树合并,然后权值线段树上询问kth即可. #include<bits/stdc++.h> ; *; using namespace std; ; inline in ...

  9. 初学者学习Javascript很吃力怎么办?到底该如何学习Js?

      Js给初学者的印象总是那么的“杂而乱”,相信很多初学者都在找轻松学习Js的途径.在这里给大家总结一些学习Js的经验,希望能给后来的学习者探索出一条“轻松学习Js之路”. Js给人那种感觉的原因多半 ...

  10. 动态计算文本的CGSize

    // 计算文本的size -(CGSize)sizeWithText:(NSString *)text maxSize:(CGSize)maxSize fontSize:(CGFloat)fontSi ...