現在你有 n 塊矩形木板,第 i 塊木板的尺寸是 xi*yi,你想用這些木板來玩漢諾塔的遊戲。
我們知道玩漢諾塔遊戲需要把若干木板按照上小下大的順序堆疊在一起,但因為木板是矩形,所以有乙個問題:
第 i 塊木板能放在第 j 塊木板上方當且僅當 xi你想把這些木板分為盡可能少的組,使得每組內的木板都能按照一定的次序疊放。
你需要給出任意一種合理的分組方案。
第一行,乙個正整數 n
接下來 n 行,每行兩個正整數表示 xi 和 yi
對於所有的資料,1≤n≤100,000,1≤xi,yi≤n,xi 互不相等且 yi 互不相等
輸出檔案包含兩行,第一行乙個正整數,表示最少組數
第二行 n 個正整數,依次表示你的方案中每塊木板分在了哪一組
組的編號必須是從 1 開始的連續整數
示例1複製
3複製1 12 3
3 2
21 1 2
思路 洛谷p1020的變形,可以參考我這篇題解基本不變
code
1 #include 2view code#define dbg(x) cout << #x << "=" << x << endl
3#define eps 1e-8
4#define pi acos(-1.0)56
using
namespace
std;
7 typedef long
long
ll;8
9 templateinline void read(t &res)
1015
16namespace
_buff
24return ib == ie ? -1 : *ib++;25}
26}2728
intqread()
36if (c == '-'
) 40
for (; c >= '
0' && c <= '
9'; c =getc())
43return pos ? ret : -ret;44}
4546
const
int maxn = 1e5 + 7;47
48int
n;49
50struct
node a[maxn];
5354
bool
cmp(node a, node b)
5758
int tot[maxn];///
在哪個堆
59int
f[maxn];
6061
intmain()
6268 sort(a+1, a+n+1
, cmp);
69int len = 1
;70 f[len] = a[1].y;tot[a[1].id]++;
71for(int i = 2; i <= n; ++i)
76else81}
82 printf("
%d\n
",len);
83for(int i = 1; i <= n; ++i) 88}
89 puts(""
);90
return0;
91 }
計蒜客 漢諾塔
漢諾塔 又稱河內塔 問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著 64 片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。現在蒜頭君開...
漢諾塔(6種情況)
a c include includevoid hanoi int n,char a,char b,char c 漢諾塔 int main a b include includevoid hanoi int n,char a,char b,char c 漢諾塔 int main b a includ...
漢諾塔c 實現
用c 實現了漢諾塔,使用了遞迴,使用了上一次實現的堆疊這個資料結構來實現的漢諾塔,下面是 stack.h main.cpp stackdemo created by xin wang on 4 15 15.include class outofbounds 刪除定義的陣列 bool isempty ...