n<=100000个数有m<=5000个询问,每次问区间第k大。

方法一:主席树!……

方法二:整体二分。

整体二分一次性计算半个值域对一个区间的询问的贡献,然后根据“这半边的贡献在某个询问中可不可以直接处理掉”把询问分两部分,并按“数字的值是否在这半边”把数字也分成两部分,这样把一个区间和值域都分掉了,然后就可以在f(n)logMax的时间出解,其中f(n)表示计算一次这样的贡献需要的时间。

在这题里,只需要看某个区间里在值域[L,mid]中出现的数字的个数有没有到K个,以此划分成两个区域。因此树状数组搞一搞,f(n)=nlogn,大功告成。

 //#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
//#include<bitset>
#include<algorithm>
//#include<cmath>
using namespace std; int n,m;
#define maxn 200011
const int inf=0x3f3f3f3f;
struct App
{
int x,y,z,id,type;
//type=1 表示修改,其中x为位置,y为数值,z为在bit中的修改权值
//type=0 表示询问,其中x,y为左右端点,z是第几大,id询问编号
}a[maxn],al[maxn],ar[maxn];
int ans[maxn]; struct BIT
{
int a[maxn];
void add(int x,int v) {for (;x<=n;x+=x&-x) a[x]+=v;}
int query(int x) {int ans=; for (;x;x-=x&-x) ans+=a[x]; return ans;}
}t; void solve(int L,int R,int ql,int qr)
{
if (ql>qr || L>R) return;
if (L==R)
{
for (int i=ql;i<=qr;i++) ans[a[i].id]=L;
return;
}
const int mid=(L+R)>>;
int lal=,lar=;
for (int i=ql;i<=qr;i++)
{
if (a[i].type)
{
if (a[i].y<=mid)
{
t.add(a[i].x,a[i].z);
al[++lal]=a[i];
}
else ar[++lar]=a[i];
}
else
{
int tmp=t.query(a[i].y)-t.query(a[i].x-);
if (tmp>=a[i].z) al[++lal]=a[i];
else
{
ar[++lar]=a[i];
ar[lar].z-=tmp;
}
}
}
for (int i=;i<=lal;i++) if (al[i].type==) t.add(al[i].x,-al[i].z);
for (int i=,j=ql;i<=lal;i++,j++) a[j]=al[i];
for (int i=,j=ql+lal;i<=lar;i++,j++) a[j]=ar[i];
solve(L,mid,ql,ql+lal-);
solve(mid+,R,ql+lal,qr);
} int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) scanf("%d",&a[i].y),a[i].x=i,a[i].z=,a[i].type=;
for (int i=,j=n+;i<=m;i++,j++) scanf("%d%d%d",&a[j].x,&a[j].y,&a[j].z),a[j].id=i,a[j].type=;
solve(-inf,inf,,n+m);
for (int i=;i<=m;i++) printf("%d\n",ans[i]);
return ;
}

整体二分初识--POJ2104:K-th Number的更多相关文章

  1. 模板—算法—整体二分(区间k小值)

    模板—算法—整体二分(区间k小值) Code: #include <cstdio> #include <algorithm> using namespace std; #def ...

  2. [POJ2104] K – th Number (可持久化线段树 主席树)

    题目背景 这是个非常经典的主席树入门题--静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...

  3. 整体二分初探 两类区间第K大问题 poj2104 & hdu5412

    看到好多讲解都把整体二分和$CDQ$分治放到一起讲 不过自己目前还没学会$CDQ$分治 就单独谈谈整体二分好了 先推荐一下$XHR$的 <浅谈数据结构题的几个非经典解法> 整体二分在当中有 ...

  4. POJ2104 K-th Number —— 区间第k小 整体二分

    题目链接:https://vjudge.net/problem/POJ-2104 K-th Number Time Limit: 20000MS   Memory Limit: 65536K Tota ...

  5. POJ2104 K-th Number [整体二分]

    题目传送门 K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 69053   Accepted: 24 ...

  6. POJ2104 K-th Number(整体二分)

    嘟嘟嘟 整体二分是一个好东西. 理解起来还行. 首先,需要牢记的是,我们二分的是答案,也就是在值域上二分,同时把操作分到左右区间中(所以操作不是均分的). 然后我就懒得讲了-- 李煜东的<算法竞 ...

  7. POJ2104 K-th Number(整体二分)

    题解 又一次做这个题上一次用的是线段树上二分.这次用的是整体二分.结果: (第一个是整体二分) 整体二分就是对于所有查询都二分一个值.然后根据能不能成立把询问修改分成两部分,然后第二部分继承第一部分的 ...

  8. POJ2104 K-th number (整体二分)

    刚学了整体二分,用这种解法来解决这道题. 首先对于每个询问时可以二分解决的,这也是可以使用整体二分的前提.将原来的序列看成是插入操作,和询问操作和在一起根据值域进行二分.用树状数组来检验二分值. 1 ...

  9. 【ZOJ2112】【整体二分+树状数组】带修改区间第k大

    The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...

随机推荐

  1. python版本2和3使用range()函数方法

    python 2:可以直接使用range(5) 输入的列表结果和预期的一样 python 3:使用range(5) 得到列表结果却是这个,和预期的不一致,其原因是节省空间,防止过大的列表产生 如果想要 ...

  2. 设计模式 -- Abstract Factory 抽象工厂

    1.常规的对象创建方法 //创建一个Road对象 Road road=new Road(); new的问题:实现依赖,不能应对“具体实例化类型”额变化. 解决思想: 封装变化点--哪里变化,封装哪里( ...

  3. String的用法——其他功能

    package cn.itcast_06; /* String类的其他功能: 替换功能: String replace(char old,char new) String replace(String ...

  4. Mac OS 下安装和配置 maven

    1. 安装 Maven 前的必须准备 需先安装 Java 环境 下载合适的 JDK 配置 JDK 环境变量 JAVA_HOME:为 JDK 安装目录 Path:为 JDK/bin 目录 测试是否成功: ...

  5. R Programming week2 Functions and Scoping Rules

    A Diversion on Binding Values to Symbol When R tries to bind a value to a symbol,it searches through ...

  6. SQL Server 零散笔记

    排序显示行号 select Row_Number() over(order by Code) as RowNumber,ID,Code,Name from CBO_ItemMaster 不排序显示行号 ...

  7. qt查找框设置

    转载请注明出处:http://www.cnblogs.com/dachen408/p/7229129.html 主界面弹出查找框方法,查找框显示在主界面上层,并还可以点击主界面,非模态. class ...

  8. MVC学习(一)

    http://www.cnblogs.com/QLeelulu/archive/2008/09/30/1302462.html

  9. SqlServer2012学习 - 基本数据类型认知

    精确数字: 1.整数 int是Sql Server主要整数类型.tinyint,smallint,int 不会自动转成bigint. 大于 2,147,483,647 的整数常量将转换为 decima ...

  10. TabWight

    //修改站号void CDlgParamView::OnPushButton_2_Tab8Clicked(){ // int iSel = m_listStation.GetSelectionMark ...