BZOJ4923 K小值查询(splay)
容易想到建一棵平衡树,修改时打上标记即可。但是修改会导致平衡树结构被破坏。注意到实际上只有[k+1,2k)这一部分数在平衡树中的位置会被改变,所以对这一部分暴力修改,因为每次都会使其至少减小一半,复杂度非常正确。
开始写的玩意一个点要跑10s吓到我了,卡了半天常(最后也只是在darkbzoj上过了)造了半天bug,调的欲仙欲死,退役了。
- #include<iostream>
- #include<cstdio>
- #include<cmath>
- #include<cstdlib>
- #include<cstring>
- #include<algorithm>
- #include<cassert>
- using namespace std;
- #define ll long long
- #define N 100010
- #define inf 2000000001
- #define lson tree[k].ch[0]
- #define rson tree[k].ch[1]
- char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
- int gcd(int n,int m){return m==?n:gcd(m,n%m);}
- int read()
- {
- int x=,f=;char c=getchar();
- while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
- while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
- return x*f;
- }
- int n,m,a[N],root,cnt;
- struct data{int x,ch[],fa,s,lazy;
- }tree[N<<];
- inline void up(int k){tree[k].s=tree[lson].s+tree[rson].s+;}
- inline void update(int k,int x){if (k) {if (tree[k].x<inf) tree[k].x-=x;tree[k].lazy+=x;}}
- inline void down(int k){if (tree[k].lazy) update(lson,tree[k].lazy),update(rson,tree[k].lazy),tree[k].lazy=;}
- inline void push(int k){if (tree[k].fa) push(tree[k].fa);down(k);}
- inline int whichson(int k){return tree[tree[k].fa].ch[]==k;}
- inline void move(int k)
- {
- int fa=tree[k].fa,gf=tree[fa].fa,p=whichson(k);
- tree[gf].ch[whichson(fa)]=k,tree[k].fa=gf;
- tree[fa].ch[p]=tree[k].ch[!p],tree[tree[k].ch[!p]].fa=fa;
- tree[k].ch[!p]=fa,tree[fa].fa=k;
- up(fa),up(k);
- }
- void splay(int k,int rt)
- {
- push(k);
- while (tree[k].fa!=rt)
- {
- int fa=tree[k].fa;
- if (tree[fa].fa!=rt)
- if (whichson(k)^whichson(fa)) move(k);
- else move(fa);
- move(k);
- }
- if (!rt) root=k;
- }
- void build(int &k,int l,int r)
- {
- if (l>r) return;
- int mid=l+r>>;
- k=++cnt;tree[k].x=a[mid],tree[k].s=r-l+;
- build(lson,l,mid-);build(rson,mid+,r);
- tree[lson].fa=tree[rson].fa=k;
- }
- int find(int k,int x)
- {
- if (tree[lson].s+==x) return k;
- down(k);
- if (tree[lson].s+>x) return find(lson,x);
- else return find(rson,x-tree[lson].s-);
- }
- int qsuf(int k,int x)
- {
- if (!k) return ;
- down(k);
- if (tree[k].x<x) return qsuf(rson,x);
- else
- {
- int t=qsuf(lson,x);
- return t&&tree[t].x<=tree[k].x?t:k;
- }
- }
- int qpre(int k,int x)
- {
- if (!k) return ;
- down(k);
- if (tree[k].x>x) return qpre(lson,x);
- else
- {
- int t=qpre(rson,x);
- return t&&tree[t].x>=tree[k].x?t:k;
- }
- }
- void ins(int x)
- {
- int k=root,fa=;
- while (k) down(k),tree[k].s++,fa=k,k=tree[k].x<=x?rson:lson;
- k=++cnt;tree[k].x=x,tree[k].s=,tree[k].fa=fa,tree[fa].ch[tree[fa].x<=x]=k;
- splay(k,);
- }
- void dfs(int k,int x)
- {
- if (!k) return;
- down(k);
- ins(tree[k].x-x);
- dfs(lson,x),dfs(rson,x);
- }
- void modify(int x)
- {
- int p=qpre(root,x),q=qsuf(root,*x);
- splay(p,);splay(q,p);
- int k=tree[q].ch[];tree[q].ch[]=;up(q);up(p);update(q,x);
- dfs(k,x);
- }
- int main()
- {
- #ifndef ONLINE_JUDGE
- freopen("bzoj4923.in","r",stdin);
- freopen("bzoj4923.out","w",stdout);
- const char LL[]="%I64d\n";
- #else
- const char LL[]="%lld\n";
- #endif
- n=read(),m=read();
- for (int i=;i<=n;i++) a[i]=read();
- a[]=,a[n+]=inf;sort(a,a+n+);
- build(root,,n+);
- for (int i=;i<=m;i++)
- {
- int op=read(),x=read();
- if (op==) printf("%d\n",tree[find(root,x+)].x);
- else modify(x);
- }
- return ;
- }
BZOJ4923 K小值查询(splay)的更多相关文章
- BZOJ4923:[Lydsy1706月赛]K小值查询(Splay)
Description 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有严格大于k的数a_i减去k. In ...
- BZOJ 4923: [Lydsy1706月赛]K小值查询 Splay + 思维
Description 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有严格大于k的数a_i减去k. In ...
- [bzoj4923]K小值查询
来自FallDream的博客,未经允许,请勿转载,谢谢. 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有 ...
- [BZ4923][Lydsy1706月赛]K小值查询
K小值查询 题面 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有严格大于k的数a_i减去k. Input ...
- BZOJ4923 [Lydsy1706月赛]K小值查询
题意 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有严格大于k的数a_i减去k. \(n \leq 10 ...
- 4923: [Lydsy1706月赛]K小值查询 平衡树 非旋转Treap
国际惯例的题面:这种维护排序序列,严格大于的进行操作的题都很套路......我们按照[0,k],(k,2k],(2k,inf)分类讨论一下就好.显然第一个区间的不会变化,第二个区间的会被平移进第一个区 ...
- [BZOJ 4923][Lydsy1706月赛]K小值查询
传送门 势能分析平衡树,splay或treap都可以 放个指针版的就跑 #include <bits/stdc++.h> using namespace std; #define rep( ...
- 【BZOJ】3065: 带插入区间K小值
http://www.lydsy.com/JudgeOnline/problem.php?id=3065 题意:带插入.修改的区间k小值在线查询.(原序列n<=35000, 询问<=175 ...
- 「BZOJ3065」带插入区间第K小值 替罪羊树×线段树
题目描述 从前有\(n\)只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力\(a_i\).跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间\(k\)小值.他 ...
随机推荐
- MySQL入门篇(七)之Xtrabackup备份与恢复
一.Xtrabackup介绍 MySQL冷备.mysqldump.MySQL热拷贝都无法实现对数据库进行增量备份.在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况 ...
- 基于MapReduce的(用户、物品、内容)的协同过滤推荐算法
1.基于用户的协同过滤推荐算法 利用相似度矩阵*评分矩阵得到推荐列表 已经推荐过的置零 2.基于物品的协同过滤推荐算法 3.基于内容的推荐 算法思想:给用户推荐和他们之前喜欢的物品在内容上相似的物品 ...
- 深入了解MySQL存储索引
(一)关于存储引擎 创建合适的索引是SQL性能调优中最重要的技术之一.在学习创建索引之前,要先了解MySql的架构细节,包括在硬盘上面如何组织的,索引和内存用法和操作方式,以及存储引擎的差异如何影响到 ...
- MySQL-MMM方案
参考文档: 官方文档:http://mysql-mmm.org/mmm2:guide 本文对mmm方案做简单介绍,并做1个简单的验证. 一.MySQL-MMM方案 1. MMM方案简介 MMM(Mul ...
- 53. [LeetCode] Maximum Subarray
Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...
- 复利计算器app发布
复利计算器app发布 抱歉:由于无法实现服务端的持续开启,发布的app仅为简单的单机版,暂时舍弃了c/s版本的一些功能,如:投资动态管理功能. 应用详情博客:请点击这里 apk下载地址1(百度手机助手 ...
- 【转】nodeJs学习之项目结构
新建的项目结构应该是这样 bin:项目的启动文件,也可以放其他脚本. node_modules:用来存放项目的依赖库. public:用来存放静态文件(css,js,img). routes:路由控制 ...
- FivePlus——成果展示
思路描述:描述对于自己此次任务是如何思考的 这次作业没能帮上什么忙,刚开始还对这次作业有所期待,然而,第一次听他们讨论的时候就??? 之后又去查了一些诸如贪吃蛇类的小游戏,知道大概可以达成什么效果,但 ...
- 字典树---2001 POJ Shortest Prefixes(找最短前缀)
做的第一道字典树的题,算比较水的: -->>>:传送门 代码: #include <stdio.h> #include<stdlib.h> #define M ...
- c#程序的阅读
1 .程序是为表示两个连续的整数不能被整除. 2 ,3 程序黑框得不出结果,所以不知道具体的结果和运行时间. 4 采用更好的专用电脑进行计算.