【分块】bzoj3196 Tyvj 1730 二逼平衡树
分块 或 树套树。
在每个块中维护一个有序表,查询时各种二分,全都是分块的经典操作,就不详细说了。
块的大小定为sqrt(n*log2(n))比较快。
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #include<cstring>
- using namespace std;
- int sum,sz,l[],r[],num[],a[],b[],x,y,k,n,m,op,tmp[];
- 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;
- for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
- }
- inline void Update()
- {
- *lower_bound(b+l[num[x]],b+r[num[x]]+,a[x])=y;
- sort(b+l[num[x]],b+r[num[x]]+);
- a[x]=y;
- }
- inline void Rank()
- {
- int ans=;
- if(num[x]+>=num[y]) {for(int i=x;i<=y;i++) if(a[i]<k) ans++;}
- else
- {
- for(int i=x;i<=r[num[x]];i++) if(a[i]<k) ans++;
- for(int i=l[num[y]];i<=y;i++) if(a[i]<k) ans++;
- for(int i=num[x]+;i<num[y];i++) ans+=lower_bound(b+l[i],b+r[i]+,k)-(b+l[i]);
- }
- printf("%d\n",ans+);
- }
- inline void Kth()
- {
- if(num[x]+>=num[y])
- {
- int en=;
- for(int i=x;i<=y;i++) tmp[++en]=a[i];
- sort(tmp+,tmp+en+);
- printf("%d\n",tmp[k]);
- }
- else
- {
- int L=,R=;
- while(L!=R)
- {
- int mid=L+R>>,cnt=;
- for(int i=x;i<=r[num[x]];i++) if(a[i]<mid) cnt++;
- for(int i=l[num[y]];i<=y;i++) if(a[i]<mid) cnt++; //统计<mid的值数
- for(int i=num[x]+;i<num[y];i++) cnt+=lower_bound(b+l[i],b+r[i]+,mid)-(b+l[i]);
- if(cnt>=k) R=mid;
- else L=mid+;
- }
- printf("%d\n",L-);
- }
- }
- inline void Front()
- {
- int ans=-;int* p;
- if(num[x]+>=num[y]) {for(int i=x;i<=y;i++) if(a[i]>ans && a[i]<k) ans=a[i];}
- else
- {
- for(int i=x;i<=r[num[x]];i++) if(a[i]>ans && a[i]<k) ans=a[i];
- for(int i=l[num[y]];i<=y;i++) if(a[i]>ans && a[i]<k) ans=a[i];
- for(int i=num[x]+;i<num[y];i++)
- {
- p=lower_bound(b+l[i],b+r[i]+,k);
- if(p!=b+l[i] && *(p-)<k && *(p-)>ans) ans=*(p-);
- }
- }
- printf("%d\n",ans);
- }
- inline void Next()
- {
- int ans=;int* p;
- if(num[x]+>=num[y]) {for(int i=x;i<=y;i++) if(a[i]<ans && a[i]>k) ans=a[i];}
- else
- {
- for(int i=x;i<=r[num[x]];i++) if(a[i]<ans && a[i]>k) ans=a[i];
- for(int i=l[num[y]];i<=y;i++) if(a[i]<ans && a[i]>k) ans=a[i];
- for(int i=num[x]+;i<num[y];i++)
- {
- p=upper_bound(b+l[i],b+r[i]+,k);
- if(p!=b+r[i]+ && *p>k && *p<ans) ans=*p;
- }
- }
- printf("%d\n",ans);
- }
- 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("%d%d%d",&op,&x,&y);
- if(op==) Update();
- else
- {
- scanf("%d",&k);
- if(op==) Rank();
- else if(op==) Kth();
- else if(op==) Front();
- else Next();
- }
- }
- return ;
- }
【分块】bzoj3196 Tyvj 1730 二逼平衡树的更多相关文章
- bzoj3196: Tyvj 1730 二逼平衡树 树套树
地址:http://www.lydsy.com/JudgeOnline/problem.php?id=3196 题目: 3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec ...
- 【带修莫队】【权值分块】bzoj3196 Tyvj 1730 二逼平衡树
这题用了三种算法写: 分块+二分:O(n*sqrt(n*log(n)) 函数式权值分块:O(n*sqrt(n)) 带修莫队+权值分块:O(n5/3) 结果……复杂度越高的实际上跑得越快……最后这个竟然 ...
- 【函数式权值分块】【分块】bzoj3196 Tyvj 1730 二逼平衡树
#include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...
- 【线段树套平衡树】【pb_ds】bzoj3196 Tyvj 1730 二逼平衡树
线段树套pb_ds里的平衡树,在洛谷OJ上测试,后三个测试点TLE #include<cstdio> #include<algorithm> #include<ext/p ...
- [bzoj3196]Tyvj 1730 二逼平衡树——线段树套平衡树
题目 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查 ...
- BZOJ3196: Tyvj 1730 二逼平衡树
传送门 主席树的常数蜜汁优越,在BZOJ上跑了rnk1. 做法很简单,主席树套BIT. 1-3做法很简单,第四个和第五个做法转换成前两个就行了. //BZOJ 3196 //by Cydiater / ...
- [bzoj3196][Tyvj 1730][二逼平衡树] (线段树套treap)
Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查询k在 ...
- bzoj 3196 Tyvj 1730 二逼平衡树(线段树套名次树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1807 Solved: 772[Submit][Stat ...
- BZOJ 3196: Tyvj 1730 二逼平衡树( 树套树 )
这道题做法应该很多吧.... 我用了线段树套treap.... -------------------------------------------------------------------- ...
随机推荐
- HDU2732:Leapin' Lizards(最大流)
Leapin' Lizards Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- ZOJ3261:Connections in Galaxy War(逆向并查集)
Connections in Galaxy War Time Limit: 3 Seconds Memory Limit: 32768 KB 题目链接:http://acm.zju.edu. ...
- NOIP2003 神经网络(bfs)
NOIP2003 神经网络 题目背景: 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应 ...
- E. Intercity Travelling
E. Intercity Travelling time limit per test 1.5 seconds memory limit per test 256 megabytes input st ...
- ios webapp调试神器MIHTool
android平台有直接用chrome beta就可以调试,具体操作办法可以查看这篇教程<Android 设备 Chrome 远程调试>Mac的高富帅直接可以用safari提供“web检查 ...
- 对比append插入数据产生的redo量
--版本信息 SELECT * FROM v$version; Oracle - Prod PL - Production CORE Production TNS - Production NLSRT ...
- (转)Python中实现带Cookie的Http的Post请求
转自crifan: http://www.crifan.com/python_http_post_request_with_cookie/ . . . .
- OpenStack搭建glance
1.创建数据库 mysql -uroot -p create database glance; grant all privileges on glance.* to glance@'localhos ...
- Iframe跨域嵌入页面自动调整高度的办法
http://www.a.com/A.html http://www.a.com/B.html http://www.a.com/D.js http://www.c.com/C.html A.html ...
- UVa 12265 贩卖土地 单调栈
题意 输入一个\(n\times m\)的矩阵,每个格子可能是空地,也可能是沼泽.对于每个空地格子,求出以它为右下角的空矩形的最大周长,然后统计每个周长出现了多少次. 思路 对于 每一行 每两个沼泽之 ...