[bzoj3192] [JLOI2013]删除物品

Posted czllgzmzl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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

 

以上是关于[bzoj3192] [JLOI2013]删除物品的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 3192: [JLOI2013]删除物品 奇淫技巧&树状数组

bzoj 3192 删除物品

洛谷 P3253 [JLOI2013]删除物品 解题报告

bzoj 4004 [JLOI2015]装备购买——拟阵证明贪心+线性基

bzoj4004 [JLOI2015]装备购买

BZOJ3191: [JLOI2013]卡牌游戏