• COJ 2110 Day7-例3


    Day7-例3
    难度级别:C; 运行时间限制:5000ms; 运行空间限制:256000KB; 代码长度限制:2000000B
    试题描述

     

    输入
    输入的第一行包含整数n和k,其中n(2 ≤ n ≤100 000)表示办公楼的数目,k(1≤ k≤ n/2)表示可利用的网络电缆的数目。接下来的n行每行仅包含一个整数(0≤ s ≤1000 000 000), 表示每个办公楼到大街起点处的距离。这些整数将按照从小到大的顺序依次出现。
    输出
    输出应由一个正整数组成,给出将2K个相异的办公楼连成k对所需的网络电缆的最小总长度。
    输入示例
    5 2
    1
    3
    4
    6
    12
    输出示例
    4

    题解:奇妙的题。用堆维护每一段,如果取了一个就要把(两边的-这个)放到堆里,表示可以改成选两边的,但是就是不能同时选。

    用set实现:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<stack>
     6 #include<queue>
     7 #include<cstring>
     8 #include<set>
     9 #define PAU putchar(' ')
    10 #define ENT putchar('
    ')
    11 using namespace std;
    12 const int maxn=100000+10;
    13 const long long inf=4e18;
    14 struct data{long long v;int p;};
    15 bool operator<(const data&a,const data&b){return a.v<b.v||(a.v==b.v&&a.p<b.p);}
    16 inline long long read(){
    17     long long x=0,sig=1;char ch=getchar();
    18     for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=0;
    19     for(;isdigit(ch);ch=getchar())x=10*x+ch-'0';
    20     return sig?x:-x;
    21 }
    22 inline void write(long long x){
    23     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
    24     int len=0;long long buf[20];while(x)buf[len++]=x%10,x/=10;
    25     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
    26 }
    27 set<data>S;
    28 long long A[maxn],d[maxn];
    29 int L[maxn],R[maxn],n,k;
    30 int main(){
    31     data x;set<data>::iterator t;
    32     n=read();k=read();
    33     for(int i=1;i<=n;i++)A[i]=read();
    34     for(int i=1;i<n;i++)d[i]=A[i+1]-A[i];d[0]=inf;d[n]=inf;
    35     for(int i=0;i<n;i++)R[i]=i+1,L[i+1]=i;
    36     for(int i=0;i<=n;i++)S.insert((data){d[i],i});
    37     long long ans=0;
    38     for(int i=1;i<=k;i++){
    39         t=S.begin();x=*t;ans+=x.v;
    40         int l=L[x.p],r=R[x.p];
    41         S.erase(t);S.erase((data){d[l],l});S.erase((data){d[r],r});
    42         R[l]=R[r];L[R[r]]=l;d[l]+=d[r]-x.v;
    43         S.insert((data){d[l],l});
    44     }write(ans);return 0;
    45 }

     treap仍然调不对啊。。。为什么。。。我改了重载也过不了啊。。。。。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<stack>
     6 #include<queue>
     7 #include<cstring>
     8 #include<ctime>
     9 #include<set>
    10 #define PAU putchar(' ')
    11 #define ENT putchar('
    ')
    12 #define CH for(int d=0;d<2;d++)if(ch[d])
    13 using namespace std;
    14 const int maxn=200000+10,maxnode=7000000+10;
    15 const long long inf=4e18;
    16 struct data{long long v;int p;};
    17 bool operator>(const data&a,const data&b){return a.v>b.v||(a.v==b.v&&a.p>b.p);}
    18 bool operator==(const data&a,const data&b){return (a.v==b.v)&&(a.p==b.p);}
    19 struct node{
    20     node*ch[2];data v;int siz,r;
    21     void init(){siz=1;r=rand();ch[0]=ch[1]=NULL;return;}
    22     void update(){siz=1;CH{siz+=ch[d]->siz;}return;}
    23 }treap[maxnode],*nodecnt=treap,*root;queue<node*>RM;
    24 node*newnode(){node*k;if(RM.empty())k=nodecnt++;else k=RM.front(),RM.pop();k->init();return k;}
    25 void del(node*&x){RM.push(x);x=NULL;return;}
    26 void rotate(node*&x,int d){
    27     node*k=x->ch[d^1];x->ch[d^1]=k->ch[d];k->ch[d]=x;x->update();k->update();x=k;return;
    28 }
    29 void insert(node*&x,data v){
    30     if(!x)x=newnode(),x->v=v;
    31     else{int d=v>x->v;insert(x->ch[d],v);
    32         if(x->r<x->ch[d]->r)rotate(x,d^1);else x->update();
    33     }return;
    34 }
    35 void remove(node*&x,data v){
    36     if(x->v==v){
    37         if(x->ch[0]&&x->ch[1]){
    38             int d=x->ch[0]->r>x->ch[1]->r;rotate(x,d);remove(x->ch[d],v);
    39         }else{node*k=x;x=x->ch[0]?x->ch[0]:x->ch[1];del(k);}
    40     }else remove(x->ch[v>x->v],v);
    41     if(x)x->update();return;
    42 }
    43 void print(node*x){
    44     if(!x)return;print(x->ch[0]);printf("%lld ",x->v.v);print(x->ch[1]);return;
    45 }
    46 data getmi(node*x){
    47     if(x->ch[0])x=x->ch[0];return x->v;
    48 }
    49 inline long long read(){
    50     long long x=0,sig=1;char ch=getchar();
    51     for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=0;
    52     for(;isdigit(ch);ch=getchar())x=10*x+ch-'0';
    53     return sig?x:-x;
    54 }
    55 inline void write(long long x){
    56     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
    57     int len=0;long long buf[20];while(x)buf[len++]=x%10,x/=10;
    58     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
    59 }
    60 long long A[maxn],d[maxn];
    61 int L[maxn],R[maxn],n,k;
    62 int main(){
    63     srand(time(0));
    64     n=read();k=read();
    65     for(int i=1;i<=n;i++)A[i]=read();
    66     for(int i=1;i<n;i++)d[i]=A[i+1]-A[i];d[0]=inf;d[n]=inf;
    67     for(int i=0;i<n;i++)R[i]=i+1,L[i+1]=i;
    68     for(int i=0;i<=n;i++)insert(root,(data){d[i],i});
    69     long long ans=0;
    70     for(int i=1;i<=k;i++){
    71         data t=getmi(root);ans+=t.v;
    72         int l=L[t.p],r=R[t.p];
    73         remove(root,t);remove(root,(data){d[l],l});remove(root,(data){d[r],r});
    74         R[l]=R[r];L[R[r]]=l;d[l]+=d[r]-t.v;
    75         insert(root,(data){d[l],l});
    76     }write(ans);return 0;
    77 }
  • 相关阅读:
    Objective-C语言的对象、功能和方法
    【Swift语言】可选类型
    静态库调用中“unrecognized selector sent to instance”错误
    Xcode的坑
    Xcode6中变量初始化的问题
    iOS数据存储的方式总结
    KVO
    linux一些工具的安装(三)
    linux一些工具的安装(二)
    linux的基本操作(一)
  • 原文地址:https://www.cnblogs.com/chxer/p/4721755.html
Copyright © 2020-2023  润新知