• 题解 [51nod1461] 稳定桌


    题面

    解析

    一开始看上去毫无思路啊.

    但想通了就很很简单.

    我们枚举每种长度的边作为最大的边,

    于是长度比当前大的边就要砍掉,

    而长度比当前小的边只能留下小于等于当前长度的边数,

    砍掉代价最小的几条就好了.

    用权值线段树维护一下即可.

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define int long long
    #define ls(a) a<<1
    #define rs(a) a<<1|1
    #define fre(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
    using namespace std;
    
    inline int read(){
    	int sum=0,f=1;char ch=getchar();
    	while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    	while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
    	return f*sum;
    }
    
    const int N=100001;
    struct node{int d,l;}a[N];
    struct tree{int l,r,cnt,sum;}t[N<<2];
    int n,ans=1e18,mx=0;
    int b[N],s[N],tot,f[N];
    
    bool cmp(node a,node b){return a.l<b.l;}
    
    inline void build(int p,int l,int r){
    	t[p].l=l;t[p].r=r;
    	if(l==r) return ;
    	int mid=(l+r)>>1;
    	build(ls(p),l,mid);build(rs(p),mid+1,r);
    }
    
    inline void add(int p,int x){
    	t[p].cnt++;t[p].sum+=x;
    	if(t[p].l==t[p].r) return ;
    	int mid=(t[p].l+t[p].r)>>1;
    	if(x<=mid) add(ls(p),x);
    	else if(x>mid) add(rs(p),x);
    }
    
    inline int query(int p,int k){
    	if(t[p].cnt<=k) return t[p].sum;
    	if(t[p].l==t[p].r) return t[p].l*k;
    	int tt=t[ls(p)].cnt;
    	if(tt>=k) return query(ls(p),k);
    	else return t[ls(p)].sum+query(rs(p),k-tt);
    }
    
    signed main(){
    	n=read();
    	for(int i=1;i<=n;i++) a[i].l=read();
    	for(int i=1;i<=n;i++) a[i].d=read();
    	for(int i=1;i<=n;i++) mx=max(mx,a[i].d);
    	sort(a+1,a+n+1,cmp);build(1,1,mx);
    	for(int i=n;i>=1;i--) f[i]=f[i+1]+a[i].d;
    	for(int l=1,r=1,sum=0;l<=n;l=r=r+1){
    		while(a[r+1].l==a[r].l) r++;
    		int cnt=r-l+1,tt=0;
    		if(sum>(cnt-1)) tt=query(1,sum-(cnt-1));
    		ans=min(ans,tt+f[r+1]);
    		for(int i=l;i<=r;i++) add(1,a[i].d);
    		sum+=cnt;
    	}
    	printf("%lld
    ",ans);
    	return 0;
    }
    
    
  • 相关阅读:
    Eclipse中普通java项目转成Web项目
    spring MVC 转发与重定向(传参)
    spring MVC <mvc:annotation-driven>
    spring MVC 全局的异常处理
    spring MVC拦截器
    Spring Bean的作用域
    Spring 常用注解
    在普通类中获取Spring管理的bean
    Spring事务配置
    spring在普通类中获取session和request
  • 原文地址:https://www.cnblogs.com/zsq259/p/11400018.html
Copyright © 2020-2023  润新知