Fox and Minimal path

题目大意

构造一张无向图,使得从 \(1\) 到 \(2\) 的最短路数量为 \(k\)。

思路分析

我们首先可以发现当 \(k = 2^t\) 时的构造方式:

其中只有 \(O(\log k)\) 个点。

当 \(k\not = 2^t\) 时,我们可以将 \(k\) 二进制拆分,对于每一个二进制位重复上述操作,就可以得到:

当然,为了保证最短路长度相同,少的部分需要用一条链补齐。

算一下发现点数为 \(O(\log^2k)\),当 \(k\) 达到极限数据 \(2^{29}-1\) 时点数会超过 \(1000\),无法通过。

我们发现,那些用链补齐的部分是相当浪费的,也就是说,我们可以将所有用于补齐的链合并成一条:

这样我们的点数虽然依然是 \(O(\log^2 k)\) 的,但减少了一部分点,在极限数据时只需要 \(900\) 个点,可以通过。

代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath> using namespace std;
const int N = 2010, M = 50;
#define inf 0x3f3f3f3f int n, k, len, tot = 3;
int G[N][N], a[M], need[M]; void add(int u, int v){
G[u][v] = G[v][u] = 1;
} void solve(int x){
int num = tot;
if (x == 0) {
add(num, num + 1);
add(num + 1, num + 2);
add(num + 2, num + 3);
tot += 3;
if (x == len - 1) add(num + 3, 2);
else add(num + 3, need[len - 3]);
return ;
}
if (x == 1) {
add(num, num + 1);
add(num, num + 2);
add(num + 1, num + 3);
add(num + 2, num + 4);
add(num + 3, num + 5);
add(num + 4, num + 5);
tot += 5;
if (x == len - 1) add(num + 5, 2);
else add(num + 5, need[len - 3]);
return ;
}
add(num, num + 1);
add(num, num + 2);
tot += 2;
for (int i = 1; i < x; i ++) {
add(tot - 1, tot + 1);
add(tot - 1, tot + 2);
add(tot, tot + 1);
add(tot, tot + 2);
tot += 2;
}
add(tot - 1, tot + 1);
add(tot, tot + 1);
tot ++;
add(tot, need[len - x - 1]);
} int main(){
cin >> k;
while (k) {
a[++ len] = (k & 1);
k >>= 1;
}
for (int i = 1; i <= len; i ++) add(tot, tot + 1), tot ++;
add(tot, 2);
need[0] = 2;
for (int i = 1; i <= len; i ++) need[len - i + 1] = i + 3;
for (int i = 1; i <= len; i ++)
if (a[i]) {
add(1, ++ tot);
solve(i - 1);
}
printf("%d\n", tot);
for (int i = 1; i <= tot; i ++) {
for (int j = 1; j <= tot; j ++)
printf("%c", G[i][j] ? 'Y' : 'N');
printf("\n");
}
return 0;
}

Fox and Minimal path 题解的更多相关文章

  1. Codeforces Round #228 (Div. 1) B. Fox and Minimal path 构造

    B. Fox and Minimal path 题目连接: http://codeforces.com/contest/388/problem/B Description Fox Ciel wants ...

  2. codeforces 389 D. Fox and Minimal path(构造+思维)

    题目链接:https://vjudge.net/contest/175446#problem/J 题解:显然要用最多n个点构成的图要使的得到的最短路条数有1e9次个,显然要有几个数相乘容易想到2的几进 ...

  3. codeforces 388B Fox and Minimal path

    这个题目的突破口就是固定最短长度,然后以二进制的形式分层: 最后把需要的曾连起来: #include<cstdio> #include<cstring> #define max ...

  4. CF #228 div1 B. Fox and Minimal path

    题目链接:http://codeforces.com/problemset/problem/388/B 大意是用不超过1000个点构造一张边权为1的无向图,使得点1到点2的最短路的个数为给定值k,其中 ...

  5. Codeforces Round #228 (Div. 1) 388B Fox and Minimal path

    链接:http://codeforces.com/problemset/problem/388/B [题意] 给出一个整数K,构造出刚好含有K条从1到2的最短路的图. [分析] 由于是要自己构造图,当 ...

  6. 【字典树】【树】【二进制】bzoj1954/POJ3764The xor-longest Path 题解

        建立字典树是异或的一种处理方法. Description In an edge-weighted tree, the xor-length of a path p is defined as ...

  7. 洛谷 UVA12101 Prime Path 题解

    一道经典的BFS 用四个for搜索四位就行了,只要能推出怎么只变4位中的一位就很水了 #include<iostream> #include<cstring> #include ...

  8. CF1327D Infinite Path 题解

    原题链接 太坑了我谔谔 简要题意: 求一个排列的多少次幂能达到另一个排列.排列的幂定义见题.(其实不是新定义的,本来就是这么乘的) 很显然,这不像快速幂那样可以结合律. 既然这样,就从图入手. 将 \ ...

  9. Codeforces Round #228 (Div. 1) B

    B. Fox and Minimal path time limit per test 1 second memory limit per test 256 megabytes input stand ...

  10. Codeforces389D(SummerTrainingDay01-J)

    D. Fox and Minimal path time limit per test:1 second memory limit per test:256 megabytes input:stand ...

随机推荐

  1. 谁在以太坊区块链上循环交易?TuGraph+Kafka的0元流图解决方案

    都在说数据已经成为新时代的生产资料. 但随着大数据和人工智能等技术的发展,即便人们都知道数据的价值日益凸显,却无法凭借一己之力获取和分析如此大规模的数据. 要想富,先修路.要想利用新时代的数据致富,也 ...

  2. Github-Readme-Stats 简明教程

    1. 更新 Readme 文件 在你想要放置 Readme-WakaTime 的位置中放置以下注释,这将作为程序的入口 <!--START_SECTION:waka--> <!--E ...

  3. 从数据库中读取数据并写入到Excle电子表格之2

     //CC_AutoId, CC_LoginId, CC_LoginPassword, CC_UserName, CC_ErrorTimes, CC_LockDateTime, CC_TestInt ...

  4. Android实时获取摄像头画面传输至PC端

    前言 最近在做一个PC端小应用,需要获取摄像头画面,但是电脑摄像头像素太低,而且位置调整不方便,又不想为此单独买个摄像头.于是想起了之前淘汰掉的手机,成像质量还是杠杠的,能不能把手机摄像头连接到电脑上 ...

  5. 用git bash 生成 hexo 博客文件,报错node: command not found

    有git bash,也安装了node.js, 为什么在bash里面会说node: command not found? 电脑有段时间不能上网,下载了360系统急救箱,删了很多文件,包括一些exe文件, ...

  6. 说说 Linux 的 curl 命令

    cURL,熟悉 Linux 的同学,没有人不知道这个命令吧:) 它有非常非常多的参数,我这里就不复制粘贴了,有需要可以 -h 或者谷歌搜索看看. 我从实用性的角度,说下我比较常用的几个参数: -v:啰 ...

  7. 2023-07-25:你驾驶出租车行驶在一条有 n 个地点的路上 这 n 个地点从近到远编号为 1 到 n ,你想要从 1 开到 n 通过接乘客订单盈利。你只能沿着编号递增的方向前进,不能改变方向 乘

    2023-07-25:你驾驶出租车行驶在一条有 n 个地点的路上 这 n 个地点从近到远编号为 1 到 n ,你想要从 1 开到 n 通过接乘客订单盈利.你只能沿着编号递增的方向前进,不能改变方向 乘 ...

  8. Cobalt Strike使用教程二

    0x00 前言 继前一章介绍了Cobalt Strike的基本用法,本章接着介绍如何攻击.提权.维权等. 0x01 与Metasploit联动 Cobalt Strike → Metasploit m ...

  9. MySql之锁

    MySql之锁 一.全局锁 对整个数据库加锁 应用:数据库所有表备份 二.表级锁 1.表锁 分为两类: 表共享读锁read lock 表独占写锁write lock 2.元数据锁 避免DML语句和DD ...

  10. Spark RDD惰性计算的自主优化

    原创/朱季谦 RDD(弹性分布式数据集)中的数据就如final定义一般,只可读而无法修改,若要对RDD进行转换或操作,那就需要创建一个新的RDD来保存结果.故而就需要用到转换和行动的算子. Spark ...