线段树

方法一:

值域线段树,递归去写的,每次节点存出现次数.

对于几个操作, 1,2 直接加减就好 ; 3,4 操作贪心往某一个方向找 .7也很简单,主要说前驱后继怎么找。我是先找这个数第几小,根据相应关系得出我们需要输出第几小。然后就写了一下 TLE。详见代码一;

解决办法

加入输入外挂 .... 过了.详见代码二。

方法二:

参考了zkw,原来就是递归改为循环,再用到满二叉树性质.有些能够O(1) 求出.

具体做法:先确定范围,让二叉树最后一层节点数>=n.并找到最后一层节点编号 L-R .和前面有sz个节点. 增删我们从 sz+x这个节点开始加上一个数,之后除以2.

再写一个查询最大最小.那个函数传入的是节点编号.所以他可以查询某个子树的max,min.结合到前驱后继。比如查询x前驱,我就从x那个最底层点开始,看我是右儿子?如果是,看左儿子节点有数?有查询那颗子树的max,即为答案,反之也是一样的。最后一个操作直接来。sz+x。对于下标处理原题 [0,n-1] . 线段树 是1开始所以减一莫要忘记.

具体写法,参考代码三。

//代码一
#include <stdio.h> const int maxn=1e6+10; int T[maxn*4];
void ins(int i,int l,int r,int x,int val)// 1 2
{
if(l==r)
{
T[i]=val;
return ;
}
int mid=(l+r)>>1;
if(x<=mid) ins(i<<1,l,mid,x,val);
else ins(i<<1|1,mid+1,r,x,val);
T[i]=T[i<<1]+T[i<<1|1];
}
int fmax(int i,int l,int r)
{
if(T[i]==0) return -1;
if(l==r) return l;
int mid=(l+r)>>1;
if(T[i<<1|1]) return fmax(i<<1|1,mid+1,r);
else return fmax(i<<1,l,mid);
}
int fmin(int i,int l,int r)
{
if(T[i]==0) return -1;
if(l==r) return l;
int mid=(l+r)>>1;
if(T[i<<1]) return fmin(i<<1,l,mid);
else return fmin(i<<1|1,mid+1,r);
} int fx(int i,int l,int r,int x)
{
if(l==r) return T[i]?1:-1;
int mid=(l+r)>>1;
if(x<=mid) return fx(i<<1,l,mid,x);
else return fx(i<<1|1,mid+1,r,x);
} bool flag;
int kth(int i,int l,int r,int x)
{
if(l==r)
{
flag=T[i];
return T[i];
}
int mid=(l+r)>>1;
if(x<=mid) return kth(i<<1,l,mid,x);
else return T[i<<1]+kth(i<<1|1,mid+1,r,x);
} int fkth(int i,int l,int r,int k)
{
if(l==r)
{
if(T[i]) return l;
else return -1;
}
int mid=(l+r)>>1;
int sum=T[i<<1];
if(sum>=k) return fkth(i<<1,l,mid,k);
else return fkth(i<<1|1,mid+1,r,k-sum);
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
while(m--)
{
int op,x;
scanf("%d",&op);
if(op==3||op==4) ;
else scanf("%d",&x); if(op==1) ins(1,-1,n+1,x,1);
else if(op==2) ins(1,-1,n+1,x,0);
else if(op==3) printf("%d\n",fmin(1,-1,n+1));
else if(op==4) printf("%d\n",fmax(1,-1,n+1));
else if(op==5)
{
int k=kth(1,-1,n+1,x);
//printf("k=%d flag=%d\n",k,flag?1:0);
if(flag) k--;
printf("%d\n",fkth(1,-1,n+1,k));
}
else if(op==6)
{
int k=kth(1,-1,n+1,x);
k++;
printf("%d\n",fkth(1,-1,n+1,k));
}
else printf("%d\n",fx(1,-1,n+1,x));
}
return 0;
} /* 10 100
1 2
1 4
1 6
1 8
1 10 */
//代码二
#include <stdio.h> const int maxn=1e6+10;
inline char nc()
{
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int sc()
{
char ch=nc();
int sum=0;
while(!(ch>='0'&&ch<='9'))ch=nc();
while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc();
return sum;
} int T[maxn*4];
void ins(int i,int l,int r,int x,int val)// 1 2
{
if(l==r)
{
T[i]=val;
return ;
}
int mid=(l+r)>>1;
if(x<=mid) ins(i<<1,l,mid,x,val);
else ins(i<<1|1,mid+1,r,x,val);
T[i]=T[i<<1]+T[i<<1|1];
}
int fmax(int i,int l,int r)
{
if(T[i]==0) return -1;
if(l==r) return l;
int mid=(l+r)>>1;
if(T[i<<1|1]) return fmax(i<<1|1,mid+1,r);
else return fmax(i<<1,l,mid);
}
int fmin(int i,int l,int r)
{
if(T[i]==0) return -1;
if(l==r) return l;
int mid=(l+r)>>1;
if(T[i<<1]) return fmin(i<<1,l,mid);
else return fmin(i<<1|1,mid+1,r);
} int fx(int i,int l,int r,int x)
{
if(l==r) return T[i]?1:-1;
int mid=(l+r)>>1;
if(x<=mid) return fx(i<<1,l,mid,x);
else return fx(i<<1|1,mid+1,r,x);
} bool flag;
int kth(int i,int l,int r,int x)
{
if(l==r)
{
flag=T[i];
return T[i];
}
int mid=(l+r)>>1;
if(x<=mid) return kth(i<<1,l,mid,x);
else return T[i<<1]+kth(i<<1|1,mid+1,r,x);
} int fkth(int i,int l,int r,int k)
{
if(l==r)
{
if(T[i]) return l;
else return -1;
}
int mid=(l+r)>>1;
int sum=T[i<<1];
if(sum>=k) return fkth(i<<1,l,mid,k);
else return fkth(i<<1|1,mid+1,r,k-sum);
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
while(m--)
{
int op,x;
op=sc();
if(op==3||op==4) ;
else x=sc(); if(op==1) ins(1,-1,n+1,x,1);
else if(op==2) ins(1,-1,n+1,x,0);
else if(op==3) printf("%d\n",fmin(1,-1,n+1));
else if(op==4) printf("%d\n",fmax(1,-1,n+1));
else if(op==5)
{
int k=kth(1,-1,n+1,x);
//printf("k=%d flag=%d\n",k,flag?1:0);
if(flag) k--;
printf("%d\n",fkth(1,-1,n+1,k));
}
else if(op==6)
{
int k=kth(1,-1,n+1,x);
k++;
printf("%d\n",fkth(1,-1,n+1,k));
}
else printf("%d\n",fx(1,-1,n+1,x));
}
return 0;
} /* 10 100
1 2
1 4
1 6
1 8
1 10 */
//代码三
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
const int maxn=1e6+10;
int T[maxn*4],sz,L,R;
void ins(int i,int val)
{
i=i+sz;
if(T[i]==1&&val==1) return ;
if(T[i]==0&&val==-1) return ;
for(;i>0;i>>=1) T[i]+=val;
}
int fmax(int i)
{
if(T[i]==0) return 0;
while(i<=sz)
{
if(T[i<<1|1]) i=i<<1|1;
else i=i<<1;
}
return i-sz;
}
int fmin(int i)
{
if(T[i]==0) return 0;
while(i<=sz)
{
if(T[i<<1]) i=i<<1;
else i=i<<1|1;
}
return i-sz;
}
int fpre(int i)
{
i=i+sz;
for(;i!=1;i>>=1)
if((i&1)&&T[i^1]) return fmax(i^1);
return 0;
}
int fsuc(int i)
{
i=i+sz;
for(;i!=1;i>>=1)
if(!(i&1)&&T[i^1]) return fmin(i^1);
return 0;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
sz=0;
for(int i=1;i<n;i=(i<<1))
{
sz+=i;
L=sz+1;
R=sz+(i<<1);
}
while(m--)
{
int op,x;
scanf("%d",&op);
if(op==3||op==4);
else scanf("%d",&x);
x++;
if(op==1) ins(x,1);
else if(op==2) ins(x,-1);
else if(op==3) printf("%d\n",fmin(1)-1);
else if(op==4) printf("%d\n",fmax(1)-1);
else if(op==5) printf("%d\n",fpre(x)-1);
else if(op==6) printf("%d\n",fsuc(x)-1);
else printf("%d\n",T[sz+x]?1:-1);
}
return 0;
}

bzoj 3685的更多相关文章

  1. BZOJ 3685: 普通van Emde Boas树( 线段树 )

    建颗权值线段树就行了...连离散化都不用... 没加读入优化就TLE, 加了就A掉了...而且还快了接近1/4.... ---------------------------------------- ...

  2. bzoj 3685: 普通van Emde Boas树

    3685: 普通van Emde Boas树 Description 设计数据结构支持:1 x  若x不存在,插入x2 x  若x存在,删除x3    输出当前最小值,若不存在输出-14    输出当 ...

  3. 【模板】BZOJ 3685: 普通van Emde Boas树——Treap

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3685 据说神犇都是用zkw线段树水过的啊... 我蒟蒻只会写treap,加了fread之后8 ...

  4. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  5. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  6. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  7. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  8. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  9. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

随机推荐

  1. c# using三种用法

    http://www.cnblogs.com/fashui/archive/2011/09/29/2195061.html http://www.cnblogs.com/iamv/archive/20 ...

  2. VS2010编译OpenSSL(两个版本)

    第一个版本: 编译工具 VS2010 OpenSSL版本 openssl-1.0.0a 下载 OpenSSL http://www.openssl.org/ 下载 from http://www.ac ...

  3. 网络工具的瑞士军刀netcat

    这是一个聒噪的夜晚,假设要给出个原因.可能是由于尽管我认为西班牙不纯粹,可是怎么也不至于干为人家搭台面自己不唱戏的角色吧..结束以后.我认为该玩一下素有网络瑞士军刀之称谓的netcat了. 尽管瑞士军 ...

  4. 机器学习实战之SVM

    一引言: 支持向量机这部分确实很多,想要真正的去理解它,不仅仅知道理论,还要进行相关的代码编写和测试,二者想和结合,才能更好的帮助我们理解SVM这一非常优秀的分类算法 支持向量机是一种二类分类算法,假 ...

  5. Tomcat安装与IDEA中的配置

    下载Tomcat 先从http://tomcat.apache.org/上下载tomcat9,根据你的系统版本来下载. 本地安装 下载之后解压到你的软件安装目录中,这是我的例子: 然后设置环境变量,如 ...

  6. VIM中保存编辑的只读文件

    如何在VIM中保存编辑的只读文件 你是否会和我一样经常碰到这样的情景:在VIM中编辑了一个系统配置文件,当需要保存时才发现当前的用户对该文件没有写入的权限.如果已 经做了很多修改,放弃保存的确很懊恼, ...

  7. 1-1:CSS3课程入门之属性选择器

    div[name=jewave] 选取属性名为name且属性值是"jewave"的元素 div[name^=jewave]选取属性名为name且属性值以"jewave&q ...

  8. ArrayList和Vector的区别?HashMap和HashTable的区别?StringBuilder、StringBuffer和String的区别?

    ArrayList和Vector的区别?从两个方面 1.同步性:ArrayList是线程不安全的,是非同步的:Vector是线程安全的,是同步的.(Java中线程的同步也就满足了安全性) 2.数值增长 ...

  9. 一步一步 在mac上安装ubuntu

    做为程序猿的你,一定听说过Linux甚至很喜欢Linux. 近期买了一台mac air,我很喜欢苹果的工艺,但作为屌丝程序猿,我依然喜欢基于Linux内核的Ubuntu 进行开发.以下我就讲述一步一步 ...

  10. 帝国CMS万能标签ecmsinfo介绍

    带模板的信息调用标签:[万能标签](ecmsinfo) 标签名称: 带模板的信息调用标签 (sys_GetEcmsInfo) 格式:[ecmsinfo]栏目ID/专题ID, 显示条数, 标题截取数, ...