【权值分块】bzoj1861 [Zjoi2006]Book 书架
权值分块……rank3……没什么好说的。
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int n,sz,sum,x,y,l[],r[],Min,Max,sumv[],num[],m,v[],p[];
bool b[];
char op[],c;
int Num,CH[],f;
inline void R(int &x){
c=;f=;
for(;c<''||c>'';c=getchar())if(c=='-')f=-;
for(x=;c>=''&&c<='';c=getchar())(x*=)+=(c-'');
x*=f;
}
inline void P(int x)
{
if(!x){putchar('');puts("");return;}
if(x<){putchar('-');x=-x;}Num=;
while(x>)CH[++Num]=x%,x/=;
while(Num)putchar(CH[Num--]+);puts("");
}
void makeblock(const int &LIMIT)
{
sz=sqrt((double)LIMIT*0.9); if(!sz) sz=;
for(sum=;sum*sz<LIMIT;++sum)
{
l[sum]=r[sum-]+;
r[sum]=sum*sz;
for(int i=l[sum];i<=r[sum];++i) num[i]=sum;
}
l[sum]=r[sum-]+;
r[sum]=LIMIT;
for(int i=l[sum];i<=r[sum];++i) num[i]=sum;
}
inline void Insert(const int &x){b[x]=; ++sumv[num[x]];}
inline void Delete(const int &x){b[x]=; --sumv[num[x]];}
inline int Next(const int &x)
{
for(int i=x+;i<=r[num[x]];++i) if(b[i]) return i;
for(int i=num[x]+;;++i) if(sumv[i])
for(int j=l[i];;++j)
if(b[j]) return j;
}
inline int Pre(const int &x)
{
for(int i=x-;i>=l[num[x]];--i) if(b[i]) return i;
for(int i=num[x]-;;--i) if(sumv[i])
for(int j=r[i];;--j)
if(b[j]) return j;
}
inline int Rank(const int &x)
{
int cnt=;
for(int i=num[Min];i<num[x];++i) cnt+=sumv[i];
for(int i=l[num[x]];i<x;++i) cnt+=b[i];
return cnt;
}
inline int Kth(const int &x)
{
int cnt=;
for(int i=num[Min];;++i)
{
cnt+=sumv[i];
if(cnt>=x)
{
cnt-=sumv[i];
for(int j=l[i];;++j)
{cnt+=b[j]; if(cnt==x) return j;}
}
}
}
int main()
{
R(n); R(m); makeblock(n+(m<<));
for(int i=;i<=n;++i)
{
R(v[i+m]);
Insert(p[v[i+m]]=i+m);
} Min=+m; Max=n+m;
for(int i=;i<=m;++i)
{
scanf("%s",op); R(x);
if(op[]=='T')
{
Delete(p[x]);
v[p[x]=--Min]=x;
Insert(Min);
}
else if(op[]=='B')
{
Delete(p[x]);
v[p[x]=++Max]=x;
Insert(Max);
}
else if(op[]=='I')
{
R(y); if(y==-)
{
swap(v[p[x]],v[Pre(p[x])]);
swap(p[x],p[v[p[x]]]);
}
else if(y==)
{
swap(v[p[x]],v[Next(p[x])]);
swap(p[x],p[v[p[x]]]);
}
}
else if(op[]=='A') P(Rank(p[x]));
else P(v[Kth(x)]);
}
return ;
}
【权值分块】bzoj1861 [Zjoi2006]Book 书架的更多相关文章
- [BZOJ1861][Zjoi2006]Book 书架
[BZOJ1861][Zjoi2006]Book 书架 试题描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候 ...
- 2019.01.08 bzoj3809: Gty的二逼妹子序列(莫队+权值分块)
传送门 题意:多组询问,问区间[l,r]中权值在[a,b]间的数的种类数. 看了一眼大家应该都知道要莫队了吧. 然后很容易想到用树状数组优化修改和查询做到O(mnlogamax)O(m\sqrt nl ...
- 2018.11.07 NOIP训练 L的鞋子(权值分块+莫队)
传送门 乱搞题. 我直接对权值分块+莫队水过了. 不过调了30min30min30min发现ststst表挂了是真的不想说什么233. 代码
- 【莫队算法】【权值分块】bzoj3920 Yuuna的礼物
[算法一] 暴力. 可以通过第0.1号测试点. 预计得分:20分. [算法二] 经典问题:区间众数,数据范围也不是很大,因此我们可以: ①分块,离散化,预处理出: <1>前i块中x出现的次 ...
- 【莫队算法】【权值分块】bzoj3585 mex
orz PoPoQQQ. 本来蒟蒻以为这种离散化以后就对应不起来的题不能权值分块搞的说. ……结果,实际上>n的权值不会对答案作出贡献. #include<cstdio> #incl ...
- 【带修莫队】【权值分块】bzoj3196 Tyvj 1730 二逼平衡树
这题用了三种算法写: 分块+二分:O(n*sqrt(n*log(n)) 函数式权值分块:O(n*sqrt(n)) 带修莫队+权值分块:O(n5/3) 结果……复杂度越高的实际上跑得越快……最后这个竟然 ...
- 【树链剖分】【函数式权值分块】bzoj1146 [CTSC2008]网络管理Network
裸题,直接上.复杂度O(n*sqrt(n)*log(n)). //Num[i]表示树中的点i在函数式权值分块中对应的点 //Map[i]表示函数式权值分块中的点i在树中对应的点 #include< ...
- 【莫队算法】【权值分块】bzoj2223 [Coci 2009]PATULJCI
不带修改主席树裸题<=>莫队+权值分块裸题. 复杂度O(m*sqrt(n)). P.S.题目描述坑爹,第二个数是权值的范围. #include<cstdio> #include ...
- 【函数式权值分块】【分块】bzoj3196 Tyvj 1730 二逼平衡树
#include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...
随机推荐
- eclipse关闭错误警告提示
- centos关闭ipv6
1.使用lsmod查看ipv6的模块是否被加载. lsmod | grep ipv6 [root@dmhadoop011 ~]# lsmod | grep ipv6 ipv6 ...
- matlab求矩阵、向量的模
求矩阵的模: function count = juZhenDeMo(a,b) [r,c] = size(a);%求a的行列 [r1,c1] = size(b);%求b的行列 count = 0; f ...
- es6+最佳入门实践(7)
7.set和map数据结构 7.1.什么是set? Set就是集合,集合是由一组无序且唯一的项组成,在es6中新增了set这种数据结构,有点类似于数组,但是它的元素是唯一的,没有重复 let st = ...
- hdu1527取石子游戏---(威佐夫博弈)
感谢 http://www.cnblogs.com/yuyixingkong/p/3362476.html 取石子游戏 Time Limit: 2000/1000 MS (Java/Others) ...
- [POJ2774]Long Long Message 解题报告
Long Long Message Description The little cat is majoring in physics in the capital of Byterland. A p ...
- JHDU 2601 An easy problem (数学 )
title: An easy problem 数学 杭电2601 tags: [数学] 题目链接 Problem Description When Teddy was a child , he was ...
- bzoj 2151 贪心
几乎完全类似于1150的思路,直接参考那个就行了. http://www.cnblogs.com/BLADEVIL/p/3527193.html /************************** ...
- 在ubuntu 上面安装ubuntu touch 模拟器
Canonical 公司已经发布了一个运行着Unity8和Mir的Ubuntu Touch模拟器.虽然有一些bug,例如在64位的系统上会使系统崩溃,但我们相信这些都会被一 一修复,这篇文章将教大家如 ...
- DECODE 与CASE WHEN 的比较以及用法
1.DECODE 只有Oracle 才有,其它数据库不支持; 2.CASE WHEN的用法, Oracle.SQL Server. MySQL 都支持; 3.DECODE 只能用做相等判断,但是可以配 ...