【GDKOI 2024 TG Day2】染色(set) 题解
发现我们给一个点染上色后有:

我们称这是一个大小为 1 的十字。
进一步地,我们给这 5 个点再次染上色后有:

我们称这是一个大小为 2 的十字。
同理可得,我们给这 5 个点染上相同的大小为 2 的十字,可得一个大小为 4 的十字:

假设我们图的边长为 \(N=2^n\),我们只需要染上一个大小为 \(w=\frac{N}{2}\) 的十字,左边的那一个点就会和右边的点抵消,上面的点就会和下面的点抵消。最终效果就是只染了一个点。

假如我们要染一个大小为 \(w=\frac{N}{2}\) 的十字,可以通过在这个十字的 5 个红色的点位染上 5 个大小为 \(\frac{w}{2}=\frac{N}{4}\) 的十字来实现:

同理,我们可以使用分治来实现这一过程,最后就只会需要染若干个大小为 1 的十字,这就是题目“绘画操作”的定义。
我们只需要对于每个需要染色的位置跑一遍分治即可。时间复杂度由 \(T(n)=5T(\frac{n}{2})+O(1)\) 得 \(O(N^2n^{\log_25})\),期望得分 35。
#include <cstdio>
#include <cstdlib>
#include <set>
#define ll long long
#define N 3000
using namespace std;
ll n, siz;
ll a[N][N], v[N][N];
ll tot;
inline ll calc(ll x) {
return (x%siz+siz)%siz;
}
void fun(ll x, ll y, ll w) {
if(w == 1) {
v[x][y] ^= 1;
return;
}
fun(x, y, w/2);
fun(calc(x+w/2), y, w/2);
fun(calc(x-w/2), y, w/2);
fun(x, calc(y+w/2), w/2);
fun(x, calc(y-w/2), w/2);
}
int main() {
freopen("set.in", "r", stdin);
freopen("set.out", "w", stdout);
scanf("%lld", &n);
siz = 1<<n;
for(ll i = 0; i < siz; i++) {
for(ll j = 0; j < siz; j++) {
scanf("%lld", &a[i][j]);
}
}
for(ll i = 0; i < siz; i++) {
for(ll j = 0; j < siz; j++) {
if(a[i][j]) {
fun(i, j, siz / 2);
}
}
}
for(ll i = 0; i < siz; i++) {
for(ll j = 0; j < siz; j++) {
if(v[i][j]) {
tot++;
}
}
}
printf("%lld\n", tot);
for(ll i = 0; i < siz; i++) {
for(ll j = 0; j < siz; j++) {
if(v[i][j]) {
printf("%lld %lld\n", i, j);
}
}
}
}
考虑为什么会这么慢,因为一个点可能被染了多次,这可以被抵消,我们可以枚举 \(w\),然后再同理得解。时间复杂度 \(O(N^2n)\),期望 100。
不要开 long long。
#include <cstdio>
#include <cstdlib>
#include <set>
#define N 3000
using namespace std;
int n, siz;
bool a[N][N], v[N][N];
int tot;
inline int calc(int x) {
return (x % siz + siz) % siz;
}
inline int read() {
int x = 0;
char c = '.';
while(c < '0' || c > '9') c = getchar();
while(c >= '0' && c <= '9') {
x = (x << 1) + (x << 3) + (c ^ '0');
c = getchar();
}
return x;
}
void print(int x) {
if(x > 9) print(x / 10);
putchar(x % 10 + '0');
}
int main() {
freopen("set.in", "r", stdin);
freopen("set.out", "w", stdout);
n = read();
siz = 1<<n;
for(int i = 0; i < siz; i++) {
for(int j = 0; j < siz; j++) {
a[i][j] = read();
}
}
for(int w = siz/2; w >= 2; w /= 2) {
for(int i = 0; i < siz; i++) {
for(int j = 0; j < siz; j++) {
v[i][j] = 0;
}
}
for(int i = 0; i < siz; i++) {
for(int j = 0; j < siz; j++) {
if(a[i][j]) {
v[i][j] ^= 1;
v[calc(i+w/2)][j] ^= 1;
v[calc(i-w/2)][j] ^= 1;
v[i][calc(j+w/2)] ^= 1;
v[i][calc(j-w/2)] ^= 1;
}
}
}
for(int i = 0; i < siz; i++) {
for(int j = 0; j < siz; j++) {
a[i][j] = v[i][j];
}
}
}
for(int i = 0; i < siz; i++) {
for(int j = 0; j < siz; j++) {
if(v[i][j]) {
tot++;
}
}
}
print(tot);
putchar('\n');
for(int i = 0; i < siz; i++) {
for(int j = 0; j < siz; j++) {
if(v[i][j]) {
print(i);
putchar(' ');
print(j);
putchar('\n');
}
}
}
}
【GDKOI 2024 TG Day2】染色(set) 题解的更多相关文章
- noip2014提高组day2二题题解-rLq
(又是昨天的作业……本题写于昨天) (这破题都做这么久,我是不是吃枣药丸……) (好吧这是一道图论题呢) 本题地址:http://www.luogu.org/problem/show?pid=2296 ...
- 【转】TYVJ 1695 计算系数(NOIP2011 TG DAY2 1)
计算系数 题目描述 给定一个多项式(ax + by)k,请求出多项式展开后xn ym项的系数. [数据范围] 对于 30%的数据,有0≤k≤10: 对于 50%的数据,有a = 1,b = 1: 对于 ...
- 【NOIP2013】Day2不完全题解+代码
T1 直接递归区间,从1-n开始,找到这个区间中的最小值然后将区间里的所有值都减去这个最小值 以被减去最小值之后的零点为分段分别递归处理即可. #include <algorithm> # ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #49 - Streaming #4 (NOIP模拟赛Day2)
A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...
- BJOI2018爆零记
没啥可说的 Day1 0分 T1 给你一个二进制串,每次修改一个位置,询问[l,r]区间中有多少二进制子串重排后能被3整除 T2 一个无向图(无重边自环)每个点有一个包含两种颜色的染色集合,一个边的两 ...
- Vijos P1740聪明的质检员
题目 描述 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从1到n逐一编号,每个矿石都有自己的重量wi以及价值vi.检验矿产的流程是:1.给定m个区间[Li,Ri]:2. ...
- AtCoder Grand Contest 015
传送门 A - A+...+B Problem 题意:n个数最大值a,最小值b,求和的可能数量. #include<cstdio> #include<algorithm> us ...
- dp水一天
水一些dp的联系题 标签: dp ###hdu_2045 题意 一穿珠子,用三种颜色染色,要求相邻的珠子和两端的珠子不能是同一种颜色,求当有n个珠子的时候有几种染色方案 题解 表示dp[i][j][k ...
- 【CF1141G】Privatization of Roads in Treeland
题目大意:给定一个 N 个点的无根树,现给这个树进行染色.定义一个节点是坏点,若满足与该节点相连的至少两条边是相同的颜色,求至多有 k 个坏点的情况下最少需要几种颜色才能进行合法染色. 题解:考虑一个 ...
随机推荐
- B站上传视频时各分辨率最佳的码率及格式参数
相关链接:表格源文件
- Windows 环境使用 Xshell 连接 VMware 虚拟机上的 CentOS 系统
1.VMware 点击虚拟机的设置,打开弹窗,网络使用 NAT 模式 2.VMware 菜单栏:点击 编辑>>>虚拟网络编辑器 (1)选择 VMnet8 (2)选择 NAT 模式 ( ...
- .net core WPF关于进程打开网页链接报错"文件找不到"
System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo.FileName = " ...
- .NET分布式Orleans - 4 - 计时器和提醒
Timer是什么 Timer 是一种用于创建定期粒度行为的机制. 与标准的 .NET System.Threading.Timer 类相似,Orleans 的 Timer 允许在一段时间后执行特定的操 ...
- wordpress自建博客站,为文章添加显示浏览次数功能
wordpress自建博客站,为文章添加显示浏览次数功能 笔者使用的主题是 GeneratePress 版本:3.1.3 1.后台文章管理列表添加浏览次数列 效果如图: 实现: 编辑funct ...
- echarts 中国地图tooltip实现提示框
point: 鼠标位置,如 [20, 40]. params: 同 formatter 的参数相同. dom: tooltip 的 dom 对象. rect: 只有鼠标在图形上时有效,是一个用x, y ...
- mybatis学习笔记(可复用的相关配置信息)
结果集映射: resultMap解决数据库字段名和属性名不一致的问题 id name pwd id name password column 是数据库的字段名 property 是实体类的属性名 &l ...
- OpenHarmony技术日全面解读3.1 Release版本,系统基础能力再升级
4 月 25 日,OpenAtom OpenHarmony(以下简称"OpenHarmony")技术日在深圳举办,对 OpenHarmony 3.1 Release 版本核心技术进 ...
- TAMUctf 2024 RSA-证书修复-总结
上周末跟朋友们参加了TAMUctf 2024国际赛,最终排在了第14名,还是很不错的成绩. 本次比赛Monk师傅也是出了三个RSA证书修复问题的题目,质量很不错.这里给大家整理一下供学习. Trunc ...
- js小demo-迫使页面总是单独显示,不能被嵌入到iframe中
有时候我们的网页会被别人内嵌别人的网页 iframe 中,我们只需要在页面中增加以下js就可以让我们的页面内容单独显示出来,不被嵌入到 iframe中 核心JS代码 <script> if ...