博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 2665 划分树
阅读量:6440 次
发布时间:2019-06-23

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

開始用线段树+归并排序,4700+ms飘过~,后来去学划分树。尽管还不是非常懂,只是就这样吧

#include
#include
#define maxn 100010using namespace std;int n,m;int nsort[maxn];int nleft[30][maxn],tree[30][maxn];void build(int l,int r,int c){ if(l==r) return; int mid=(l+r)/2; int sum=mid-l+1; for(int i=l;i<=r;i++) { if(tree[c][i]
0) tree[c+1][ll++]=tree[c][i],sum--; else tree[c+1][rr++]=tree[c][i]; nleft[c][i]=nleft[c][l-1]+ll-l; } build(l,mid,c+1); build(mid+1,r,c+1);}int que(int l,int r,int a,int b,int k,int c){ if(a==b) return tree[c][a]; int mid=(l+r)/2; int cnt=nleft[c][b]-nleft[c][a-1]; if(cnt>=k) { int nl=l+nleft[c][a-1]-nleft[c][l-1]; int nr=nl+cnt-1; return que(l,mid,nl,nr,k,c+1); } else { int nr=b+nleft[c][r]-nleft[c][b]; int nl=nr-(b-a-cnt); return que(mid+1,r,nl,nr,k-cnt,c+1); }}int main(){ cin.sync_with_stdio(false); int t; cin>>t; while(t--) { cin>>n>>m; for(int i=1;i<=n;i++) { cin>>tree[0][i]; nsort[i]=tree[0][i]; } sort(nsort+1,nsort+n+1); build(1,n,0);//l,r,层。 while(m--) { int a,b,k; cin>>a>>b>>k; cout<
<

转载地址:http://htdwo.baihongyu.com/

你可能感兴趣的文章
Elasticsearch之curl删除
查看>>
Apache Spark 内存管理详解(转载)
查看>>
JS隐藏号码中间4位
查看>>
windows下安装Rabbitmq详解
查看>>
HTTP协议中POST、GET、HEAD、PUT等请求方法以及一些常见错误
查看>>
SQL Server索引 - 索引(物化)视图 <第九篇>
查看>>
[原创]FineUI秘密花园(一) — 为什么选择FineUI?
查看>>
这一文让你彻底理解Spring框架的意义
查看>>
消息中间件Kafka与RabbitMQ谁更胜一筹?
查看>>
CanisMinor 微信小程序工程
查看>>
手机拍照,调取相册 裁剪,上传
查看>>
当移动数据分析需求遇到Quick BI
查看>>
八皇后,回溯与递归(Python实现)
查看>>
程序员的微创业
查看>>
什么是以太坊
查看>>
刷前端面经笔记(九)
查看>>
针对前端开发可重用组件并发布到NPM
查看>>
Android组件化探索与实践
查看>>
开发笔记2 | Java 代码规约第1条
查看>>
Vue.js 子组件的异步加载及其生命周期控制-------异步加载子组件,子组件的生命周期控制过程不一样...
查看>>