首页 > 其他分享 >牛客 55994 2023牛客五一集训派对day3 D Points Construction Problem

牛客 55994 2023牛客五一集训派对day3 D Points Construction Problem

时间:2023-05-01 18:33:24浏览次数:55  
标签:连通 ch day3 贡献 牛客 Points 2n include

D-Points Construction Problem_2023牛客五一集训派对day3 (nowcoder.com)

将图上恰好 \(n\) 个点染成黑色,使得图上相邻的黑白点对数量恰好为 \(m\)

考虑 \(n\) 个黑点如果不相邻,则两个点的贡献互不影响

考虑相邻的情况,我们把相邻的点连边,则贡献为每一个连通块的贡献的和,我们用一个二元组表示一个连通块的大小和贡献 \((x, y)\)

若一个连通块大小为 \(n\),则其贡献最大为 \(2n + 2\),如果初始的 \(m > 2n + 2\),我们可以从中分出一个单独的块 \((1, 4)\),最后一定会剩余 \((n, m)\) 保证 \(m \leq 2n + 2\)

考虑将剩下的 \((n, m)\) 归为一个连通块,我们可以发现一个结论,如果连通块中每存在一个 \(2\times 2\) 的子矩阵,该连通块的贡献在 \(2n + 2\) 的基础上减 \(2\),于是我们可以贪心的让 \(2\times 2\) 的子矩阵尽可能多

若剩下的 \((n, m)\) 无法归为一个连通块,即 \(m\) 小于 \(n\) 能提供的贡献的下界,而将其分为更多的连通块,一定比 \(n\) 个点形成一个连通块贡献要多,于是我们只需要判断归为一个连通块是否合法即可

且在上述过程中,我们不难发现贡献一直都为偶数,则 \(m\) 为奇数的时候一定输出 No

#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <cstring>
#include <functional>

#define i64 long long

inline i64 read() {
	bool sym = 0; i64 res = 0; char ch = getchar();
	while (!isdigit(ch)) sym |= (ch == '-'), ch = getchar();
	while (isdigit(ch)) res = (res << 3) + (res << 1) + (ch ^ 48), ch = getchar();
	return sym ? -res : res;
}

struct ANS {
	int x, y;
};

int main() {
	int T = read();
	while (T--) {
		int n = read(), m = read(), t = 1, cnt = 0;
		ANS ans[n + 1];
		if (m > 4 * n) {printf("No\n"); continue;}
		if (n == 1 && m == 2) {printf("No\n"); continue;}
		if (m % 2 == 1) {printf("No\n"); continue;}
		while (m > 2 * n + 2) {
			m -= 4; n--; ans[++cnt] = {t, t}; t++;
		}
		int inf = 1000, k = (2 * n + 2 - m) / 2;
		if (!k) {
			printf("Yes\n");
			for (int i = 1; i <= n; i++) ans[++cnt] = {inf + t, inf + t + i - 1};
			for (int i = 1; i <= cnt; i++) printf("%d %d\n", ans[i].x, ans[i].y);
			continue;
		}
		for (int i = 1; n && k; i++) {
			for (int j = 1; n && k && j <= i - 1; j++) {
				if (j != 1) k--; n--;
				ans[++cnt] = {inf + i, inf + j};
			}
			for (int j = 1; n && k && j <= i; j++) {
				if (j != 1) k--; n--;
				ans[++cnt] = {inf + j, inf + i};
			}
		}
		if (k) {printf("No\n"); continue;}
		for (int i = 1; i <= n; i++) ans[++cnt] = {inf + 1, inf - i + 1};
		printf("Yes\n");
		for (int i = 1; i <= cnt; i++) printf("%d %d\n", ans[i].x, ans[i].y);
	}
	return 0;
}

标签:连通,ch,day3,贡献,牛客,Points,2n,include
From: https://www.cnblogs.com/zrzring/p/NC55994D.html

相关文章

  • image as set of points
    ImageAsSetOfPointsAbstract提取图像特征的几种方法:ConvNets:将图像视为矩形中有组织的像素,并通过局部区域的卷积运算提取特征;VisionTransformers(ViTs):将图像视为一系列补丁,并通过全局范围内的注意力机制提取特征。ContextClusters(CoCs):上下文聚类将图像视为一组......
  • “蔚来杯“2022牛客暑期多校训练营3,签到题CAJHF
    题号标题已通过代码通过率团队的状态AAncestor点击查看1383/3940BBoss点击查看54/734CConcatenation点击查看2603/9404DDirected点击查看62/157EElectrician点击查看18/38FFief点击查看378/2528GGeometry点击查看73/1076HHacker点击查看468......
  • 【牛客编程题】Python机器学习(入门例题5题)
    【牛客编程题】Python机器学习(入门例题5题)做题链接:https://www.nowcoder.com/exam/oj?page=1&tab=Python篇&topicId=329文章目录AI1鸢尾花分类_1AI2鸢尾花分类_2AI3决策树的生成与训练-信息熵的计算AI4决策树的生成与训练-信息增益AI5使用梯度下降对逻辑回归进行训练AI1鸢尾......
  • “蔚来杯“2022牛客暑期多校训练营2,签到题GJK
    题号标题已通过代码通过率团队的状态AFalfawithPolygon点击查看56/445Blight点击查看50/326CLinkwithNimGame点击查看192/1035DLinkwithGameGlitch点击查看831/6211EFalfawithSubstring点击查看264/3287FNIOwithStringGame点击查看52/......
  • 【牛客编程题】shell34题(Linux awk,grep命令)
    【牛客编程题】shell34题(Linuxawk,grep命令)SHELL01-22:基本文本处理SHELL23-28:nginx日志分析SHELL29-32:netstat练习做题链接:https://www.nowcoder.com/exam/oj?page=1&tab=SHELL%E7%AF%87&topicId=195参考资料:https://github.com/jaywcjlove/linux-command文章目录从awk命令开始对......
  • “蔚来杯“2022牛客暑期多校训练营1,签到题GADI
    题号标题已通过代码通过率团队的状态AVillages:Landlines点击查看1673/4177通过BSpiritCircleObservation点击查看39/299未通过CGrabtheSeat!点击查看88/392未通过DMochaandRailgun点击查看1589/8517通过ELTCS点击查看43/324未通过FCut点击......
  • 代码随想录Day38-Leetcode509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯
    咳咳,因为找实习+摆导致时间被浪费大半;先从动态规划学起吧,之前的慢慢补。理论基础动态规划的解题步骤1.确定dp数组及对应下标的含义2.确定dp的状态转移方程(递推公式)3.确定dp数组如何初始化4.确定dp遍历顺序5.距离推导dp数组验证509.斐波那契数题目链接:https://le......
  • 2021牛客OI赛前集训营-提高组(第二场)第三题 树数树题解
    题目描述牛牛有一棵\(n\)个点的有根树,根为\(1\)。我们称一个长度为\(m\)的序列\(a\)是好的,当且仅当:\(\foralli\in(1,m]\),\(a_i\)为\(a_{i−1}\)的祖先或\(a_{i−1}\)是\(ai\)的祖先\(\forall1\leqi\ltj\leqm,a_i\neqa_j\)你需要帮助牛牛求出最长的......
  • 2021牛客OI赛前集训营-提高组(第三场) 第二题 交替 题解与结论证明
    题目描述一个长度为\(n\)的数组\(A\),每秒都会变成一个长度为\(n−1\)新数组\(A'\),其变化规则如下:若当前数组\(A\)的长度\(n\)为偶数,则对于新数组\(A'\)的每一个位置\(i(1≤i<n)\)来说,\(A'[i]=A[i]+A[i+1]\)若当前数组\(A\)的长度\(n\)为奇数,则对于......
  • 牛客小白月赛71
    A.猫猫与广告题目:分析:只需考虑c*d的矩阵竖着摆和横着摆两种情况。本题提示了考虑两矩阵对应边平行的情况,实际上可以证明倘若能斜着放,那么一定可以横着放或竖着放,证明方式可已通过构造三角形来证明a*b的矩阵的长宽一定小于c*d矩阵的长宽。code:#include<iostream>#inc......