[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 }
以上是关于[bzoj3192] [JLOI2013]删除物品的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ 3192: [JLOI2013]删除物品 奇淫技巧&树状数组