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(‘\n‘)
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(‘\n‘)
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 }
时间: 2024-08-10 21:30:11

COJ 2110 Day7-例3的相关文章

中南大学COJ 1216: 异或最大值(数据结构)

中南大学COJ 1216: 异或最大值(数据结构) ACM 题目地址:COJ 1216 题意: 中文题,注意是多组样例. 分析: 用01Trie做的. 代码: /* * Author: illuz <iilluzen[at]gmail.com> * File: coj1216.cpp * Create Date: 2014-07-27 14:18:44 * Descripton: trie */ #include <cstdio> #include <cstring>

COJ 0801 非传统题(一)

非传统题(一) 难度级别:A: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 大家好!我是COJ第一道非传统题,是不是感觉非常的excited? 作为第一道非传统题,自然要给大家水一水. 不过呢首先要告诉大家什么是非传统题?非传统题实际上就是没有固定的输入输出,很奇怪的题目.本题作为一道引例希望大家喜欢~ 接下来是题目内容: 很久很久以前,chx出过一道大水题. ------------可是,很可惜他丢失了样例.... 现在,chx给你

Linux运维-day7

Day7 Georgekai-习惯:操作前备份,操作后检查    张开嘴.勤动手 命令补充: 1. $()的用法: a) ls -l $(which awk) 注:"$()"的作用:先运行括号里面的命令,把结果留下来,或着用"``" 反引号   也可以 b)   sed  's#boy#girl#g'  $(find /data/  -type f -name '*.log')  -i c) 例:[[email protected] ~]# find /data/

Python Socket 编程——聊天室演示样例程序

上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和client的代码了解主要的 Python Socket 编程模型.本文再通过一个样例来加强一下对 Socket 编程的理解. 聊天室程序需求 我们要实现的是简单的聊天室的样例,就是同意多个人同一时候一起聊天.每一个人发送的消息全部人都能接收到,类似于 QQ 群的功能,而不是点对点的 QQ 好友之间的聊天.例如以下图: 图来自:http://www.ibm.com/developerworks/linux/tu

python+selenium+unitest用例失败重运行

经过多次研读和调试unittest代码,后来发现一个也可以重运行setUp()和dearDown()的解决办法,那就是修改源码,我们重新建一个模块套件类来覆盖原来的TestSuite类 实例代码: [python] view plain copy class Suit(unittest.TestSuite): def run(self, result, debug=False): failcount = 1#失败总运行次数 class_num = 1 topLevel = False if ge

多线程下的单例-double check

话不多说直接上代码: public sealed class Singleton { private static Singleton _instance = null; // Creates an syn object. private static readonly object SynObject = new object(); Singleton() { } public static Singleton Instance { get { // Double-Checked Lockin

ADF Faces导出Excel文件【附样例工程】

本文提供一个基于ADF Face组件开发样例工程,工程的实现过程分为3个部分以应对Excel导出开发中常见的处理. 1.空模版文件下载:将Excel文件视为普通文件提供下载操作. 2.数据文件输出,将数据内容输出为Excel文件,目标文件尽在服务端内存中存在,这种方式需要对Excel文件的内容处理,需要引入响应的类库. 3.模版文件填充数据后下载,基于服务端的物理文件为模板,将业务数据填入约定位置后提供下载,在实现方面需要为工作簿对象指定源文件输入流,并完成后续内容处理. 实现的基本思路,由AD

华为Huawei Honor6 荣耀6 开机卡住不进系统恢复一例

Huawei Honnor6 荣耀6 开机卡住不进系统无损镜像一例 昨天接到我们客户一台華為Honnor6 荣耀6,开机卡屏,进不了系统,要求恢复数据.如题 在我们UFED的帮助下,最后手机无损取得镜像,芯片完好无损,数据也完无损!Thats amazing! 各位有需要的可以联系我!微信17701607488 网址https://shop110840885.taobao.com/ -----

单例设计模式

一:单例设计模式的定义 单例设计模式,顾名思义,就是在整个程序运行过程中,只向外界提供一个对象,这样做可以避免资源的浪费,例如 我们打开回收站或者ppt时,只会启动一个窗口. 单例模式的java实现: 1:饿汉式 1 /** 2 * 3 */ 4 package com.hlcui.singleton; 5 6 /** 7 * @author Administrator 饿汉式单例类 8 */ 9 public class SingletonDemo { 10 // 1:内部创建一个对象 11