uva 1513 Movie collection

 1 #include<cstdio>
 2 #include<cstring>
 3 const int maxn=100000+5;
 4 int  sum[maxn<<4];
 5 int add[maxn<<4];
 6 int num_index[maxn];
 7 void  push_up(int rt)
 8 {
 9     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
10 }
11 void push_down(int rt,int len)
12 {
13     if(add[rt])
14     {
15         sum[rt<<1]=add[rt]*(len-len/2);
16         sum[rt<<1|1]=add[rt]*(len/2);
17         add[rt<<1]=add[rt<<1|1]=add[rt];
18         add[rt]=0;
19     }
20 }
21 void update(int L,int R,int inc,int l,int r,int rt)
22 {
23     if(L<=l&&r<=R)
24     {
25         sum[rt]+=inc*(r-l+1);
26         add[rt]+=inc;
27         return ;
28     }
29     push_down(rt,r-l+1);
30     int m=(l+r)>>1;
31     if(L<=m) update(L,R,inc,l,m,rt<<1);
32     if(R>m) update(L,R,inc,m+1,r,rt<<1|1);
33     push_up(rt);
34 }
35 int query(int L,int R,int l,int r,int rt)
36 {
37     if(L<=l&&r<=R)
38     {
39         return sum[rt];
40     }
41     push_down(rt,r-l+1);
42     int ret=0;
43     int m=(l+r)>>1;
44     if(l<=m) ret+=query(L,R,l,m,rt<<1);
45     if(R>m) ret+=query(L,R,m+1,r,rt<<1|1);
46     return ret;
47 }
48 int n,m;
49 int main()
50 {
51     int t;
52     scanf("%d",&t);
53     while(t--)
54     {
55         scanf("%d%d",&n,&m);
56         memset(sum,0,sizeof(sum));
57         memset(add,0,sizeof(add));
58         update(1+maxn,n+maxn,1,1,2*maxn-1,1);
59         int a;
60         for(int i=1;i<=n;i++)
61             num_index[i]=maxn+i;
62         int top=maxn;
63         for(int i=0;i<m;i++)
64         {
65             scanf("%d",&a);
66             printf("%d",query(1,num_index[a]-1,1,2*maxn-1,1));
67             if(i!=m-1) printf(" ");
68             update(num_index[a],num_index[a],-1,1,2*maxn-1,1);
69             num_index[a]=top--;
70             update(num_index[a],num_index[a],1,1,2*maxn-1,1);
71         }
72         printf("
");
73     }
74     return 0;
75 }
原文地址:https://www.cnblogs.com/sooflow/p/3307564.html