• [bzoj 3192] [JLOI2013]删除物品


    [bzoj 3192] [JLOI2013]删除物品

    Description

    箱子再分配问题需要解决如下问题:
    (1) 一共有N个物品,堆成M堆。
    (2)所有物品都是一样的,但是它们有不同的优先级。
    (3)你只能够移动某堆中位于顶端的物品。
    (4)你可以把任意一堆中位于顶端的物品移动到其它某堆的顶端。若此物品是当前所有物品中优先级最高的,可以直接将之删除而不用移动。
    (5)求出将所有物品删除所需的最小步数。删除操作不计入步数之中。
    (6)只是一个比较难解决的问题,这里你只需要解决一个比较简单的版本:
    不会有两个物品有着相同的优先级,且M=2

    Input

    第一行是包含两个整数N1,N2分别表示两堆物品的个数。
    接下来有N1行整数按照从顶到底的顺序分别给出了第一堆物品中的优先级,数字越大,优先级越高。
    再接下来的N2行按照同样的格式给出了第二堆物品的优先级。

    Output

    对于每个数据,请输出一个整数,即最小移动步数。

    HINT

    1<=N1+N2<=100000

    实际上我们就是要每次找到一个最大的物品,然后计算删除物品的代价.为了方便,我们可以把两个物品堆堆顶与堆顶对在一起,中间留一个位置放当前初始位置,那么题目就变成了计算这个位值在数列中移动的代价.那么我们就可以用树状数组维护了.(为什么?因为只要单点修改区间查询)我们在树状数组中插入移动的代价(移动一次代价为1),所以树状数组初值赋值为1.删除一次物品,就把那个位置变成0就好了.

    代码如下

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    typedef long long LL;
    
    static const int maxm=2e6+10;
    
    struct node{
    	int v,id;
    	bool operator < (const node &n) const {
    		return v>n.v;
    	}
    }A[maxm];
    
    int tr[maxm];
    int N,N1,N2,pos;
    LL ans;
    
    int lowbit(int x){
    	return x&-x;
    }
    
    void add(int val,int k){
    	for(int i=k;i<=N;i+=lowbit(i))tr[i]+=val;
    }
    
    int Query(int k){
    	int ret=0;
    	for(int i=k;i;i-=lowbit(i))ret+=tr[i];
    	return ret;
    }
    
    int solve(int l,int r){
    	if(l>r)swap(l,r);
    	return Query(r)-Query(l-1);
    }
    
    int main(){
    	scanf("%d%d",&N1,&N2);N=N1+N2+1;pos=N1+1;
    	for(int i=N1;i>=1;i--)scanf("%d",&A[i].v);
    	for(int i=N1+2;i<=N;i++)scanf("%d",&A[i].v);
    	
    	for(int i=1;i<=N;i++){
    		if(i!=pos)add(1,i);
    		A[i].id=i;
    	}
    	
    	sort(A+1,A+N+1);
    	
    	for(int i=1;i<N;i++){
    		ans+=solve(A[i].id,pos)-1;
    		pos=A[i].id;add(-1,pos);
    	}
    	
    	printf("%lld
    ",ans);
    
    	return 0;	
    }
    

    传送门

  • 相关阅读:
    【经验总结】- IDEA无法显示Project目录怎么办
    JSON API免费接口(转)
    电子商务(电销)平台中订单模块(Order)数据库设计明细(转)
    typora 快捷键
    table 随td固宽
    跨域请求
    在网址前加神秘字母,让你打开新世界(z)
    vux安装中遇到的坑(转)
    常用正则表达示
    mui 浏览器一样自动缩放
  • 原文地址:https://www.cnblogs.com/Exbilar/p/6817840.html
Copyright © 2020-2023  润新知