排列 线段树
来源:互联网 发布:sql 小计 合计 编辑:程序博客网 时间:2024/06/13 16:42
额,昨天题目太难,所以没写总结,惭愧。最近老考线段树。
题目大意:给一段序列的逆序对前缀和,现在要求出这个序列;
分析:,不难看出从后往前推,i-p[i]就是这个数在前面排第几大,于是我们只需要找出序列中第几大的位置,放进去打个标记就好了,线段树维护。
# include <iostream># include <cstdio># include <cmath># include <list># include <cstring># include <map># include <ctime># include <algorithm># include <queue>using namespace std;typedef long long ll;int read(){ register int f=1,i=0;char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9') {i=(i<<3)+(i<<1)+ch-'0';ch=getchar();} return f*i;}int tr[100005<<2];ll n,m,p[100005],ans[100005];struct seg{ inline void change(int k){ tr[k]=tr[k<<1]+tr[k<<1|1]; } inline void build(int k,int l,int r){ if(l==r){tr[k]=1;return ;} int mid=l+r>>1; build(k<<1,l,mid);build(k<<1|1,mid+1,r); change(k); } inline int query(int k,int l,int r,int x){ if(l==r){tr[k]=0;return l;} int mid=l+r>>1,tmp; if(x<=tr[k<<1]) tmp=query(k<<1,l,mid,x); else tmp=query(k<<1|1,mid+1,r,x-tr[k<<1]); change(k);return tmp; }}Seg;int main(){ n=read(); for(int i=1;i<=n;++i) p[i]=read(); for(int i=n;i;--i) p[i]-=p[i-1]; Seg.build(1,1,n); for(int i=n;i;--i) ans[i]=Seg.query(1,1,n,i-p[i]); for(int i=1;i<=n;++i) cout<<ans[i]<<" ";}
阅读全文
0 0
- 排列 线段树
- NOIP模拟 排列【权值线段树】
- [HDU 1394]求全排列逆序数最大值[线段树]
- UVA 11525 好大好大的排列(线段树)
- 51nod-1364 最大字典序排列(线段树)
- HDU 4006 POJ 2828 线段树(排列/找有序位置)
- HDU 5172 GTY's gay friends 线段树(排列,区间不同的数)
- hdu 1394 Minimum Inversion Number 用线段树求0到n-1的排列的逆序数
- 线段树?线段树!
- 线段树?线段树!
- 线段_线段树
- 线段_线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 谈谈jsp中的静态包含和动态包含
- 5.1 从键盘任意输入一个实数,不适用计算绝对值函数编程计算并是输出这个数的结对值。
- iOS diff: /../Podfile.lock: No such file or directory~ 解决方法
- 日常笔记之Android属性
- 采样率与频率之间的关系
- 排列 线段树
- HDU-2005(第几天)
- TOMCAT内核之旅--连接器(Connector)--学习心得(三)
- html&css----------列表、表格和表单(11/4)
- Traceback (most recent call last): File "../zubax_chibios/tools/make_boot_descriptor.py", line 251
- 桥接和hostonly虚拟网络配置
- HDU-2006(求奇数的乘积)
- CS 400 Late Edges BFS+优先队列
- 用java绘制登录时验证码