首页 > 其他 > 详细

湖南多校对抗赛(2015.03.28) I Inversion Sequence

时间:2015-03-29 10:42:29      阅读:229      评论:0      收藏:0      [点我收藏+]

题意:给你一个序列a[i],代表 i这个数 在b数列中有多少个值在它前面且比它大,问你求B序列

解题思路:线段树的简单应用,找第几个空,类似二分。

解题代码:

技术分享
  1 // File Name: i.cpp
  2 // Author: darkdream
  3 // Created Time: 2015年03月28日 星期六 12时56分11秒
  4 
  5 #include<vector>
  6 #include<list>
  7 #include<map>
  8 #include<set>
  9 #include<deque>
 10 #include<stack>
 11 #include<bitset>
 12 #include<algorithm>
 13 #include<functional>
 14 #include<numeric>
 15 #include<utility>
 16 #include<sstream>
 17 #include<iostream>
 18 #include<iomanip>
 19 #include<cstdio>
 20 #include<cmath>
 21 #include<cstdlib>
 22 #include<cstring>
 23 #include<ctime>
 24 #define LL long long
 25 #define maxn 10005
 26 using namespace std;
 27 int a[maxn];
 28 struct node{
 29   int l ,r , m , v; 
 30 }tree[maxn*4];
 31 int ans[maxn];
 32 int L(int x)
 33 {
 34  return 2 * x; 
 35 }
 36 int R(int x)
 37 {
 38  return 2 *x + 1; 
 39 }
 40 void push_up(int c)
 41 {
 42     tree[c].v = tree[L(c)].v + tree[R(c)].v; 
 43 }
 44 void build(int c ,int l , int r)
 45 {
 46     tree[c].l = l; 
 47     tree[c].r = r ; 
 48     tree[c].m = (l + r)/2;
 49     if(tree[c].l ==tree[c].r)
 50     {
 51         tree[c].v = 1; 
 52         return;
 53     }
 54     build(L(c),l,tree[c].m);
 55     build(R(c),tree[c].m+1,r);
 56     push_up(c);
 57 }
 58 int tt ;
 59 void find(int c, int v)
 60 {
 61    if(tree[c].l == tree[c].r)
 62    {
 63       tt = tree[c].l ;
 64       tree[c].v = 0 ; 
 65       return ; 
 66    }
 67    if(tree[L(c)].v >= v)
 68    {
 69       find(L(c),v);
 70    }else{
 71       find(R(c),v-tree[L(c)].v);
 72    }
 73    push_up(c);
 74 }
 75 int ta;
 76 int main(){
 77   int n ;
 78   while(scanf("%d",&n) != EOF)
 79   {
 80     build(1,1,n);
 81     memset(ans,0,sizeof(ans));
 82     int ok = 0 ;
 83     for(int i = 1;i <= n; i ++)
 84     {
 85       scanf("%d",&ta);
 86       if(tree[1].v < ta+1)
 87       {
 88           ok = 1; 
 89           continue;;
 90       }
 91       if(ok == 0 )
 92       {
 93         find(1,ta+1);
 94         ans[tt] = i ; 
 95       }
 96     }
 97     if(ok == 1)
 98         printf("No solution\n");
 99     else {
100       for(int i = 1;i <= n;i ++)
101           printf(i == 1?"%d":" %d",ans[i]);
102       printf("\n");
103     }
104   }
105 return 0;
106 }
View Code

 

湖南多校对抗赛(2015.03.28) I Inversion Sequence

原文:http://www.cnblogs.com/zyue/p/4375273.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!