hdu5592&bestcoder Round #65 1003题
来源:互联网 发布:下载免费炒股软件 编辑:程序博客网 时间:2024/05/22 08:22
题目大意:
ZYB's Premutation
Accepts: 218
Submissions: 983
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 131072/131072 K (Java/Others)
问题描述
ZYBZYB有一个排列PPP,但他只记得PPP中每个前缀区间的逆序对数,现在他要求你还原这个排列.(i,j)(i<j)(i,j)(i < j)被称为一对逆序对当且仅当Ai>AjA_i>A_j
输入描述
第一行一个整数TTT表示数据组数。接下来每组数据:第一行一个正整数NN,描述排列的长度.第二行NN个正整数AiA_i,描述前缀区间[1,i][1,i]的逆序对数.数据保证合法.1≤T≤5,1≤N≤500001 \leq N \leq 50000
输出描述
TT行每行NN个整数表示答案的排列.
输入样例
130 1 2
输出样例
3 1 2这题是个cf的原题,要利用结点的数据,来找区间的标记。考的很灵活。解题思路: 利用线段树求逆序数,还原整个排列。首先设fif_i是第ii个前缀的逆序对数,pip_i是第ii个位置上的数,则fi−fi−1是ii前面比pip_i大的数的个数.我们考虑倒着做,当我们处理完iii后面的数,第iii个数就是剩下的数中第fi−fi−1+1f_i-f_{i-1}+1大的数。再利用线段树。 首先线段树每个结点表示的是区间长度。每次查询线段树,先访问右区间,因为右区间里表才是表示倒着数的大的数,若右区间的此时的长度不够fi−fi−1+1,说明此时这个数不在左边的区间,则去查询左边区间。但要右边减去区间的长度。因为此时找的是左边的区间第几大的数,直到找到叶子结点。记录它的左端点,就是当前第的位置应该放的数。#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>using namespace std;const int maxn=50000+1000;int a[maxn],ans[maxn],t,n,p;int sum[maxn<<4];void build(int o,int L,int R){ int M=L+(R-L)/2; if(L==R) sum[o]=1; else { build(o*2,L,M); build(o*2+1,M+1,R); sum[o]=sum[o*2]+sum[o*2+1]; }}int query(int o,int L,int R,int p){ int M=L+(R-L)/2; if(L==R) { sum[o]=0; return L; } int ret; if(sum[o*2+1]>=p) ret=query(o*2+1,M+1,R,p); else ret=query(o*2,L,M,p-sum[o*2+1]);//右区间要剪掉此时左边的值 sum[o]=sum[o*2]+sum[o*2+1];//更新当前结点 return ret;}int main(){ scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",a+i); build(1,1,n); a[0]=0; for(int i=n;i>=1;i--) { int p=a[i]-a[i-1]; ans[i]=query(1,1,n,p+1);//加1注意 } for(int i=1;i<=n;i++) printf("%d%c",ans[i],i==n?'\n':' '); } return 0;}
0 0
- hdu5592&bestcoder Round #65 1003题
- hdu 5592 BestCoder Round #65 1003
- BestCoder Round #65
- BestCoder Round #65
- BestCoder Round #65
- BestCoder Round #65
- hdu5592
- hdu5592
- BestCoder Round #23 1003 Cities
- BestCoder Round #85-1003 abs
- BestCoder Round #85 1003 abs
- BestCoder Round #87 1003 LCIS
- hdu5429(BestCoder Round #54 (div.2) 1003题)
- BestCoder Round #65 ZYB's Biology
- BestCoder Round #65 ZYB's Game
- BestCoder Round #65 ZYB's Premutation
- hdu 5591 BestCoder Round #65(博弈)
- 【字符串】HDU5590ZYB's Biology【BestCoder Round #65】
- 取消图片渲染
- Android中项目中各个文件夹的含义和用途详解
- nginx--rewrite指令使用
- 左旋转字符串
- 初识Android
- hdu5592&bestcoder Round #65 1003题
- 扑克牌问题
- linux目录权限及目录配置
- 孩子们的游戏(圆圈中最后剩下的数)
- UIImagePickerController 本地照片
- 萌妹子的志向及leader的一些感悟
- Android中Dialog源码解析
- Unity3D 各个版本安装破解
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。