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−1ii前面比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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 胃胀不消化怎么办快速解决 便秘肛裂了好痛怎么办 胃消化慢还便秘怎么办 11个月婴儿便秘怎么办 80多岁老人便秘怎么办 狗狗便秘拉不出来怎么办 2个月幼犬便秘怎么办 狗狗便秘怎么办吃什么 痔疮又痛又痒怎么办 痔疮肉球特别痒怎么办 长了个小痔疮怎么办 产后4天没大便怎么办 7个月孕妇痔疮怎么办 运动完恶心想吐怎么办 跑步后恶心想吐怎么办 肠子不蠕动严重便秘怎么办 怀孕八个月严重便秘怎么办 怀孕七个月便秘严重怎么办 怀孕两个月便秘严重怎么办 3岁宝宝上火便秘怎么办 7个月的宝宝贫血怎么办 9个月婴儿贫血怎么办 肛裂大便有血怎么办 生完宝宝肛门痛怎么办 肛周脓肿出血了怎么办 胃胀怎么办简单的办法 吃多了胃胀难受怎么办 胃窦炎胆汁反流怎么办 怀孕总胆汁酸高怎么办 胃里胆汁反流怎么办 苦胆水吐出来了怎么办 喝多了吐胆汁怎么办 吐出黄水苦水是怎么办 喝酒喝的一直吐怎么办 孕期总胆汁酸高怎么办 孕早期胆汁酸高怎么办 孕妇总胆汁酸高怎么办 宝宝一天吐了6次怎么办 肛周脓肿破了怎么办 肛周脓肿发烧了怎么办 肛周脓肿便血该怎么办