标签:style blog http color io os ar for strong
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 : whiteblock63 LANG : G++ PROG : Uva - 1513 Moive collection DATE : 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 200005 int 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 ( 模拟栈 + 树状数组基本操作 )
标签:style blog http color io os ar for strong
原文地址:http://www.cnblogs.com/BigBallon/p/4012298.html