博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【分块】bzoj1901 Zju2112 Dynamic Rankings
阅读量:7095 次
发布时间:2019-06-28

本文共 1355 字,大约阅读时间需要 4 分钟。

区间k大,分块大法好,每个区间内存储一个有序表。

二分答案,统计在区间内小于二分到的答案的值的个数,在每个整块内二分、零散的暴力即可。

还是说∵有二分操作,∴每个块的大小定为sqrt(n*log2(n))比较快呢。

1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 int n,a[10001],num[10001],qx,qy,k,p,v,m,sz,sum,l[101],r[101],b[10001],tmp[1001]; 7 char s[2]; 8 void makeblock() 9 {10 memcpy(b,a,sizeof(a));11 sz=sqrt((double)n*log2(n));12 for(sum=1;sum*sz
=num[R])29 {30 int en=0;31 for(int i=L;i<=R;i++) tmp[++en]=a[i];32 sort(tmp+1,tmp+en+1);33 printf("%d\n",tmp[k]);34 }35 else36 {37 int x=0,y=1000000001;38 while(x!=y)39 {40 int mid=x+y>>1,cnt=0;41 for(int i=L;i<=r[num[L]];i++) if(a[i]
=k) y=mid;45 else x=mid+1;46 }47 printf("%d\n",x-1);48 }49 }50 void update(int p,int v)51 {52 *lower_bound(b+l[num[p]],b+r[num[p]]+1,a[p])=v;53 sort(b+l[num[p]],b+r[num[p]]+1);54 a[p]=v;55 }56 int main()57 {58 scanf("%d%d",&n,&m);59 for(int i=1;i<=n;i++) scanf("%d",&a[i]);60 makeblock();61 for(int i=1;i<=m;i++)62 {63 scanf("%s",s);64 if(s[0]=='Q') {scanf("%d%d%d",&qx,&qy,&k);query(qx,qy,k);}65 else {scanf("%d%d",&p,&v);update(p,v);}66 }67 return 0;68 }

 

转载于:https://www.cnblogs.com/autsky-jadek/p/3999420.html

你可能感兴趣的文章
Java并发编程:线程控制
查看>>
今天聊一聊Java引用类型的强制类型转换
查看>>
把数据保存到数据库archives表时出错,请检查
查看>>
JavaSE基本语法、数据类型、操作符等:int、long、Integer、Long、if、else、for、while...
查看>>
解析XML文件
查看>>
牛客练习赛46
查看>>
netty线程模型
查看>>
Codeforces Round #237 Div.2 A
查看>>
initrd.gz的解压和制作
查看>>
LeetCode:Edit Distance(字符串编辑距离DP)
查看>>
设计流程及工具记录
查看>>
关于CDialogBar的编程
查看>>
吹きすさぶ风の中で
查看>>
对象引用前加const 报错
查看>>
linux 0.11 源码学习(十一)
查看>>
编码风格——linux内核开发的coding style
查看>>
表格隔行变色案例
查看>>
IOS 模拟不同网络环境 - Network Link Conditioner
查看>>
JAVA第一周学习
查看>>
sql语句select group by order by where一般先后顺序 转载
查看>>