zoukankan      html  css  js  c++  java
  • POJ3666:Making the Grade——题解

    http://poj.org/problem?id=3666

    题目大意:给n个数,每次操作可使一个数+1或-1,求最小操作数使得序列不下降或不上升。

    ——————————————————————

    思路:http://blog.csdn.net/luovilonia/article/details/44004041

    因为我再讲什么也没什么好讲的了。

    但是这人的代码是错的……请注意查找最长不上升和不下降所要减的值是不一样的。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<cctype>
    #include<stack>
    using namespace std;
    const int N=2001;
    typedef long long ll;
    inline ll read(){
        ll X=0,w=0;char ch=0;
        while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
        while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
        return w?-X:X;
    }
    inline ll abs(ll a){
        if(a<0)a=-a;
        return a;
    }
    inline ll min(ll a,ll b){
        if(a<b)return a;
        return b;
    }
    ll a[N],b[N],n;
    struct tree{
        int l,r;
        ll dis,val;
    }tr[N];
    int merge(int x,int y){
        if(x==0||y==0)return x+y;
        if(tr[x].val<tr[y].val)
        swap(x,y);
        tr[x].r=merge(tr[x].r,y);
        if(tr[tr[x].l].dis<tr[tr[x].r].dis)
        swap(tr[x].l,tr[x].r);
        tr[x].dis=tr[tr[x].r].dis+1;
        return x;
    }
    stack<int>q,l;
    ll solve(){
        ll ans=0;
        for(int i=1;i<=n;i++){
        int id=i,ct=1;
        while(!q.empty()&&tr[q.top()].val>tr[id].val){
            id=merge(q.top(),id);
            q.pop();
            if((l.top()+1)/2+(ct+1)/2>(l.top()+ct+1)/2){
            id=merge(tr[id].l,tr[id].r);
            }
            ct+=l.top();
            l.pop();
        }
        l.push(ct);
        q.push(id);
        }
        int i=n+1;
        while(!q.empty()){
        ll k=tr[q.top()].val;
        int len=l.top();
        l.pop();q.pop();
        while(len--){
            i--;
            ans+=abs(tr[i].val-k);
        }
        }
        return ans;
    }
    int main(){
        n=read();
        tr[0].dis=-1;
        for(int i=1;i<=n;i++){
        a[i]=b[n-i+1]=read();
        }
        for(int i=1;i<=n;i++){
        tr[i].l=tr[i].r=tr[i].dis=0;
        tr[i].val=a[i];
        }
        ll ans=solve();
        for(int i=1;i<=n;i++){
        tr[i].l=tr[i].r=tr[i].dis=0;
        tr[i].val=b[i];
        }
        ans=min(ans,solve());
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    Project 01 PlantAndZomb
    iOS平台内存使用原则
    IOS之UIKit_Day22--23
    IOS之UIKit_Day21
    IOS之UIKit_Day20
    浅谈javascript数据类型,对象,类
    从输入一个url到加载页面发生了什么?
    d3.js(2)-svg
    d3.js(1)
    console.time和performance.now()
  • 原文地址:https://www.cnblogs.com/luyouqi233/p/8005148.html
Copyright © 2011-2022 走看看