首页 > 代码库 > Uva - 1513 Moive collection ( 模拟栈 + 树状数组基本操作 )

Uva - 1513 Moive collection ( 模拟栈 + 树状数组基本操作 )

 

Uva - 1513 Moive collection ( 模拟栈 + 树状数组基本操作 )

 

题意:

一个书架,原来所有的书都是按顺序摆好的,书的编号从1开始到n

操作: 取出一本书,统计在这本书之前有多少本书,统计完之后,将这本书放在书架的第一位。

如:  1 2 3 4 5
取4   4 1 2 3 5 (取之前,有3本书在4前面,取完后,将4放在栈顶)
取4   4 1 2 3 5 (取之前,有0本书在4前面,取完后,将4放在栈顶)
取2   2 4 1 3 5 (取之前,有2本书在2前面,取完后,将2放在栈顶)

 

分析:
模拟一个栈,,用hash维护一下每本书应该在的位置。

数组开2倍的maxn

 

/* ***********************************************ID      : whiteblock63LANG    : G++PROG    : Uva - 1513 Moive collectionDATE    : 2014-10-08 20:53:44************************************************ */#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define CLR( a, b )        memset( a, b, sizeof(a) )using namespace std;#define MAXN 200005int bit[MAXN];int hash[MAXN];void scan( int &x ){    char c;    while( c = getchar(), c < 0 || c > 9 );    x = c - 0;    while( c = getchar(), c >= 0 && c <= 9 )    x = x*10 + c - 0;}void out( int x ){    if( x > 9 ) out( x/10 );    putchar( x%10 + 0 );}inline int lowbit( int x ){    return x & -x;}void add( int x, int val ){    while( x <= MAXN )    {        bit[x] += val;        x += lowbit( x );    }}int sum( int x ){    int ret = 0;    while( x > 0 )    {        ret += bit[x];        x -= lowbit( x );    }    return ret;}void Orz(){    int t, n, m, x ;    scan( t );    while( t-- )    {        scan( n ), scan( m );            CLR( bit, 0 );        CLR( hash, 0 );        for( int i = 1; i <= n; ++i )        {            hash[i] = i + 100000;            add( hash[i], 1 );        }        for( int i = 0; i < m; ++i )        {            scan( x );            int ans = sum( hash[x]-1 );            add( hash[x], -1 );            hash[x] = 100000 - i;            add( hash[x], 1 );            if( i != 0 )            {                putchar(   );                out( ans );            }            else                    out( ans );                    }        putchar( \n );    }}int main(){    Orz();    return 0;}
代码君

 

Uva - 1513 Moive collection ( 模拟栈 + 树状数组基本操作 )