bzoj1150

来源:互联网 发布:理想禁区 知乎 编辑:程序博客网 时间:2024/06/18 14:26

贪心好题
每个城市一定是和相邻两个城市中的一个连边
注意到可以将数组差分
然后转化成从n-1条边中选k条且任意两条不相邻
开一个堆
每次选其中边权最小的
然后我们考虑贪心最巧妙的反悔操作
如果这个点被选了那么将这个点前一个点和后一个点删去(不能再选),然后向堆中加入权值为dis【pre【x】】+dis【next【x】】-dis【x】的点,如果选了这个点相当于选旁边的两个点而不选这个点,而由于旁边的两个点都已经删去不会重复
注意边界

#include<cstdio>#include<cstring>#include<utility>#include<algorithm>#include<iostream>#include<queue>#include<stack>#include<cmath>#include<cstdlib>#include<ctime>const int inf = 1300000000;using namespace std;inline int read(){    char ch='*';    int f=1;    while(!isdigit(ch=getchar())) if(ch=='-') f=-1;    int num=ch-'0';    while(isdigit(ch=getchar())) num=num*10+ch-'0';    return num*f;}const int maxn = 150005;int pre[maxn<<1],nxt[maxn<<1],vis[maxn<<1];int a[maxn<<1],n,k;priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点//假如……我是说假如喔。假如是 Picks 出题,其他人能不能对我温柔一点int main(){    n=read();k=read();    int x,y;    x=read();    for(register int i=2;i<=n;i++)    {        y=read();        a[i]=y-x;x=y;        q.push(make_pair(a[i],i));        //cerr<<a[i]<<"--"<<i<<endl;        pre[i]=i-1;nxt[i]=i+1;    }    long long ans=0;    int cnt=n;    pre[2]=nxt[n]=0;    while(k--)    {           //cerr<<"delete "<<q.top().second<<endl;        while(q.top().first!=a[q.top().second]) {q.pop();}        int pos=q.top().second;q.pop();//cerr<<a[pos]<<"--"<<pos<<"--"<<pre[pos]<<"---"<<nxt[pos]<<"--"<<a[pre[pos]]+a[nxt[pos]]-a[pos]<<endl;        ans+=a[pos];        if(pre[pos]&&nxt[pos]) a[pos]=a[pre[pos]]+a[nxt[pos]]-a[pos];else a[pos]=inf;           a[pre[pos]]=a[nxt[pos]]=inf;                            pre[nxt[nxt[pos]]]=pos;        nxt[pre[pre[pos]]]=pos;         pre[pos]=pre[pre[pos]];        nxt[pos]=nxt[nxt[pos]];        q.push(make_pair(a[pos],pos));        //for(register int i=2;i<=n;i++) cerr<<a[i]<<" ";        //cerr<<endl;    }    cout<<ans<<endl;    return 0;}
原创粉丝点击