链接:https://ac.nowcoder.com/acm/contest/3007/C
来源:牛客网

题目描述

现在你有 N 块矩形木板,第 i 块木板的尺寸是 Xi*Yi,你想用这些木板来玩汉诺塔的游戏。
我们知道玩汉诺塔游戏需要把若干木板按照上小下大的顺序堆叠在一起,但因为木板是矩形,所以有一个问题:
第 i 块木板能放在第 j 块木板上方当且仅当 Xi<Xj 且 Yi<Yj,于是你很可能没法把所有的木板按照一定的次序叠放起来。
你想把这些木板分为尽可能少的组,使得每组内的木板都能按照一定的次序叠放。
你需要给出任意一种合理的分组方案。
提醒:“任意”意味着你的答案不必和标准输出完全一致,只要正确即可。

输入描述:

第一行,一个正整数 N
接下来 N 行,每行两个正整数表示 Xi 和 Yi
对于所有的数据,1≤N≤100,000,1≤Xi,Yi≤N,Xi 互不相等且 Yi 互不相等

输出描述:

输出文件包含两行,第一行一个正整数,表示最少组数
第二行 N 个正整数,依次表示你的方案中每块木板分在了哪一组
组的编号必须是从 1 开始的连续整数
示例1

输入

复制 3
1 1
2 3
3 2

3
1 1
2 3
3 2

输出

复制 2
1 1 2

2
1 1 2 思路  洛谷P1020的变形,可以参考我这篇题解https://www.cnblogs.com/orangeko/p/12273965.html,基本不变
CODE
 #include <bits/stdc++.h>
#define dbg(x) cout << #x << "=" << x << endl
#define eps 1e-8
#define pi acos(-1.0) using namespace std;
typedef long long LL; template<class T>inline void read(T &res)
{
char c;T flag=;
while((c=getchar())<''||c>'')if(c=='-')flag=-;res=c-'';
while((c=getchar())>=''&&c<='')res=res*+c-'';res*=flag;
} namespace _buff {
const size_t BUFF = << ;
char ibuf[BUFF], *ib = ibuf, *ie = ibuf;
char getc() {
if (ib == ie) {
ib = ibuf;
ie = ibuf + fread(ibuf, , BUFF, stdin);
}
return ib == ie ? - : *ib++;
}
} int qread() {
using namespace _buff;
int ret = ;
bool pos = true;
char c = getc();
for (; (c < '' || c > '') && c != '-'; c = getc()) {
assert(~c);
}
if (c == '-') {
pos = false;
c = getc();
}
for (; c >= '' && c <= ''; c = getc()) {
ret = (ret << ) + (ret << ) + (c ^ );
}
return pos ? ret : -ret;
} const int maxn = 1e5 + ; int n; struct node {
int x,y,id;
}a[maxn]; bool cmp(node a, node b) {
return a.x > b.x;
} int tot[maxn];///在哪个堆
int f[maxn]; int main()
{
scanf("%d",&n);
for(int i = ; i <= n; ++i) {
scanf("%d %d",&a[i].x, &a[i].y);
a[i].id = i;///类似并查集那样先把自己设成祖先
}
sort(a+, a+n+, cmp);
int len = ;
f[len] = a[].y;tot[a[].id]++;
for(int i = ; i <= n; ++i) {
if(a[i].y >= f[len]) {///保证下降
f[++len] = a[i].y;
tot[a[i].id] = len;
}
else {
int p = lower_bound(f+, f+len+, a[i].y) - f;
f[p] = a[i].y;
tot[a[i].id] = p;
}
}
printf("%d\n",len);
for(int i = ; i <= n; ++i) {
if(i == ) printf("%d", tot[i]);
else {
printf(" %d",tot[i]);
}
}
puts("");
return ;
}


牛客寒假6-C汉诺塔的更多相关文章

  1. Conquer and Divide经典例子之汉诺塔问题

    递归是许多经典算法的backbone, 是一种常用的高效的编程策略.简单的几行代码就能把一团遭的问题迎刃而解.这篇博客主要通过解决汉诺塔问题来理解递归的精髓. 汉诺塔问题简介: 在印度,有这么一个古老 ...

  2. 杭电oj1995——汉诺塔V(java实现)

    正文之前,先说下做这题的心路历程(简直心累) 这是今天下午的第一道题 第一次看到题目标题——汉诺塔 内心OS:wc,汉诺塔诶,听名字就很难诶,没做过诶,肯定很难实现吧,不行,我得去看看讲解 然后就上b ...

  3. 题目---汉诺塔及AI代码及八皇后

    2019春第十一周作业 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering ...

  4. 汉诺塔(思维、DP思想)

    链接:https://ac.nowcoder.com/acm/contest/3007/C来源:牛客网 题目描述 现在你有 N 块矩形木板,第 i 块木板的尺寸是 Xi*Yi,你想用这些木板来玩汉诺塔 ...

  5. fzu1036四塔问题(汉诺塔问题拓展)

    #include<iostream> #include<cstdio> #include<cmath> using namespace std; ]; int ru ...

  6. python解决汉诺塔问题

    今天刚刚在博客园安家,不知道写点什么,前两天刚刚学习完python 所以就用python写了一下汉诺塔算法,感觉还行拿出来分享一下 首先看一下描述: from :http://baike.baidu. ...

  7. 汉诺塔问题C++实现

    大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下进行汉诺塔问题的递归实现 #include <iostream.h> int gb ...

  8. C++汉诺塔递归实现

    程序背景: 汉诺塔(Tower of Hanoi)又称河内塔,问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命 ...

  9. C语言 汉诺塔问题

    //凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 汉诺塔是由三根杆子A,B,C组成的.A杆上有n个(n>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按 ...

随机推荐

  1. 动手学习pytorch——(2)softmax和分类模型

    内容太多,捡重要的讲. 在分类问题中,通常用离散的数值表示类别,这里存在两个问题.1.输出值的范围不确定,很难判断值的意义.2.真实标签是离散值,这些离散值与不确定的范围的输出值之间的误差难以衡量. ...

  2. 渡一教育公开课重点笔记之css

    主流浏览器及内核 浏览器         内核 IE             trident Firefox    Gecko Google chrome    Webkit/blink(2014年上 ...

  3. tomcat 访问权限设置

    1.全局设置,设置允许某些IP能够访问到tomcat服务器,或不能访问tomcat服务器 只需要编辑tomcat的server.xml,增加适当代码即可. 修改如下:在<Host>  &l ...

  4. 配置ASA防火墙 远程管理方式

          受不了,asa和思科路由器 系统命令不一致,这一篇专门来写asa.      先看下版本 asa825# show version      Cisco Adaptive Security ...

  5. Oracle 重启监听

    对于DBA来说,启动和关闭oracle监听器是很基础的任务,但是Linux系统管理员或者程序员有时也需要在开发数据库中做一些基本的DBA操作,因此了解一些基本的管理操作对他们来说很重要. 本文将讨论用 ...

  6. Nginx Rewrite相关功能

    目录 Nginx Rewrite相关功能 ngx_http_rewrite_module模块指令: if指令: set指令: break指令: return指令: rewrite_log指令: rew ...

  7. SQLyog12.08详细安装教程

    SQLyog安装教程 一.软件下载 为了更好的学习,我们需要可视化界面,而不仅仅是通过命令行黑窗口管理数据库.SQLyog 就是一个快速而简洁的图形化管理MYSQL数据库的工具. SQLyog12.0 ...

  8. Windwos应急响应和系统加固(1)——Windwos操作系统版本介绍

    Windwos操作系统版本介绍 1. Micorsoft  Windows XP  ·Microsoft官方发布时间以及终止提供服务时间:2001.10.25-2014.4.8   产生漏洞:MS08 ...

  9. Learning hard 学习笔记

    第一章 你真的了解C#吗 1.什么是C#, 微软公司,面向对象,运行于.NET Framework之上, 2.C#能编写哪些应用程序, Windows应用桌面程序,Web应用程序,Web服务, 3.什 ...

  10. Python 中使用 Pillow 处理图片增加水印

    这个是个比较常见的需求,比如你在某个网站上发布了图片,在图片上就会出现带你昵称的水印.那么在Python中应该如何处理这一类需求呢? 其实在我的<Django实战开发>视频教程中有讲到这一 ...