【 Codeforces Round #518 (Div. 2) [Thanks, Mail.Ru!] C. Colored Rooks】 构造

35 篇文章 1 订阅
5 篇文章 0 订阅

C. Colored Rooks

题意

这 个 题 的 题 意 有 一 些 复 杂 , 给 你 一 个 1 e 9 ∗ 1 e 9 的 棋 盘 这个题的题意有一些复杂,给你一个1e9*1e9的棋盘 1e91e9
给 你 n 种 棋 子 , m 个 关 系 给你n种棋子,m个关系 nm
所 有 有 关 系 的 棋 子 必 须 在 同 一 行 同 一 列 出 现 所有有关系的棋子必须在同一行同一列出现
所 有 不 具 有 关 系 的 棋 子 不 能 在 同 一 行 同 一 列 出 现 所有不具有关系的棋子不能在同一行同一列出现
构 造 这 个 棋 盘 , 每 种 棋 子 可 以 多 次 使 用 , 总 棋 子 数 不 能 超 过 5000 构造这个棋盘,每种棋子可以多次使用,总棋子数不能超过5000 使5000
1 &lt; = n &lt; = 100      0 &lt; = m &lt; = m i n ( 1000 , n ∗ ( n − 1 ) / 2 ) 1&lt;=n&lt;=100 \ \ \ \ 0&lt;=m&lt;=min(1000,n*(n-1)/2) 1<=n<=100    0<=m<=min(1000,n(n1)/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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值