POJ2104 K-th Number [分块做法]
传送:主席树做法http://www.cnblogs.com/candy99/p/6160704.html
做那倒带修改的主席树时就发现分块可以做,然后就试了试
思想和教主的魔法差不多,只不过那个是求>=v的有几个
既然一个数v的名次可以求,我们二分这个数就行了啊
然而......
首先,你二分到的这个数不一定在区间里出现过
比如 1 2 5 8 9
4和5的名次都是3
于是,我修改了某个区间名次的定义:
“如果一个数的名次是x,但是区间中没有次数,那么他的名次为x-1”
实现上只需要find里return l-t+(b[l]==v) 等于说明出现过
然而
该死不写了鬼知道怎么回事用主席树就行了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=1e5+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n,Q,a[N],bl,m,b[N],pos[N];
int mp[N];
void reset(int x){
int l=(x-)*bl+,r=min(x*bl,n);
for(int i=l;i<=r;i++) b[i]=a[i];
sort(b+l,b+r+);
}
int flag;
int find(int x,int v){
int l=(x-)*bl+,r=min(x*bl,n),t=l;
while(l<=r){
int mid=(l+r)>>;
if(b[mid]<v) l=mid+;
else r=mid-;
}
if(b[l]==v) flag=;
return l-t+;//!
}
int rank(int l,int r,int v){
int ans=;
flag=;
if(pos[l]==pos[r]){
for(int i=l;i<=r;i++) if(a[i]<=v) ans++,flag=flag||a[i]==v;
}else{
int t=pos[l]*bl;
for(int i=l;i<=t;i++) if(a[i]<=v) ans++,flag=flag||a[i]==v;
for(int i=(pos[r]-)*bl+;i<=r;i++) if(a[i]<=v) ans++,flag=flag||a[i]==v;
for(int i=pos[l]+;i<pos[r];i++) ans+=find(i,v);
}
if(!flag) ans--;
return ans;
}
int query(int ql,int qr,int k){
int l=,r=n;
while(l<=r){
int mid=(l+r)>>;
int t=rank(ql,qr,mp[mid]);
if(t<k) l=mid+;
else r=mid-;
}
return l;
}
int main(){
freopen("in.txt","r",stdin);
freopen("1.out","w",stdout);
n=read();Q=read();
bl=sqrt(n);
m=n/bl;if(n%bl) m++;
for(int i=;i<=n;i++) a[i]=mp[i]=read(),pos[i]=(i-)/bl+;
for(int i=;i<=m;i++) reset(i);
sort(mp+,mp++n);
while(Q--){
int i=read(),j=read(),k=read();
printf("%d\n",mp[query(i,j,k)]);
}
}
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <sstream>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#pragma comment(linker,"/STACK:102400000,102400000") using namespace std;
#define MAX 100005
#define MAXN 1000005
#define maxnode 15
#define sigma_size 30
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lrt rt<<1
#define rrt rt<<1|1
#define middle int m=(r+l)>>1
#define LL long long
#define ull unsigned long long
#define mem(x,v) memset(x,v,sizeof(x))
#define lowbit(x) (x&-x)
#define pii pair<int,int>
#define bits(a) __builtin_popcount(a)
#define mk make_pair
#define limit 10000 //const int prime = 999983;
const int INF = 0x3f3f3f3f;
const LL INFF = 0x3f3f;
const double pi = acos(-1.0);
const double inf = 1e18;
const double eps = 1e-;
const LL mod = 1e9+;
const ull mx = ; /*****************************************************/
inline void RI(int &x) {
char c;
while((c=getchar())<'' || c>'');
x=c-'';
while((c=getchar())>='' && c<='') x=(x<<)+(x<<)+c-'';
}
/*****************************************************/ int a[MAX];
int b[MAX];
int c[MAX];
int tmp;
bool judge(int x,int l,int r,int k){
int a1=l/tmp;
int a2=r/tmp;
int sum=;//for(int i=l;i<=r;i++) printf("%d ",a[i]);puts("");
if(a1==a2){
for(int i=l;i<=r;i++) if(a[i]<=c[x]) sum++;
if(sum>=k) return true;
return false;
}
for(int i=a1+;i<a2;i++){
sum+=upper_bound(b+i*tmp,b+(i+)*tmp,c[x])-b-i*tmp;
}
for(int i=l;i<(a1+)*tmp;i++) if(a[i]<=c[x]) sum++;
for(int i=a2*tmp;i<=r;i++) if(a[i]<=c[x]) sum++; //printf("ra %d %d %d %d\n",l,r,c[x],sum);
if(sum>=k) return true;
return false;
} int main(){
freopen("in.txt","r",stdin);
freopen("2.out","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
tmp=sqrt(n);
for(int i=;i<n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
c[i]=a[i];
}
sort(c,c+n);
for(int i=;i*tmp<n;i++){
if((i+)*tmp<=n) sort(b+i*tmp,b+(i+)*tmp);
else sort(b+i*tmp,b+n);
}
while(m--){
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
int ll=,rr=n-;
while(ll<=rr){
int mid=(ll+rr)>>;
if(judge(mid,l-,r-,k)) rr=mid-;
else ll=mid+;
}
printf("%d\n",c[ll]);
}
return ;
}
别人的AC代码
POJ2104 K-th Number [分块做法]的更多相关文章
- [POJ2104] K – th Number (可持久化线段树 主席树)
题目背景 这是个非常经典的主席树入门题--静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...
- ZOJ 2112 Dynamic Rankings(带修改的区间第K大,分块+二分搜索+二分答案)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- 【POJ2104】K-th Number
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABToAAAJ2CAIAAADwi6oDAAAgAElEQVR4nOy9a5Pj1nnvi0/Q71Llj3
- C++之路进阶——poj2104(K-th Number)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 44537 Accepted: 14781 Ca ...
- luo3372线段树模板的分块做法
题目大意 请你维护一个有n个元素的整数序列,要求支持区间查询&区间修改 对于100%的数据,\(1<=n<=10^5\) 分析 正常做法是线段树维护区间修改.区间查询,今天我要讲的 ...
- 【poj2104】K-th Number 主席树
题目描述 You are working for Macrohard company in data structures department. After failing your previou ...
- 【POJ2104】K-th Number(主席树)
题意:有n个数组成的序列,要求维护数据结构支持在线的下列两种操作: 1:单点修改,将第x个数修改成y 2:区间查询,询问从第x个数到第y个之间第K大的数 n<=100000,a[i]<=1 ...
- HDU 4366 Successor 分块做法
http://acm.hdu.edu.cn/showproblem.php?pid=4366 今日重新做了这题的分块,果然是隔太久了,都忘记了.. 首先,用DFS序变成一维的问题 关键是它有两个权值, ...
- 「BZOJ3065」带插入区间K小值 [分块]
考虑分块,每个块都是用 链表 维护的,并保证 \(size\) 和分块相当. 我们考虑一下怎么去查询,很显然,可以对值域分块,单点修改,记录前缀和,完全ojbk了,对每个块维护一个 \(pre , p ...
随机推荐
- .NET Core采用的全新配置系统[1]: 读取配置数据
提到“配置”二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化的配置定义在这两个文 ...
- .NET Core采用的全新配置系统[8]: 如何实现配置与源文件的同步
配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.接下来我们利用一个简单的.NET Core控 ...
- CSS3中的动画效果记录
今天要记录的是CSS3中的三种属性transform.transition以及animation,这三个属性大大提升了css处理动画的能力. 一.Transform 变形 CSS中transform ...
- 9.JAVA之GUI编程列出指定目录内容
代码如下: /*列出指定目录内容*/ import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import ...
- 重定向Http status code 303 和 302
http 302 http 303 Http 302 302是一个普通的重定向代码.直观的看来是,请求者(浏览器或者模拟http请求)发起一个请求,然后服务端重定向到另一个地址.而事实上,服务端仅仅是 ...
- 编写高质量代码:改善Java程序的151个建议(第4章:字符串___建议56~59)
建议56:自由选择字符串拼接方法 对一个字符串拼接有三种方法:加号.concat方法及StringBuilder(或StringBuffer ,由于StringBuffer的方法与StringBuil ...
- 前端开发之走进Vue.js
Vue.js作为目前最热门最具前景的前端框架之一,其提供了一种帮助我们快速构建并开发前端项目的新的思维模式.本文旨在帮助大家认识Vue.js,了解Vue.js的开发流程,并进一步理解如何通过Vue.j ...
- ASP.NET Core Kestrel部署HTTPS
ASP.NET Core配置 Kestrel部署HTTPS.现在大部分网站已经部署HTTPS,大家对于安全越来越重视. 今天简单介绍一下ASP.NET Core 部署HTTPS,直接通过配置Kestr ...
- 几道web前端练习题目
在 HTML 语言中,以下哪个属性不是通用属性?A]<class>B]<title>C]<href>D]<style> 在线练习:http://hove ...
- C# - 网络编程 之 Socket
命名空间 using System.Net; using System.Net.Socket; Socket类 初始化 public socket (AddressFamily addressFami ...