博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[NEERC 2004] K小数
阅读量:4508 次
发布时间:2019-06-08

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

  主席树模板。

  注意内存,每次 insert 会增加 log2n<<1 个节点,初始化线段树有 n<<2 个节点。

  总结点数 = ( n<<2 ) + ( n * log2n<<1 )。

  C++没有计算 log2() 的函数,但提供了 log10(),根据换底公式 log2n = log10n / log102。

// q.c#include
#include
#include
#include
#include
using namespace std;const int M=100000+10;/************************************************************************/int cnt,lc[M<<5],rc[M<<5],s[M<<5],L[M<<5],R[M<<5];void build(int &o,int l,int r) { if(!o) o=++cnt; L[o]=l,R[o]=r; if(l==r) return ; int mid=(l+r)>>1; build(lc[o],l,mid),build(rc[o],mid+1,r);}void cpy(int x,int y) { lc[x]=lc[y],rc[x]=rc[y],s[x]=s[y],L[x]=L[y],R[x]=R[y];}void UP(int o) { s[o]=s[lc[o]]+s[rc[o]];}void insert(int &o,int p,int x) { if(!o) o=++cnt; cpy(o,p); if(L[o]==R[o]) { s[o]++; return ; } int mid=(L[o]+R[o])>>1; if(x<=mid) lc[o]=0,insert(lc[o],lc[p],x); else rc[o]=0,insert(rc[o],rc[p],x); UP(o);}int query(int o,int p,int k) { if(L[o]==R[o]) return L[o]; int tmp=s[lc[o]]-s[lc[p]]; if(k<=tmp) return query(lc[o],lc[p],k); else return query(rc[o],rc[p],k-tmp);}/************************************************************************/struct Data { int x,y; bool operator < (const Data &A) const { if(x!=A.x) return x

 

转载于:https://www.cnblogs.com/qjs12/p/8898426.html

你可能感兴趣的文章
[No0000B7]If else 与 三元表达式? : 效率对比
查看>>
python中的可迭代对象与迭代器
查看>>
WebKit的已实施srcset图像响应属性
查看>>
suggestion开发小结以及 对键盘事件的总结(针对中文输入法状态)
查看>>
Nio Client
查看>>
数据库 chapter 16 XML数据库
查看>>
spring mvc jsp运行不起来的问题
查看>>
大数据概述
查看>>
SpringBoot 密码MD5加密
查看>>
Mac MySQL启动不了解决办法(MySQL卸载重新安装教程)
查看>>
连通块
查看>>
servlet.txt笔记
查看>>
jquery设置select选中
查看>>
今天说一下DML触发器的顺序
查看>>
Memcached学习(一)--网络模型
查看>>
FragmentTransaction add 和 replace 区别 转
查看>>
jQuery 效果方法
查看>>
STM32物联网通信WIFI
查看>>
java反射案例详解
查看>>
MAGENTO 与 reindexer
查看>>