Gym100917 A - Abstract Picture

模拟赛的时候看这道题没有什么头绪,当时有点晕,感冒还没有好,回来以后瞟了一眼题解就明白了,自己实现了一下,也没有很复杂。大概的思路就像拓扑排序一样,需要理解因为涂的是有顺序的,所以我们总可以找打最后涂的那些,即一行或者一列只有一种颜色,把他们记录下来,然后删除这些颜色,再继续找一行一列中只有一个颜色的,最后就是答案。

还要记得用记录数组记录每一行每一列有多少种颜色,否则直接找的话会超时。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<climits>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=3e3+5;
int n;
char s[MAXN][MAXN];
bool visr[MAXN],visc[MAXN];
int R[MAXN][30]; int C[MAXN][30];struct node
{char cmd;char color;int num;node(char _cmd=0,int _num=0,int _color=0):cmd(_cmd),num(_num),color(_color){}
}q[MAXN<<1];
int tot;bool ok()
{for(int i=0;i<n;i++){if(!visr[i] || !visc[i])return false;}return true;
}void solve()
{tot=2*n;memset(visc,0,sizeof(visc));memset(visr,0,sizeof(visr));char color;bool flag;while(tot>0){for(int i=0;i<n;i++){if(visr[i]) continue;color=' ';flag=true;for(int k=0;k<26;k++){if(R[i][k]){if(' '==color)color=k+'a';else{flag=false;break;}}}if(flag){if(color==' ') color='a';visr[i]=true;q[tot--]=node('h',i+1,color);for(int j=0;j<n;j++){if(s[i][j]!='?'){C[j][s[i][j]-'a']--;}}}}for(int j=0;j<n;j++){if(visc[j]) continue;color=' ';flag=true;for(int k=0;k<26;k++){if(C[j][k]){if(' '==color)color=k+'a';else{flag=false;break;}}}if(flag){if(color==' ') color='a';visc[j]=true;q[tot--]=node('v',j+1,color);for(int i=0;i<n;i++){if('?'!=s[i][j]){R[i][s[i][j]-'a']--;}}}}}for(int i=1,j=2*n;i<=j;i++){printf("%c %d %c\n",q[i].cmd,q[i].num,q[i].color);}
}int main()
{//memset(R,0,sizeof(R));//memset(C,0,sizeof(C));scanf("%d",&n);for(int i=0;i<n;i++){scanf("%s",s[i]);for(int j=0;j<n;j++){if(s[i][j]!='?'){R[i][s[i][j]-'a']++;}}}for(int j=0;j<n;j++){for(int i=0;i<n;i++){if(s[i][j]!='?'){C[j][s[i][j]-'a']++;}}}solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux进程通信---几个发送信号的函数(kill,raise,alarm,pause)

http://blog.csdn.net/zzyoucan/article/details/9235685 信号&#xff1a;信号是unix中最古老的进程通信的一种方式&#xff0c;他是软件层次上对中断机制的模拟&#xff0c;是一种异步通信方式&#xff0c;信号可以实现用户空间进程和内核空间进程的交互&#xff0c;内核进程…

数据库以及表的基本操作

一.数据库的操作 create database[if not exists]数据库名; 创建一个名字为company2的使用utf8忽略大小写的数据库 create database company charsetutf8 collate utf8_general_ci; 创建一个数据库区分大小写 create database company1 charsetutf8 collate utf8_general_bin;…

linux 网络编程:使用两线程实现socket同时收发数据

http://blog.csdn.net/li_wen01/article/details/52665505 工作中最近有使用到socket 向客户端同时发送和接收数据&#xff0c;因为是嵌入式linux设备&#xff0c;且要求只能同时一个客户端连接该端口。考虑到节省系统资源&#xff0c;只创建了两个线程分别实现服务端的收发数据…

CF Gym102059 H. Fractions

题目要求找到给定区间的化简后分子分母的和小于1000的数字的个数 我的想法是先找到所有的满足要求的最简分数(总数不超过1e6,而且远小于),然后对询问查找每个最简分数出现的次数. #include<cstdio> #include<cstring> #include<algorithm> #include<cli…

C语言calloc()函数:分配内存空间并初始化

http://c.biancheng.net/cpp/html/134.html 头文件&#xff1a;#include <stdlib.h> calloc() 函数用来动态地分配内存空间并初始化为 0&#xff0c;其原型为&#xff1a; void* calloc (size_t num, size_t size); calloc() 在内存中动态地分配 num 个长度为 siz…

CF Gym100917 C

要找到和为给定值的所有的等比数列. 1肯定是要特判一下. 我的想法是先找到所有等比为1的,等比为1就是将这个数分为相同的一些数,总共就是这个数的所有约数个数减一(有一个约数为1,题目要求至少分成两个数). 对于其他的等比不为1 的,用等比数列的求和公式暴力一发就行了. #i…

多路转接select1

高级IO 通常情况下所有的 IO 都可以分为两步来完成, 第一步等待, 第二步数据搬迁, 为了提高 IO 效率通常所运用的方法就是减少等待的时间 举个钓鱼的例子 现在有五个人张三, 李四, 王五, 赵六, 钱七. 它们五个人来到湖边来钓鱼. 而它们五个人的钓鱼方各不相同. 张三钓鱼方法…

UVa11181

题目要求条件概率,用贝叶斯公式我们很容易得到我们需要求r个人买东西的概率和每个人买东西的条件下其他r-1个人买东西的概率.我们递归枚举,每当枚举到r个人买东西的时候,我们加入到r个人买东西的概率中(全概率公式),然后对于这r个人,除去自己买东西的概率就是其他r-1个人买东西…

Linux epoll模型

http://www.cnblogs.com/venow/archive/2012/11/30/2790031.html 定义&#xff1a; epoll是Linux内核为处理大批句柄而作改进的poll&#xff0c;是Linux下多路复用IO接口select/poll的增强版本&#xff0c;它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利…

UVa11572

书上把这种问题叫做滑动窗口问题. 我的想法是先进行离散化,然后用一个数组记录元素出现的位置,如果判断某个元素已经出现,就将左端点移到上次出现的位置的后面.每次出现重复元素的时候判断一下答案.我觉得这样的复杂度是最低的. #include<cstdio> #include<cstring&…

Linux IO模式及 select、poll、epoll详解

https://segmentfault.com/a/1190000003063859 同步IO和异步IO&#xff0c;阻塞IO和非阻塞IO分别是什么&#xff0c;到底有什么区别&#xff1f;不同的人在不同的上下文下给出的答案是不同的。所以先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。一 概念…

mysql思维导图

后期会不断进行更新

CF Gym 101630 B Box

题目的意思大概就是给一个长方体的长宽高,问他能不能用一个w*h的纸剪出来,就是说展开图的长宽能不能比给定的小. 题目给了11中展开图的拓扑结构,我觉得这个很关键,要是题目没有给这个我可能想不到那么全面,不过题目已经给了我就分析那11个图形,发现展开图的长宽大概分为三类 …

C++第一节课

C数据类型 几个概念 命名空间是C标准库引入的,其中命名空间可以解决变量冲突问题,当出现局部变量和全局变量同名的时候, 局部变量优先被访问.同时命名空间的格式如同一下代码 namespace name1 { int a 0; }namespace name2 { int a 2; } 注意C中的所有组件都是在一个叫做s…

【C/C++】关键字static

http://blog.csdn.net/woxiaohahaa/article/details/51014224 参考自&#xff1a;http://www.cnblogs.com/biyeymyhjob/archive/2012/07/19/2598815.html &#xff08;华山大师兄&#xff09; 这里我们只讨论了C语言的static 首先我们回顾一下各种变量在内存中的位置&#xff1…

HDU5391威尔逊定理

威尔逊定理 当且仅当p为素数,p | (p-1)!1 若p为合数,则pa*b;如果a!b,那么p|(p-1)!, 如果ab,如果p为4,那么p|(p-1)!2,如果p大于4,那么sqrt和sqrt(2q)肯定属于(p-1)!中,可以整除 #include<cstdio> #include<cstring> #include<algorithm> #include<climit…

C++的基本认识

简单介绍C 语言特点 支持数据封装和数据隐藏 在C中&#xff0c;类是支持数据封装的工具&#xff0c;对象则是数据封装的实现。C通过建立用户定义类支持数据封装和数据隐藏。 在面向对象的程序设计中&#xff0c;将数据和对该数据进行合法操作的函数封装在一起作为一个类的定…

OD 投篮大赛

/*** 题目描述* 你现在是一场采用特殊赛制投篮大赛的记录员。这场比赛由若干回合组成&#xff0c;过去几回合的得分可能会影响以后几回合的得分。* 比赛开始时&#xff0c;记录时空白的。你会得到一个记录操作的字符串列表aops&#xff0c;其中ops[i]是你需要记录的第i项操作&a…

IO多路复用之epoll总结

http://www.cnblogs.com/Anker/p/3263780.html 1、基本知识 epoll是在2.6内核中提出的&#xff0c;是之前的select和poll的增强版本。相对于select和poll来说&#xff0c;epoll更加灵活&#xff0c;没有描述符限制。epoll使用一个文件描述符管理多个描述符&#xff0c;将用户关…

2018南京区域赛 J-Prime Game

完全没有头绪 听完队友讲的我还是楞了好半天菜慢慢理解.我好菜啊 首先要弄懂题目的意思,转换一下题意就是求每个素因子出现区间的次数.区间长度最短为1.我们分析,第一个数的因子会影响1* n个区间(暂时不考虑重复),第二个数的因子会影响2 * (n-1)个区间,以此类推.因此我们只需要…