【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 个坏点的情况下最少需要几种颜色才能进行合法染色. 题解:考虑一个 ...
随机推荐
- roadmap - json格式的 思维导图
roadmap - json格式的 思维导图 前端路线图 http://www.bitcountrys.com/frontend.html https://gitee.com/ironman1987/ ...
- ld: symbol(s) not found for architecture x86_64问题解决
一 写在前面的话: 音频算法仿真过程中,本来是一个跑的好好地程序,突然间在mac下就报错了,出现的错误是: ld: symbol(s) not found for architecture x86_6 ...
- Educational Codeforces Round 141:B. Matrix of Differences
一.来源:Problem - B - Codeforces 二.题面 三.思路 我们先从一维思考如何构造尽可能多的数值差.以n=2为例,此时有1,2,3,4数,其中构成差值为3的方案有一个1,4,构成 ...
- 加密与安全:非对称加密算法 RSA 1024 公钥、秘钥、明文和密文长度
RSA 1024 是指公钥及私钥分别是 1024bit,也就是 1024/8 = 128Bytes. RSA 原理 RSA 算法密钥长度的选择是安全性和程序性能平衡的结果,密钥长度越长,安全性越好,加 ...
- 在winform中如何实现双向数据绑定?
什么是双向数据绑定? 双向数据绑定是一种允许我们创建持久连接的技术,使模型数据和用户界面(UI)之间的交互能够自动同步.这意味着当模型数据发生变化时,UI会自动更新,反之亦然.这种双向数据绑定极大地简 ...
- JS(简单数据类型、数据类型转换)
一. 数据类型简介 1.1 为什么需要数据类型 在计算机中,不同的数据所需占用的存储空间是不同的,为了便于把数据分成所需内存大小不同的数据,充分利用存储空间,于是定义了不同的数据类型.简单来说,数据类 ...
- Sp效率分析和理解
目录介绍 01.Sp简单介绍 1.1 Sp作用分析 1.2 案例分析思考 02.Sp初始化操作 2.1 如何获取sp 2.2 SharedPreferencesImpl构造 03.edit方法源码 0 ...
- nginx完全卸载删除
nginx卸载 其实很简单,只需要两步即可完成! 第一步:输入以下指令全局查找nginx相关的文件: sudo find / -name nginx* 第二步:删除查找出来的所有nginx相关文件 s ...
- 任何样式,javascript都可以操作,让你所向披靡
前言 习惯了在 css 文件里面编写样式,其实JavaScript 的 CSS对象模型也提供了强大的样式操作能力, 那就随文章一起看看,有多少能力是你不知道的吧. 样式来源 客从八方来, 样式呢, 样 ...
- vue中elementui组件el-dialog拖拽(已处理边界情况)
全局注册 Vue.directive("elDialogDrag", (el) => { const header = el.querySelector(".el- ...