划分树C++版百度百科模板
2015-10-09 12:47
399 查看
此代码同hdu2665改编 #include <iostream> #include <cstdio> #include<cstring> #include <algorithm> using namespace std; #define N 100500 #define MID ((l+r)>>1) int a ,s ,t[20] ,num[20] ,n,m; void Build(int c,int l,int r) { int lm=MID-l+1,lp=l,rp=MID+1; for(int i=l;i<=MID;i++) lm-=s[i]<s[MID]; for(int i=l;i<=r;i++) { if( i==l ) num[c][i]=0; else num[c][i]=num[c][i-1]; if( t[c][i]==s[MID] ) { if( lm ) { lm--; num[c][i]++; t[c+1][lp++]=t[c][i]; } else t[c+1][rp++]=t[c][i]; } else if( t[c][i]<s[MID] ) { num[c][i]++; t[c+1][lp++]=t[c][i]; } else t[c+1][rp++]=t[c][i]; } if( l<r ) Build(c+1,l,MID),Build(c+1,MID+1,r); } int Query(int c,int l,int r,int ql,int qr,int k) { if( l==r ) return t[c][l]; int s,ss; if( l==ql ) s=0,ss=num[c][qr]; else s=num[c][ql-1],ss=num[c][qr]-num[c][ql-1]; if( k<=ss ) return Query(c+1,l,MID,l+s,l+s+ss-1,k); else return Query(c+1,MID+1,r,MID+1+ql-l-s,MID+1+qr-l-s-ss,k-ss); } int main() { scanf("%d%d",&n,&m); memset(t,0,sizeof(t)); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); s[i]=t[0][i]=a[i]; } sort(s+1,s+1+n); Build(0,1,n); while( m-- ) { int l,r,k; scanf("%d%d%d",&l,&r,&k); printf("%d\n",Query(0,1,n,l,r,k)); } return 0; }
相关文章推荐
- 字符转二进制_C++实现
- C++第四课 选择结构
- C++ string
- C/C++语言中关于const用法的总结
- C++中using的作用
- 探讨C++内存回收
- C语言实现二叉树-02版
- C++ 文件名和 路径
- 链式循环队列实现(C语言)
- 20.OC语言构造方法
- gcc 嵌入式汇编(asm)实现bsr(位扫描)指令
- 【c++】vector用法
- 如何将CUDA 导入已有的C++工程中
- 字符串匹配 sunday算法
- C++ 单冒号: 和双冒号:: 的作用
- C++ typedef用法小结
- C语言库,库函数,数据类型
- C++中的指针与引用、如何参数传递
- C++中的指针与引用、如何参数传递
- C++的可移植性和跨平台开发