ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NFLSOJ #12445 -「NOIP2021模拟赛p_b_p_b#1」不等(构造)

2021-10-22 10:33:38  阅读:179  来源: 互联网

标签:lceil 12445 颜色 NFLSOJ int sqrt 相邻 NOIP2021 rceil


题面传送门

小清新人类思维构造题,CSP 前写篇题解(谁是鸽王?)

首先考虑如果不存在 \(01\) 个数不等这一条件如何处理,显然我们只需按 __builtin_parity 填数即可,这样显然所有与其相连的点的颜色都与其不同。

接下来思考原题。注意到我们随便填数大概率是符合“\(01\) 不等”这一条件,但不一定符合相邻点中与其颜色不同的点数 \(\le\lceil\sqrt{n}\rceil\) 这一条件,而上面的构造方法符合“相邻点中不存在与其颜色不同的点”这一条件,但不符合“\(01\) 不等”这一条件,因此考虑采取一个“平衡的思想”将二者结合起来,这也就是题目中 \(\lceil\sqrt{n}\rceil\) 的来头。

我们设阈值 \(B=\lceil\sqrt{n}\rceil\)​,然后将全部 \(n\)​ 位每 \(B\)​ 个元素划分为一段,然后对于 \(i\in[0,2^n-1]\)​,我们在第 \(i\)​ 位上填上 \([\text{存在一块} x\text{,满足} i\text{这一块中的位上全是}1]\)​,这样一来,设 \(c\)​ 表示 \(i\)​ 全是 \(1\)​ 的块的个数,如果 \(c\ge 2\)​,那么不论翻转那一位,都存在一块中的位全是 \(1\)​,因此与 \(i\)​ 相邻的点全是 \(1\)​,与其相邻的颜色不同的点数为 \(0\)。如果 \(c=1\),显然只有翻转全是 \(1\) 的块中的任意一位后,才可以得到颜色为 \(0\) 的点,否则得到的点的颜色还是 \(1\),因此与 \(i\) 相邻的颜色不同的点数恰好为 \(B\)。如果 \(c=0\),那么在每一块中最多翻转一位才可能得到颜色为 \(1\) 的点,因此与 \(i\) 相邻的颜色不同的点数至多为 \(\lceil\dfrac{n}{B}\rceil=B\)​。

上述构造解决了与其相邻的颜色与其不同的点数 \(\le\lceil\sqrt{n}\rceil\) 的构造,如果是相同又如何构造呢?其实非常 trivial,只要将 builtin_parity 为 \(1\) 的点的颜色翻转即可。

const int MAXN=22;
int n,st[MAXN+2];
int main(){
	freopen("unequal.in","r",stdin);
	freopen("unequal.out","w",stdout);
	scanf("%d",&n);
	int blk_sz=(int)ceil(sqrt(n)),blk_cnt=(n-1)/blk_sz+1;
	for(int i=0;i<n;i++) st[i/blk_sz]|=(1<<i);
	for(int i=0;i<(1<<n);i++){
		int ret=0;
		for(int j=0;j<blk_cnt;j++) ret|=(st[j]&i)==st[j];
		ret^=__builtin_parity(i);
		printf("%d",ret);
	}
	return 0;
}

标签:lceil,12445,颜色,NFLSOJ,int,sqrt,相邻,NOIP2021,rceil
来源: https://www.cnblogs.com/ET2006/p/NFLSOJ-12445.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有