zoukankan      html  css  js  c++  java
  • [BZOJ 1150] 数据备份

    Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1150

    Solution:

    思路和洛谷P1484完全相同

    只不过将求最大不相邻的点权改为最大不相邻的边权

    ([P1484] 种树:http://www.cnblogs.com/newera/p/8977924.html)

    但在边界条件上还是卡了好长时间,也许一开始我就理解错了

    正解应该是将a[0]=INF,保证选过a[1]后绝不选a[2],因为a[1]在不影响剩余点的位置的前提下比a[2]更优

    我一开始认为可以由a[1]转移到a[2],于是把left[0]=1

    这明显是没有必要的,但为什么会WA?以后再看吧

    Code:

    #include <bits/stdc++.h>
    
    using namespace std;
    #define F first
    #define S second
    typedef long long ll;
    typedef pair<ll,int> P;
    
    const int MAXN=1e5+10;
    priority_queue<P,vector<P>,greater<P> > que;
    int n,k,dat[MAXN],l[MAXN],r[MAXN],vis[MAXN];
    ll d[MAXN],res=0;
    
    int main()
    {
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++) scanf("%d",&dat[i]);
        for(int i=2;i<=n;i++) 
            l[i-1]=i-2,r[i-1]=i,d[i-1]=dat[i]-dat[i-1],que.push(P(d[i-1],i-1));
        
        d[0]=d[n]=1e17;  //边界处理 
        while(k--)
        {
            while(vis[que.top().S]) que.pop();
            P t=que.top();que.pop();
            res+=t.F;vis[l[t.S]]=vis[r[t.S]]=true;
            
            d[t.S]=t.F=d[l[t.S]]+d[r[t.S]]-d[t.S];que.push(t);        
            
            l[t.S]=l[l[t.S]];r[t.S]=r[r[t.S]];
            r[l[t.S]]=t.S;l[r[t.S]]=t.S;
        }
        
        printf("%lld",res);
        return 0;
    }
  • 相关阅读:
    HTML滚动时位置固定 PHP
    js判断验证码是否正确 PHP
    PNG渐变图生成工具 PHP
    C# 提醒小工具 PHP
    js 密码强度检测 PHP
    js辅助输入层 PHP
    不常用样式 PHP
    ASP.NET编程中的十大技巧
    WEB打印大全
    如何在ASP.NET中用OWC绘制图表
  • 原文地址:https://www.cnblogs.com/newera/p/9100288.html
Copyright © 2011-2022 走看看