zoukankan      html  css  js  c++  java
  • POJ 2299 逆序对

    Crossings

    Time Limit: 2 Sec

    Memory Limit: 256 MB

    题目连接

    http://codeforces.com/gym/100463

    Description

    In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. For the input sequence 
    9 1 0 5 4 ,

    Ultra-QuickSort produces the output 
    0 1 4 5 9 .

    Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.

    Input

    The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 -- the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999, the i-th input sequence element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.

    Output

    For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence.

    Sample Input

    5
    9
    1
    0
    5
    4
    3
    1
    2
    3
    0

    Sample Output

    6
    0

    HINT

    题意

     逆序对求解

    题解:

    树状数组水

    代码

     1 #include <cstdio>
     2 #include <cmath>
     3 #include <cstring>
     4 #include <ctime>
     5 #include <iostream>
     6 #include <algorithm>
     7 #include <set>
     8 #include <vector>
     9 #include <queue>
    10 #include <map>
    11 #include <stack>
    12 #define MOD 1000000007
    13 #define maxn 32001
    14 using namespace std;
    15 typedef __int64 ll;
    16 inline ll read()
    17 {
    18     ll x=0,f=1;
    19     char ch=getchar();
    20     while(ch<'0'||ch>'9')
    21     {
    22         if(ch=='-')f=-1;
    23         ch=getchar();
    24     }
    25     while(ch>='0'&&ch<='9')
    26     {
    27         x=x*10+ch-'0';
    28         ch=getchar();
    29     }
    30     return x*f;
    31 }
    32 //*******************************************************************
    33 
    34 struct ss
    35 {
    36     int v,index;
    37 } in[500005];
    38 int c[500005];
    39 int a[500005];
    40 int n;
    41 bool cmp(ss s1,ss s2)
    42 {
    43     return s1.v<s2.v;
    44 }
    45 int lowbit(int x)
    46 {
    47     return x&(-x);
    48 }
    49 int getsum(int x)
    50 {
    51     int sum=0;
    52     while(x>0)
    53     {
    54         sum+=c[x];
    55         x-=lowbit(x);
    56     }
    57     return sum;
    58 }
    59 void update(int x,int value)
    60 {
    61     while(x<=n)
    62     {
    63         c[x]+=value;
    64         x+=lowbit(x);
    65     }
    66 }
    67 int main()
    68 {
    69 
    70     while(scanf("%d",&n)!=EOF)
    71     {
    72         if(n==0) break;
    73         memset(c,0,sizeof(c));
    74         for(int i=1; i<=n; i++)
    75         {
    76             in[i].v=read();
    77             in[i].index=i;
    78         }
    79         sort(in+1,in+n+1,cmp);
    80         for(int i=1; i<=n; i++)a[in[i].index]=i; //离散化处理
    81         ll ans=0;
    82         for(int i=1; i<=n; i++)
    83         {
    84             update(a[i],1);
    85             ans+=i-getsum(a[i]);
    86         }
    87         cout<<ans<<endl;
    88     }
    89 
    90     return 0;
    91 }
  • 相关阅读:
    强制重置管理员密码
    Leetcode-Wildcard Matching
    Leetcode-Merge Intervals
    Leetcode-Insert Interval
    Leetcode-Recover BST
    Leetcode-Validate BST
    Leetcode-Same Tree
    Leetcode-Symmetric Tree
    Leetcode-Construct Binary Tree from inorder and postorder travesal
    Leetcode-Binary Tree Level Order Traversal II
  • 原文地址:https://www.cnblogs.com/zxhl/p/4665282.html
Copyright © 2011-2022 走看看