ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

luogu P3620 [APIO/CTSC 2007]数据备份

2019-09-18 19:03:23  阅读:292  来源: 互联网

标签:q1 ch bb int luogu top CTSC 数据备份 void


luogu

首先如果一条线不是了连接的相邻两个位置一定不优,把它拆成若干连接相邻位置的线.所以现在问题是有\(n\)个物品,选\(k\)个,要求选的位置不能相邻,求最小总和

如果没有选的位置不能相邻这个限制,那就每次选最小的.现在仍然考虑每次选最小的,但是会有情况是这一次取的位置不在最优方案中,那么如果是这种情况,那么一定是要把不选这个东西,选旁边两个东西.考虑保留这个决策的选择,每选一个数\(x\),就把它旁边两个数\(y,z\)和\(x\)合并成\(y+z-x\).然后所有数可以堆维护,前驱后继可以链表维护

#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db double

using namespace std;
const int N=1e5+10;
int rd()
{
    int x=0,w=1;char ch=0;
    while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return x*w;
}
int n,kk,ft[N],nt[N];
LL ans;
struct node
{
    LL x,i;
    bool operator < (const node &bb) const {return x!=bb.x?x>bb.x:i>bb.i;}
    bool operator == (const node &bb) const {return x==bb.x&&i==bb.i;}
}a[N];
bool ban[N];
void del(int x)
{
    nt[ft[x]]=nt[x],ft[nt[x]]=ft[x];
    ban[x]=1;
}
struct HEAP
{
    priority_queue<node> q1;
    void mntn(){while(!q1.empty()&&(ban[q1.top().i]||!(q1.top()==a[q1.top().i]))) q1.pop();}
    void push(node x){q1.push(x);}
    void pop(){mntn();q1.pop();}
    node top(){mntn();return q1.top();}
}hp;

int main()
{
    n=rd()-1,kk=rd();
    nt[0]=1;
    for(int i=1;i<=n+1;++i) ft[i]=i-1,nt[i]=i+1;
    int las=rd();
    for(int i=1;i<=n;++i)
    {
        int x=rd();
        a[i]=(node){x-las,i};
        las=x;
        hp.push(a[i]);
    }
    a[0]=(node){1ll<<40,0},hp.push(a[0]);
    a[n+1]=(node){1ll<<40,0},hp.push(a[n+1]);
    while(kk--)
    {
        int x=hp.top().i;
        hp.pop();
        ans+=a[x].x;
        int y=ft[x],z=nt[x];
        a[x].x=a[y].x+a[z].x-a[x].x;
        hp.push(a[x]);
        del(y),del(z);
    }
    printf("%lld\n",ans);
    return 0; 
}

标签:q1,ch,bb,int,luogu,top,CTSC,数据备份,void
来源: https://www.cnblogs.com/smyjr/p/11544478.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有