链接: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 ;
}


最新文章

  1. bzoj4237 稻草人
  2. useradd与adduser的区别
  3. js中各种跨域问题实战小结(一)
  4. 关于怎样解决eclipse打开时出现的Failed to load the JNIshared library亲测有效
  5. WPF PopupNonTopmost重写
  6. JAVA基础知识之JVM-——类加载器
  7. 为App签名(为apk签名)
  8. JAVA 99乘法表实例
  9. 单元测试篇----cppUnit的安装与使用
  10. 能用存储过程的DBHelper类
  11. bzoj2215: [Poi2011]Conspiracy
  12. 转 四大Java EE容器(Tomcat、JBoss、Resin、Glassfish)之简单比较
  13. linux 查看某进程或程序的网卡流量(转)
  14. 从 Spring 2.5 开始就可以使用注解来配置依赖注入,而不是采用 XML 来描述一个 bean。
  15. UPS不间断电源网络功能介绍
  16. SharePoint 2007 列表页定制--4个默认页定制
  17. .Net Core部署IIS
  18. ABP vue+asp.net core yarn serve报 Cannot find module &#39;typescript/package.json错误
  19. day_8文件的操作
  20. php输出数据到csv文件

热门文章

  1. 总结JavaScript对象的深浅拷贝
  2. JMeter+Grafana+Influxdb搭建可视化性能测试监控平台(待继续完善。。。)
  3. php 关于php创建 json文件 和 对文件增删改查 示例
  4. qt creator源码全方面分析(2-3-2)
  5. 隐藏Web Shell
  6. Android更改popupmenu背景并显示图标
  7. 刷题94. Binary Tree Inorder Traversal
  8. C#设计模式学习笔记:(22)备忘录模式
  9. ES6 - 基础学习(5): 数值扩展
  10. jni 文件切割合并