zoukankan      html  css  js  c++  java
  • 考试总结

    T2
    (f[i]) 表示前 (i) 个数字全部删去所需要的最小步数;
    那么就有转移方程 (f[i]=min(f[j-1]+|a[i]-a[j]|))
    时间复杂度是 (n^2) ,考虑拆开
    (a[i]>=a[j]) (f[i]=min(f[j+1])-a[j]+a[i])
    否则 (f[i]=min(f[j+1]+a[j]-a[i]))
    j属于1~i;
    可以用权值线段树分别维护 (f[j-1]-a[j])(f[j-1]+a[j]) 的最小值;
    注意数值范围是1e9,需要离散化;

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #define int long long
    #define mid ((l+r)>>1)
    #define l(o) (o<<1)
    #define r(o) (o<<1|1)
    using namespace std;
    const int N=1e6+7;
    const int inf=1e15;
    const int INF=1e6;
    struct node{
    	int lc,rc,min1,min2;
    }tr[N<<2];
    int n,cnt,cur;
    int a[N],f[N],wz[N],b[N];
    void up(int o){
    	tr[o].min1=min(tr[l(o)].min1,tr[r(o)].min1);
    	tr[o].min2=min(tr[l(o)].min2,tr[r(o)].min2);
    }
    
    void build(int o,int l,int r){
    //	if(a[2]!=cur) cout<<a[2]<<" "<<cur<<" ssss"<<"
    ";
    	tr[o].min1=tr[o].min2=inf;
    	if(l==r){return;}
    	build(l(o),l,mid);
    	build(r(o),mid+1,r);
    }
    
    
    void change(int o,int l,int r,int k,int val1,int val2){
    	if(l==r){
    		tr[o].min1=min(tr[o].min1,val1);
    		tr[o].min2=min(tr[o].min2,val2);
    		return;
    	}
    	if(k<=mid) change(l(o),l,mid,k,val1,val2);
    	if(k>mid) change(r(o),mid+1,r,k,val1,val2);
    	up(o);
    }
    
    int ask(int o,int l,int r,int L,int R,int k){
    //	cout<<l<<" "<<r<<" "<<L<<" "<<R<<endl;
    	if(L<=l&&R>=r){
    		if(k==1) return tr[o].min1;
    		else return tr[o].min2;
    	}
    	int res=inf;
    	if(L<=mid) res=min(res,ask(l(o),l,mid,L,R,k));
    	if(R>mid) res=min(res,ask(r(o),mid+1,r,L,R,k));
    	return res; 
    }
    
    
    main(){
    	freopen("remove.in","r",stdin);
    	freopen("remove.out","w",stdout);
    	scanf("%lld",&n);
    	for(int i=1;i<=n;i++){
    		scanf("%lld",&a[i]);
    		b[i]=a[i];
    	}
    	sort(b+1,b+n+1);
    	unique(b+1,b+n+1)-b-1;
    	for(int i=1;i<=n;i++){
    		wz[i]=lower_bound(b+1,b+n+1,a[i])-b;
    //		cout<<wz[i]<<"
    ";
    	}
    //	cur=a[2];
    	build(1,1,INF);
    //	cout<<a[2]<<"
    ";
    	f[1]=inf;
    	
    	change(1,1,INF,wz[1],f[0]-a[1],f[0]+a[1]);
    	for(int i=2;i<=n;i++){
    //		cout<<"-->"<<ask(1,1,INF,1,wz[i],1)<<" "<<ask(1,1,INF,wz[i]+1,INF,2)<<"
    ";
    //		cout<<a[i]<<"
    ";
    		f[i]=min(ask(1,1,INF,1,wz[i],1)+a[i],ask(1,1,INF,wz[i]+1,INF,2)-a[i]);
    		change(1,1,INF,wz[i],f[i-1]-a[i],f[i-1]+a[i]);
    //		cout<<f[i]<<"
    ";
    	}
    	cout<<f[n];
    	return 0;
    }
    /*
    5
    1 2 3 4 5
    */
    
  • 相关阅读:
    dubbo服务配置
    架构基本概念和架构本质
    最大子数组和问题
    struts2简单登陆页面
    四则运算随机出题
    省赛训练赛赛题(简单题)
    Ubuntu虚拟机安装,vritualbox虚拟机软件的使用
    Rational Rose 2007破解版
    netbeans出现的错误
    快速幂
  • 原文地址:https://www.cnblogs.com/Aswert/p/13664736.html
Copyright © 2011-2022 走看看