C. Colored Rooks
题意
这
个
题
的
题
意
有
一
些
复
杂
,
给
你
一
个
1
e
9
∗
1
e
9
的
棋
盘
这个题的题意有一些复杂,给你一个1e9*1e9的棋盘
这个题的题意有一些复杂,给你一个1e9∗1e9的棋盘
给
你
n
种
棋
子
,
m
个
关
系
给你n种棋子,m个关系
给你n种棋子,m个关系
所
有
有
关
系
的
棋
子
必
须
在
同
一
行
同
一
列
出
现
所有有关系的棋子必须在同一行同一列出现
所有有关系的棋子必须在同一行同一列出现
所
有
不
具
有
关
系
的
棋
子
不
能
在
同
一
行
同
一
列
出
现
所有不具有关系的棋子不能在同一行同一列出现
所有不具有关系的棋子不能在同一行同一列出现
构
造
这
个
棋
盘
,
每
种
棋
子
可
以
多
次
使
用
,
总
棋
子
数
不
能
超
过
5000
构造这个棋盘,每种棋子可以多次使用,总棋子数不能超过5000
构造这个棋盘,每种棋子可以多次使用,总棋子数不能超过5000
1
<
=
n
<
=
100
0
<
=
m
<
=
m
i
n
(
1000
,
n
∗
(
n
−
1
)
/
2
)
1<=n<=100 \ \ \ \ 0<=m<=min(1000,n*(n-1)/2)
1<=n<=100 0<=m<=min(1000,n∗(n−1)/2)
做法
由
于
每
种
棋
子
可
以
用
多
次
,
我
们
就
每
次
就
每
次
用
两
个
棋
子
构
造
一
种
关
系
由于每种棋子可以用多次,我们就每次就每次用两个棋子构造一种关系
由于每种棋子可以用多次,我们就每次就每次用两个棋子构造一种关系
如
何
构
造
比
较
好
实
现
呢
如何构造比较好实现呢
如何构造比较好实现呢
每
种
棋
子
都
放
在
一
行
,
对
每
种
关
系
,
都
在
当
前
行
新
加
棋
子
每种棋子都放在一行,对每种关系,都在当前行新加棋子
每种棋子都放在一行,对每种关系,都在当前行新加棋子
在
关
系
对
应
的
棋
子
那
一
行
也
加
上
棋
子
,
在关系对应的棋子那一行也加上棋子,
在关系对应的棋子那一行也加上棋子,
为
了
不
让
这
个
关
系
对
其
他
关
系
有
影
响
,
每
次
放
棋
子
都
让
横
坐
标
右
移
1
为了不让这个关系对其他关系有影响,每次放棋子都让横坐标右移1
为了不让这个关系对其他关系有影响,每次放棋子都让横坐标右移1
注意每个棋子都要先于自己建立关系再右移
代码
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
typedef pair<int,int> pii;
const int maxn = 105;
int con[maxn][maxn];
vector<pii> ans[maxn];
int cnt[200];
int main()
{
int n,m,x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) con[i][i]=1;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
con[x][y]=1;
con[y][x]=1;
}
int cnt=0;
for(int i=1;i<=n;i++)
{
ans[i].push_back(pii(++cnt,i));
for(int j=i+1;j<=n;j++)
{
if(con[i][j])
{
ans[i].push_back(pii(++cnt,i));
ans[j].push_back(pii(cnt,j));
}
}
}
for(int i=1;i<=n;i++)
{
printf("%d\n",ans[i].size());
for(int j=0;j<ans[i].size();j++)
{
printf("%d %d\n",ans[i][j].first,ans[i][j].second);
}
}
return 0;
}