模块装配

(mdu.pas/c/cpp/in/out,1s,64MB)

题目描述

公元4774 年,宣称能够让人类一劳永逸地获取无限能源的“太阳开发计划”被正式提上了日程。政府首脑Ehrgeiz 慷慨激昂地对选民们说:“太阳的能量是永远也是用不完的!我们人类从此将进入一个再也不缺乏能源的时代!”在一片欢呼声中,突然一个声音传来:“可是,Ehrgeiz 先生,我们对于太阳能量的多寡以及人类对于能源的需求还没有了解到那个程度上,怎么能够做出这种断言呢?”提出异议的是科学院的领袖 Sonne。“Sonne 先生,事情不是明摆着的吗?太阳的能量足够使用至少50 亿年啊!显然是取之不尽的了!”“Ehrgeiz 先生,我必须提醒您,‘显然’是科学中最危险的一个词。”Sonne 正色说道,“我们在使用完地球的能源之后,现在又要糟蹋太阳了。我们在过去的一百年中用掉的能源比这之前整个文明史所使用的能源加在一起都要多。我很担心如果这个计划实施的话,不懂的节约的人类最终也会把太阳用光。”“哼,Sonne 先生,你就不要继续试图阻止这项计划了。你的理由根本就站不住脚。卫队,把Sonne 先生请出去吧。”Ehrgeiz 不屑一顾地说。“Ehrgeiz!你……”仪式结束之后,Ehrgeiz 叫来了项目主管Wolke。

“哼,又是那个 Sonne 给我难看。Wolke,准备工作做得怎么样了?”Wolke 说:“已经接近尾声了。但是还有一些特殊的模块没有装配完毕。”“那就赶紧去做啊!”Ehrgeiz 说。“可是,Ehrgeiz 先生,这些模块的安装非常复杂,而且需要一个最优的方案,否则我们的材料根本就不够。”Wolke 对Ehrgeiz 说。于是 Ehrgeiz 立刻想起了作为顶级信息学专家的你。你需要帮助Wolke 解决这个问题。“……喂喂,扯了半天淡,到底是什么问题啊!?”你着急地问。

具体来说是这样的:有 N 个模块需要安装在若干个连接器上。连接器和模块都可以看

作是一维的元件,连接器上有一排端口,模块要占用一段端口,一个端口只能给一个模块使用。由于模块的特殊性,第i 个模块需要占用连接器的[Ai, Bi]这一段端口。现在的问题是,如果所有的模块都需要被安装,至少需要多少个连接器,并给出一种可行方案。

输入格式

第一行是一个整数N,代表模块的数目。

之后 N 行,第i + 1 行有两个整数Ai, Bi。其中Ai 和Bi 表示第i 个模块需要占用的连接

器端口范围。

输出格式

第一行一个整数T,表示至少要使用多少个连接器。

之后 N 行,第i + 1 行包含一个整数Ki。Ki 是一个1 至T 之间的整数,表示第i 个模块

要占用的连接器编号。

样例输入

5

1 10

2 4

3 6

5 8

4 7

样例输出

4

1

2

3

2

4

样例中的情况自己yy

数据范围与约定

对于40% 的数据,N≤100。

对于 100% 的数据,N≤50000,1≤Ai, Bi≤106。

  思路:搞一个小根堆,把所有模块的右端点全部加入,再让模块按照左端点由小到大排个序,之后再用个并查集维护各个模块之间的关系。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstdlib>
  4 #include<cmath>
  5 #include<algorithm>
  6 #include<cstring>
  7 #include<string>
  8 #include<queue>
  9 using namespace std;
 10 inline int read(){
 11     int x=0,f=1;char ch=getchar();
 12     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
 13     while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
 14     return x*f;
 15 }
 16
 17 int N;
 18 struct node{
 19     int l,r;
 20     int po;
 21     int num;
 22 }a[50005];
 23 int ans[50005];
 24 int fa[50005];
 25 inline int getfa(int x){
 26     if(fa[x]!=x) fa[x]=getfa(fa[x]);
 27     return fa[x];
 28 }
 29
 30 int cmp(const node&w,const node&e){
 31     if(w.l<e.l) return 1;
 32     return 0;
 33 }
 34 int cnt;
 35
 36 int heap[50005],heap_size;
 37 int pos[50005];//记录堆中元素是第几个模块
 38 int res,mini;
 39 inline void put(int d,int h){
 40     int now,next;
 41     heap[++heap_size]=d;
 42     pos[heap_size]=h;
 43     now=heap_size;
 44     while(now>1){
 45         next=now>>1;
 46         if(heap[next]<=heap[now]) return ;
 47         swap(heap[next],heap[now]);
 48         swap(pos[next],pos[now]);
 49         now=next;
 50     }
 51 }
 52 inline void get(){
 53     int now,next;
 54     res=heap[1]; mini=pos[1];
 55     heap[1]=heap[heap_size];
 56     pos[1]=pos[heap_size--];
 57     now=1;
 58     while(now<<1<=heap_size){
 59         next=now<<1;
 60         if(next+1<=heap_size&&heap[next+1]<heap[next]) next++;
 61         if(heap[now]<=heap[next]) return ;
 62         swap(heap[now],heap[next]);
 63         swap(pos[now],pos[next]);
 64         now=next;
 65     }
 66     return ;
 67 }
 68 int main(){
 69 //    freopen("mdu.in","r",stdin);
 70 //    freopen("mdu.out","w",stdout);
 71     N=read();
 72     for(int i=1;i<=N;i++) a[i].l=read(),a[i].r=read(),a[i].po=i;
 73     sort(a+1,a+N+1,cmp);
 74     for(int i=1;i<+N;i++){
 75         put(a[i].r,i);//右端点全部加入堆,记录下标
 76         fa[i]=i;
 77     }
 78     get();
 79     for(int i=1;i<=N;i++){
 80         if(res<a[i].l){
 81             int fai=getfa(i);
 82             int famini=getfa(mini);
 83             if(fai!=famini){
 84                 if(fai<famini) fa[famini]=fai;
 85                 else fa[fai]=famini;
 86             }
 87             get();
 88         }
 89         else continue;
 90     }
 91
 92     for(int i=1;i<=N;i++){
 93         int fath=getfa(i);
 94         if(fath!=i){//说明与其他模块公用连接器
 95             if(a[fath].num!=0){
 96                 a[i].num=a[fath].num;
 97             }
 98             else{
 99                 cnt++;
100                 a[fath].num=cnt;
101                 a[i].num=cnt;
102             }
103         }
104         else{
105             cnt++;
106             a[i].num=cnt;
107         }
108     }
109
110     for(int i=1;i<=N;i++){
111         ans[a[i].po]=a[i].num;
112     }
113     cout<<cnt<<endl;
114     for(int i=1;i<=N;i++){
115         cout<<ans[i]<<endl;
116     }
117     return 0;
118 }
时间: 2024-10-06 23:43:43

模块装配的相关文章

ASP.NET路由模型解析

大家好,我又来吹牛逼了 ~-_-~ 转载请注明出处:来自吹牛逼之<ASP.NET路由模型解析> 背景:很多人知道Asp.Net中路由怎么用的,却不知道路由模型内部的运行原理,今天我就给大家吹下ASP.NET的路由模块是如何工作的. ps:这是针对ASP.NET4.5版本的,好像在最新的5.0版本中加入了OWIN,彻底解耦了和Web服务器的耦合,我还没有研究过,不敢妄言4.5的模型适用5.0.(是不是被我严谨的态度震慑了_-_) action*0x1:大话ASP.NET模型 首先我们先来了解下一

[SpringBoot]深入浅出剖析SpringBoot中Spring Factories机制

微信号:GitShare微信公众号:爱折腾的稻草如有问题或建议,请在公众号留言[1] 前续 为帮助广大SpringBoot用户达到"知其然,更需知其所以然"的境界,作者将通过SpringBoot系列文章全方位对SpringBoot2.0.0.RELEASE版本深入分解剖析,让您深刻的理解其内部工作原理. 1.[SpringBoot]利用SpringBoot快速构建并启动项目 2.[SpringBoot]详解SpringBoot应用的启动过程 3.[SpringBoot]深入浅出剖析Sp

Spring Boot 2.0深度实践之核心技术篇

第1章 系列总览总览 Spring Boot 2.0 深度实践系列课程的整体议程,包括 Spring Boot 三大核心特性(组件自动装配.嵌入式Web容?.生产准备特性).Web 应用(传统 Servlet.Spring Web MVC.Spring WebFlux).数据相关(JDBC.JPA.事务).功能扩展(SpringApplication.Spring Boot 配置.Spring Boot Starter)以及... 第2章 走向自动装配完整地讲述了 Spring Boot 是如何

深度实践Spring Boot 2.0之核心技术篇

第1章 系列总览总览 Spring Boot 2.0 深度实践系列课程的整体议程,包括 Spring Boot 三大核心特性(组件自动装配.嵌入式Web容器.生产准备特性).Web 应用(传统 Servlet.Spring Web MVC.Spring WebFlux).数据相关(JDBC.JPA.事务).功能扩展(SpringApplication.Spring Boot 配置.Spring Boot Starter)以及... 1-1 -课程导学1-2 为什么说Spring Boot 2.0

01_Jdk自带SPI

[SPI的设计目标] 面向对象的设计里,模块之间是基于接口编程,模块之间不对实现类进行硬编码. 一旦代码里设计具体的实现类,就违法了可插拔的原则,如果需要替代一种实现,就要修改代码. 为了实现在模块装配的时候,不在模块里面写死代码,就需要一种服务发现机制. Java spi 就是提供了这样一种机制: 为某个接口寻找服务实现的机制.有点类似IOC的思想,就是讲装配的控制权转移到代码之外. [SPI的具体约定] 当服务的提供者(provider),提供了一个接口多种实现时, 一般会在jar包的MET

(转)Spring Boot(一)

(二期)4.springboot的综合讲解 [课程四]springbo...概念.xmind64.5KB [课程四]spring装配方式.xmind0.2MB [课程四预习]spri...解读.xmind0.1MB [课程四]springbo...过程.xmind0.3MB git demo : https://gitee.com/lv-success/git-second/tree/master/course-4-springboot/spring-boot-deep 讲课顺序: 第一节课程

JDK的spi实现

SPI的全名为Service Provider Interface.大多数开发人员可能不熟悉,因为这个是针对厂商或者插件的.在java.util.ServiceLoader的文档里有比较详细的介绍.简单的总结下java spi机制的思想.我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块.jdbc模块的方案等.面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码.一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实

Spring.factories扩展机制

和Java SPI的扩展机制类似,Spring Boot采用了spring.factories的扩展机制,在很多spring的starter 包中都可以找到,通过在 META-INF/spring.factories文件中指定自动配置类入口,从而让框架加载该类实现jar的动态加载. 这种为某个接口寻找服务实现的机制,有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要. 我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块.jdb

[JVM] JVM类加载机制总结

一  什么是类的加载机制 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类的加载指的是将类从“.java”代码文件编译成的“.class”字节码文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区(HotSpot虚拟机在方法区中)创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象