博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj2182 Lost Cows (线段树)
阅读量:6671 次
发布时间:2019-06-25

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

大意:有一个1-n的排列,数据给出从第二个到第n个数中的每一个数前面有几个数比这个数小,要求还原这个1-n的排列
思路:最近做这种题好像有点感觉了,很自然的想到,我们可以从最后一个数来倒推,一直推出第一个过后就可以完事了。这样的话,我们很容易写出一个N² 的算法。但作为一名OIer,我们要求上进,所以我们就会想,可不可以优化一下呢。其实我们发现,在找前面出现了几个比目标值小的操作很冗余,我们可以考虑用线段树来优化。那么我们就可以在O(NlogN) 的时间内求出来整个序列

代码:

#include
#define MAXN 8005struct node{ int l, r, len;}t[MAXN * 4];void Build(int i, int l, int r){ t[i].l = l, t[i].r = r; t[i].len = r-l+1; if(l == r) return; int mid = (l + r) >> 1; Build(i<<1, l, mid); Build(i<<1|1, mid + 1, r);}int Q(int i, int num){ -- t[i].len; if(t[i].l == t[i].r) return t[i].l; if(num > t[i<<1].len) return Q(i<<1|1, num - t[i<<1].len); else return Q(i<<1, num);}int n, a[MAXN], ans[MAXN];int main(){ scanf("%d", &n); Build(1, 1, n); for(int i = 2; i <= n; i ++) scanf("%d", &a[i]); for(int i = n; i > 0; i --) ans[i] = Q(1, a[i] + 1); for(int i = 1; i <= n; i ++) printf("%d\n", ans[i]);}

转载于:https://www.cnblogs.com/geng4512/p/5296927.html

你可能感兴趣的文章
Android中的File文件存储及读取file中的Bitmap
查看>>
AngularJS(1)中的5种服务
查看>>
android编译
查看>>
开源|基于TensorFlow的聊天机器人-ErGo
查看>>
lucene4.0入门1
查看>>
Svn结合hook实现自动更新及多Project管理更新
查看>>
Java中sleep()与wait()区别
查看>>
大型网站架构演变和知识体系
查看>>
Java垃圾回收机制浅谈
查看>>
自定义NSOperation 操作
查看>>
字符编码-- Unicode(1991年)
查看>>
【加密解密】阴符,阴书,字验
查看>>
【加密解密】数据加密标准DES加密(Javascript实现)
查看>>
第三十六讲:tapestry表单组件详解之PasswordField
查看>>
Easyui datagrid editor 修改DateBox 返回值格式
查看>>
Mybatis技术原理与实践——读书笔记(五)
查看>>
yum error rpmts_HdrFromFdno: V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
查看>>
Access forbidden!
查看>>
码云五周年 —— 善待你的每一行代码
查看>>
Shell脚本踩坑记
查看>>