[bzoj3192] [JLOI2013]删除物品

  将两堆东西并起来(前面那堆就倒过来了)...然后就是在一列数里面跑来跑去...

  这个显然可以树状数组维护一波。。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define ll long long
 6 #define MOD(x) x-=x>=modd?modd:0
 7 using namespace std;
 8 const int maxn=100023;
 9 struct zs{int v,id;}a[maxn];
10 int t[maxn];
11 int i,j,k,n,m,pos,next;
12 ll ans;
13  
14 int ra;char rx;
15 inline int read(){
16     rx=getchar(),ra=0;
17     while(rx<'0'||rx>'9')rx=getchar();
18     while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra;
19 }
20 bool cmp(zs a,zs b){return a.v>b.v;}
21 inline int query(int l,int r){
22     int sm=0,i;
23     i=r;while(i)sm+=t[i],i-=i&-i;
24     i=l;while(i)sm-=t[i],i-=i&-i;
25     return sm;
26 }
27 int main(){
28     n=read(),m=read();register int i,j;
29     for(i=n;i;i--)a[i].v=read(),a[i].id=i;
30     for(i=n+1;i<=n+m;i++)a[i].v=read(),a[i].id=i;
31     pos=n,n+=m;
32     sort(a+1,a+1+n,cmp);
33     for(i=1;i<=n;i++){
34         t[i]++;
35         if(i+(i&-i)<=n)t[i+(i&-i)]+=t[i];
36     }
37     for(i=1;i<=n;i++){
38         next=a[i].id;
39         if(next<=pos)ans+=query(next,pos),pos=next;
40         else ans+=query(pos,next-1),pos=next-1;
41         j=next;while(j<=n)t[j]--,j+=j&-j;
42     }
43     printf("%lld\n",ans);
44 }
View Code

 

posted @ 2016-06-28 08:12  czllgzmzl  阅读(183)  评论(0编辑  收藏  举报