【分块】bzoj1901 Zju2112 Dynamic Rankings
2024-10-14 06:11:28
区间k大,分块大法好,每个区间内存储一个有序表。
二分答案,统计在区间内小于二分到的答案的值的个数,在每个整块内二分、零散的暴力即可。
还是说∵有二分操作,∴每个块的大小定为sqrt(n*log2(n))比较快呢。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int n,a[],num[],qx,qy,k,p,v,m,sz,sum,l[],r[],b[],tmp[];
char s[];
void makeblock()
{
memcpy(b,a,sizeof(a));
sz=sqrt((double)n*log2(n));
for(sum=;sum*sz<n;sum++)
{
l[sum]=(sum-)*sz+;
r[sum]=sum*sz;
for(int i=l[sum];i<=r[sum];i++)
num[i]=sum;
sort(b+l[sum],b+r[sum]+);
}
l[sum]=sz*(sum-)+;
r[sum]=n;
sort(b+l[sum],b+r[sum]+);
for(int i=l[sum];i<=r[sum];i++)
num[i]=sum;
}
void query(int L,int R,int k)
{
if(num[L]+>=num[R])
{
int en=;
for(int i=L;i<=R;i++) tmp[++en]=a[i];
sort(tmp+,tmp+en+);
printf("%d\n",tmp[k]);
}
else
{
int x=,y=;
while(x!=y)
{
int mid=x+y>>,cnt=;
for(int i=L;i<=r[num[L]];i++) if(a[i]<mid) cnt++;
for(int i=l[num[R]];i<=R;i++) if(a[i]<mid) cnt++; //统计<mid的值数
for(int i=num[L]+;i<num[R];i++) cnt+=( lower_bound(b+l[i],b+r[i]+,mid) - (b+l[i]) );
if(cnt>=k) y=mid;
else x=mid+;
}
printf("%d\n",x-);
}
}
void update(int p,int v)
{
*lower_bound(b+l[num[p]],b+r[num[p]]+,a[p])=v;
sort(b+l[num[p]],b+r[num[p]]+);
a[p]=v;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
makeblock();
for(int i=;i<=m;i++)
{
scanf("%s",s);
if(s[]=='Q') {scanf("%d%d%d",&qx,&qy,&k);query(qx,qy,k);}
else {scanf("%d%d",&p,&v);update(p,v);}
}
return ;
}
最新文章
- Spring(三)AOP面向切面编程
- h5视频上传之前端视频压缩研究
- Android 4.0 源代码结构
- 微信小程序(应用号)开发资源汇总整理 - 一直更新中
- objective-c 中随机数的用法 3种:arc4random() 、random()、CCRANDOM_0_1()
- Python实现PLA(感知机)
- A few things to remember while coding in Python.
- 快递查询API接口对接方法
- VS2005快捷键
- input submit button iOS webview browser diffrence
- JS 去除特定符号(逗号)的方法
- virtualbox 中安装win7虚拟机
- 4D(DRG、DLG、DOM、DEM)数据 概念
- (四)—性能测试工具curl-loader(linux)
- 基于Kubernetes 构建.NET Core 的技术体系
- java 文档
- jQuery事件--change([[data],fn])、on(events,[selector],[data],fn)和hover([over,]out)
- WebStrom配置SVN服务
- Hibernate学习笔记2.5(Hibernate核心开发接口和三种状态)
- 【bzoj3881】[Coci2015]Divljak AC自动机+树链的并+DFS序+树状数组
热门文章
- linux启动一个web项目时验证码不能出现的问题的解决
- 编译 openssl 0.9.8zc 出现 error C2220: warning treated as error - no &#39;object&#39; file generated
- Linux Uptime 命令,让你知道你的系统运行了多久
- UVa 12265 贩卖土地 单调栈
- QML与C++混合编程详解(转)
- js三层引号嵌套
- Jmeter接口测试常见的乱码问题三种解决方法
- React 踩坑记录
- Git-回滚操作
- python 复习 4-1 函数、参数、返回值、递归