uva 1513 - Movie collection

2014-11-24 03:15:28 · 作者: · 浏览: 1
树状数组:
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
          
            #include 
           
             #define INF 0x3fffffff #define inf -0x3f3f3f3f #define N 200010 #define M 4000010 #define LL long long #define mod 20071027 using namespace std; int n, m; int d[N + 10], arr[N / 2 + 5]; int lowbit(int x){ return x & (-x); } void add(int x, int val){ while(x <= N){ d[x] += val; x += lowbit(x); } } int sum(int x){ int s = 0; while(x >
0){ s += d[x]; x -= lowbit(x); } return s; } int main() { // freopen("in.txt", "r", stdin); int t; scanf("%d", &t); while(t --){ scanf("%d %d", &n, &m); memset(d, 0, sizeof(d)); for(int i = 1; i <= n; ++ i){ add(i, 1); arr[i] = n - i + 1; } int x; for(int i = 0; i < m; ++ i){ scanf("%d", &x); int v = sum(arr[x]); if(! i) printf("%d", n - v); else printf(" %d", n - v); if(v == n) continue; add(arr[x], -1); add(n + i + 1, 1); arr[x] = n + i + 1; } puts(""); } return 0; }