题目

题目描述
这是一道 提交答案题

有一个 n×nn\times nn×n 网格图。每个格子可以染成红色、蓝色,或者不染色。

有若干提示,形如 “从第 iii 行(或列)的上方或下方(或左方、右方)开始数,第一个染了色的格子是第 xxx 个,颜色为 ccc ”,或者是 “该行(或列)没有染色格子”。

保证提示之间互不冲突。请你找出一个方案,使得同色四连通块的个数不超过 qqq 。

数据范围与提示
n⩽1000n\leqslant 1000n⩽1000 。

思路

不要害怕提交答案,因为原理其实很简单。

将必须不染色的格子和外界称为 “墙”。那么染了色的格子总在墙的边缘。所以,对于一个由墙和已经染了色的格子围出的区域,类似于圆上的异色点连边。

那么显然,“圆” 上相邻的同色点,可以立即连边。之后 “圆” 就成了红蓝相间。可以发现,此时将某种颜色全部相连最优。换句话说,环上有 nnn 个点时,最多连 ⌈n2⌉−1\lceil{n\over 2}\rceil-1⌈2n​⌉−1 条边。

证明可以采用归纳法。随意连一条边,则两边变为独立子问题,大小分别为 a,ba,ba,b 时贡献为 ⌈a2⌉+⌈b2⌉−1\lceil{a\over 2}\rceil+\lceil{b\over 2}\rceil-1⌈2a​⌉+⌈2b​⌉−1,而 a+b=n−1a+b=n-1a+b=n−1,所以该值一定不超过 ⌈n2⌉−1\lceil{n\over 2}\rceil-1⌈2n​⌉−1 。

所以我们只需要做到:沿着墙边行走,将同色相连;找到每个空洞,涂成同一种颜色。

然而,实际情况并不是一个 “圆” 那么简单,上面的模型有些理想化。所以,有一个点过不了,需要手玩;另外的点,有可能只能逆时针走(而不能顺时针沿着墙走)。

连这个都要调试这么久,我泪目了。

代码

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cctype>
using namespace std;
# define rep(i,a,b) for(int i=(a); i<=(b); ++i)
# define drep(i,a,b) for(int i=(a); i>=(b); --i)
typedef long long llong;
inline int readint(){int a = 0, c = getchar(), f = 1;for(; !isdigit(c); c=getchar())if(c == '-') f = -f;for(; isdigit(c); c=getchar())a = (a<<3)+(a<<1)+(c^48);return a*f;
}const int MAXN = 1005;
char str[10], maze[MAXN][MAXN];
void input(int n){rep(i,1,n){scanf("%s",str);if(*str == '-') continue;if(*str == '0'){rep(j,1,n) maze[j][i] = '-';continue;}int id; sscanf(str,"%d",&id);rep(j,1,id-1) maze[j][i] = '-';maze[id][i] = str[strlen(str)-1];}rep(i,1,n){scanf("%s",str);if(*str != '-'){if(*str == '0')rep(j,1,n) maze[i][j] = '-';else{int id; sscanf(str,"%d",&id);rep(j,1,id-1) maze[i][j] = '-';maze[i][id] = str[strlen(str)-1];}}scanf("%s",str);if(*str != '-'){if(*str == '0')rep(j,1,n) maze[i][j] = '-';else{int id; sscanf(str,"%d",&id);drep(j,n,n+2-id) maze[i][j] = '-';maze[i][n+1-id] = str[strlen(str)-1];}}}rep(i,1,n){scanf("%s",str);if(*str == '-') continue;if(*str == '0'){rep(j,1,n) maze[j][i] = '-';continue;}int id; sscanf(str,"%d",&id);drep(j,n,n+2-id) maze[j][i] = '-';maze[n+1-id][i] = str[strlen(str)-1];}rep(i,1,n) rep(j,1,n)if(!maze[i][j]) maze[i][j] = ' ';
}const int dir[][2] = {1,0,0,1,-1,0,0,-1}; // URDL
struct Node{int x, y, col;Node() = default;Node(int _x,int _y,int _c):x(_x),y(_y),col(_c){}
};
Node walk_on_wall(int x,int y,int d,bool _first=true){int tx = x+dir[(d+1)&3][0], ty = y+dir[(d+1)&3][1];if(maze[tx][ty] == ' ') // turn rightreturn walk_on_wall(tx,ty,(d+1)&3,false);if(maze[tx][ty] != '-' && !_first)return Node(x,y,maze[tx][ty]);if(maze[x+dir[d][0]][y+dir[d][1]] != ' ')return walk_on_wall(x,y,(d-1)&3,false);return walk_on_wall(x+dir[d][0],y+dir[d][1],d,false);
}
char maze_bank[MAXN][MAXN];
void paint_on_wall(int x,int y,int d,int col,int ex,int ey){maze_bank[x][y] = col; // to link between cornerif(x == ex && y == ey) return ; // even the destinationint tx = x+dir[(d+1)&3][0], ty = y+dir[(d+1)&3][1];if(maze[tx][ty] == ' ') // turn rightreturn paint_on_wall(tx,ty,(d+1)&3,col,ex,ey);if(maze[x+dir[d][0]][y+dir[d][1]] != ' ') // turn leftreturn paint_on_wall(x,y,(d-1)&3,col,ex,ey);return paint_on_wall(x+dir[d][0],y+dir[d][1],d,col,ex,ey);
}int cntcol[256]; bool vis[MAXN][MAXN];
void tag_component(int x,int y){if(vis[x][y]) return ; else vis[x][y] = true;rep(d,0,3) if(maze[x+dir[d][0]][y+dir[d][1]] == maze[x][y])tag_component(x+dir[d][0],y+dir[d][1]);
}
void scan(int x,int y){if(maze[x][y] == '-' || vis[x][y]) return ;if(maze[x][y] != ' '){ // coloredtag_component(x,y);++ cntcol[int(maze[x][y])];}else vis[x][y] = true;rep(d,0,3) scan(x+dir[d][0],y+dir[d][1]);
}
void paint_all(int x,int y,int col){if(maze[x][y] != ' ') return ; else maze[x][y] = col;rep(d,0,3) paint_all(x+dir[d][0],y+dir[d][1],col);
}void paint_maze(int n,char c){rep(i,1,n){rep(j,1,n)if(maze[i][j] == ' ') putchar(c);else putchar(maze[i][j]);putchar('\n');}
}int main(){int n = readint(); readint(); input(n);rep(i,0,n+1) maze[0][i] = maze[i][0]= maze[n+1][i] = maze[i][n+1] = '-';return paint_maze(n,' '), 0;rep(i,1,n) rep(j,1,n) if(maze[i][j] == ' ') rep(d,0,3){char bro = maze[i+dir[d][0]][j+dir[d][1]];if(bro != 'M' && bro != 'B') continue;if(maze[i+dir[(d-1)&3][0]][j+dir[(d-1)&3][1]] == ' '&& maze[i+dir[d][0]+dir[(d-1)&3][0]]\[j+dir[d][1]+dir[(d-1)&3][1]] == ' ')continue; // can rotate 90 degreeNode nxt = walk_on_wall(i,j,(d-1)&3);if(bro == nxt.col){ // not for maze[i][j] !if(nxt.x == i+dir[(d-1)&3][0]&& nxt.y == j+dir[(d-1)&3][1])continue; // already adjacent cellsrep(k,0,n+1) memcpy(maze_bank[k],maze[k],n+2);paint_on_wall(i,j,(d-1)&3,bro,nxt.x,nxt.y);rep(k,0,n+1) memcpy(maze[k],maze_bank[k],n+2);}}rep(i,1,n) rep(j,1,n) if(maze[i][j] == ' '){rep(k,1,n) memset(vis[k]+1,false,n);cntcol['M'] = cntcol['B'] = 0;scan(i,j); int best = 'B';if(cntcol['M'] > cntcol['B']) best = 'M';if(!cntcol[best]) continue; // emptypaint_all(i,j,best);}paint_maze(n,'-');return 0;
}

[ACNOI2022]提交答案题相关推荐

  1. [本校测试] 魔王的消失Day2——By Hineven T3葬诗 提交答案题(爬山算法)

    葬诗 Unconventional Problem / 非传统题目 题目描述 现有一段长文本 P 和一个某些位置能摆放按键的 100*100 大小网格状键盘基座,你需要将 1 到 500 共 500 ...

  2. 浅谈OI中的提交答案

    在OI中,题目有三类: 传统题 交互题 提交答案题 今天来了解一下第三类 概述 传统题:给你一个题面,你需要交一个程序,评测姬会用你的程序运行你看不到的一些测试点,用输出和正确答案比较 提交答案题:给 ...

  3. 考试提交答案后台代码

    我们在考试后,将每个答案提交,这样会使得方法的参数数量非常多(SpringMVC):怎样才能使得提交的答案和数据库的答案比对效率更高?有大佬知道的回复一下! // 提交答案请求@RequestMapp ...

  4. 【算法学习笔记/杂项】提交答案型题目

    title : 提交答案型题目 date : 2022-4-28 tags : ACM,杂项 author : LINNO 提交答案型题目 提交答案型题目相较于传统题目来的特点是,每个测试点的分都可以 ...

  5. 手机端模拟考试 —— 选择试题后的提交答案操作

    手机端模拟考试 -- 选择试题后的提交答案操作 //提交测试答案function submit(titieID, titieType, ShowTitleType) {test(titieID, ti ...

  6. 网课答案题库系统 内含接口使用

    网课答案题库系统 内含接口使用 本平台优点: 多题库查题.独立后台.响应速度快.全网平台可查.功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 题库:题库后台(点击跳转) 题库 ...

  7. 杭州亚运会和亚残会志愿者招募-线上测试题答案题库

    杭州亚运会和亚残会志愿者招募-线上测试题答案题库

  8. Android答题 通过RecyclerView显示题目和选项并提交答案

    最近需要实现一个答题功能,参考网上很多方法都是ViewPage实现的,出于各种原因我并不是很想用ViewPage 于是决定研究怎么用RecyclerView实现 但是踩了各种坑,大概也知道为什么几乎没 ...

  9. JSP在线考试系统得到用户提交答案

    前段时间用MVC做了个在线考试系统, 前台主要是用户登陆后选择科目参加考试,所有的题目都是从LIST里用标签动态遍历出来,都是单选框(单选题),每组题name一样,每个题有个唯一的正确答案,在用户交卷 ...

最新文章

  1. 基于图文界面的蓝牙扫描工具btscanner
  2. Day 23 面向对象进阶
  3. GMIS 2017大会戴文渊演讲:构建AI商业大脑
  4. python 自定义模块怎么用_python自定义模块使用说明
  5. CodeForces - 1426E Rock, Paper, Scissors(最小费用最大流+最大费用最大流)
  6. 学会阅读硬件的原理图、数据手册大全
  7. 源码分析参考:Dupefilter
  8. 算法与数据结构 第3章 高级排序算法上 归并算法
  9. java把字符串转为日期_Java程序将字符串转换为日期
  10. python blp模型 估计_随机系数Logit模型及Stata实现
  11. egret环境问题汇总
  12. raid卷的作用_raid是什么?为什么要用raid?有好什么好处?
  13. 电脑老是出现无法登陆的界面,怎么解决
  14. 新型冠状病毒之物资的分配
  15. 人机工程学座椅设计_办公座椅设计中人体工程学分析
  16. 英语语法汇总(6.副词)
  17. tomcat启动一闪而过的解决方案
  18. 科技新品 | 荣耀Magic3系列智能手机;iQOO 8系列高端旗舰手机;卡西欧两款G-SHOCK品牌防震手表新品...
  19. 利用机器学习方法检测识别TLS加密恶意流量
  20. 部落冲突升14本辅助自动挂机解决方案

热门文章

  1. 数据库语言和unity技术
  2. D3 - 动态条形图制作
  3. Topic 相关操作(创建,查看,修改,删除)
  4. Hi3516a——HDMI接口获取数据后编码保存
  5. java aapt linux_Centos 64位安装aapt、jdk、tomcat的详细教程
  6. “不将就”!一加手机真机评测
  7. TMT行业入门级的书目
  8. Retinoic acid PEG Mal,RA-PEG-Maleimide,维甲酸PEG马来酰亚胺,聚乙二醇化视黄酸提供更好的水溶性
  9. Git安装教程(详解Git安装过程)
  10. 朱志星:先左后直or先直后左——江苏交警总队交通精细化管理实践