标签:ring 备份 使用 整数 inline tchar 组成 顺序 需要
输出应由一个正整数组成,给出将2K个相异的办公楼连成k对所需的网络电缆的最小总长度。
1 //It is made by wfj_2048~ 2 #include <algorithm> 3 #include <iostream> 4 #include <cstring> 5 #include <cstdlib> 6 #include <cstdio> 7 #include <vector> 8 #include <cmath> 9 #include <queue> 10 #include <stack> 11 #include <map> 12 #include <set> 13 #define inf (1<<30) 14 #define N (500010) 15 #define il inline 16 #define RG register 17 #define ll long long 18 19 using namespace std; 20 21 struct data{ 22 23 int x; ll val; 24 25 il bool operator < (const data &a) const{ 26 return val>a.val; 27 } 28 29 }; 30 31 priority_queue <data> Q; 32 33 int lst[N],nxt[N],del[N],n,k,tot; 34 ll dis[N],val[N],ans; 35 36 il int gi(){ 37 RG int x=0,q=1; RG char ch=getchar(); 38 while ((ch<‘0‘ || ch>‘9‘) && ch!=‘-‘) ch=getchar(); 39 if (ch==‘-‘) q=-1,ch=getchar(); 40 while (ch>=‘0‘ && ch<=‘9‘) x=x*10+ch-48,ch=getchar(); 41 return q*x; 42 } 43 44 int main(){ 45 #ifndef ONLINE_JUDGE 46 freopen("backup.in","r",stdin); 47 freopen("backup.out","w",stdout); 48 #endif 49 n=gi(),k=gi(),tot=n-1; 50 for (RG int i=1;i<=n;++i) dis[i]=gi(),lst[i]=i-1,nxt[i]=i+1; 51 for (RG int i=1;i<n;++i) Q.push((data){i,val[i]=dis[i+1]-dis[i]}); 52 nxt[n-1]=nxt[n]=0; 53 while (k--){ 54 while (del[Q.top().x]) Q.pop(); RG int x=Q.top().x; Q.pop(); 55 ans+=val[x],del[x]=del[lst[x]]=del[nxt[x]]=1; 56 if (!lst[x]) lst[nxt[nxt[x]]]=0; 57 else if (!nxt[x]) nxt[lst[lst[x]]]=0; else{ 58 val[++tot]=val[lst[x]]+val[nxt[x]]-val[x]; 59 lst[tot]=lst[lst[x]],nxt[tot]=nxt[nxt[x]]; 60 if (lst[tot]) nxt[lst[tot]]=tot; 61 if (nxt[tot]) lst[nxt[tot]]=tot; 62 Q.push((data){tot,val[tot]}); 63 } 64 } 65 printf("%lld\n",ans); return 0; 66 }
标签:ring 备份 使用 整数 inline tchar 组成 顺序 需要
原文地址:http://www.cnblogs.com/wfj2048/p/7296168.html