NOI模拟 五彩斑斓
传送门
谜一样的思路:首先有一个结论,就是最多涂n+m−1n+m-1n+m−1次。
于是枚举哪一行或者哪一列没有被涂。以某一行没有涂为例:
这一行的每一个位置上的颜色即为对应列涂的颜色。根据覆盖关系判断一下涂色的先后顺序,先涂的向后涂的连一条边。然后拓扑排序看是否有环。若有环则是无解的。否则更新答案即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn=120,oo=1e9;
int n,m,c,col[maxn][maxn],paint[maxn],in[maxn],ban[maxn];
vector<int> G[maxn];int Q[maxn],top=0;
int l[maxn],cl[maxn],cnt=0;
inline int read(){int x=0;char ch=getchar();while(!isdigit(ch)) ch=getchar();while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();return x;
}
inline int topsort(){top=0;for(int i=1;i<=n+m;++i) if(!in[i]) Q[++top]=i;for(int i=1;i<=top;++i){for(int j=0,u=Q[i];j<G[u].size();++j)if(!--in[G[u][j]]) Q[++top]=G[u][j];}return top==n+m;
}
int ans=oo;
inline void update(){if(!topsort()) return;cnt=0;for(int i=1;i<=n+m;++i) if(paint[i]&&paint[i]!=-1) ++cnt;if(cnt>=ans) return;cnt=0;for(int i=1;i<=top;++i) if(paint[Q[i]]&&paint[Q[i]]!=-1)l[++cnt]=Q[i],cl[cnt]=paint[Q[i]];ans=cnt;
}
inline void out(int i){if(l[i]<=n) printf("R %d %d\n",l[i],cl[i]);else printf("C %d %d\n",l[i]-n,cl[i]);
}
inline void check(int u){for(int i=1;i<=n+m;++i) G[i].clear(),paint[i]=-1,in[i]=0;if(u<=n){//row[u] is emptyfor(int j=n+1;j<=n+m;++j) paint[j]=col[u][j];for(int i=1;i<=n;++i) if(i!=u){for(int j=n+1;j<=n+m;++j){ if(col[i][j]!=paint[j]){ if(!col[i][j]||(paint[i]!=-1&&paint[i]!=col[i][j])) return;paint[i]=col[i][j],G[j].push_back(i),in[i]++;} if(col[i][j]==paint[j]&&paint[i]!=paint[j])G[i].push_back(j),in[j]++;} }for(int i=1;i<=n+m;++i) if(ban[i]&&paint[i]!=-1&&paint[i]!=0) return;}else{//column[u] is emptyfor(int i=1;i<=n;++i) paint[i]=col[i][u];for(int j=n+1;j<=n+m;++j) if(j!=u){for(int i=1;i<=n;++i){ if(col[i][j]!=paint[i]){if(!col[i][j]||(paint[j]!=-1&&paint[j]!=col[i][j])) return;paint[j]=col[i][j],G[i].push_back(j),in[j]++;} if(col[i][j]==paint[i]&&paint[i]!=paint[j])G[j].push_back(i),in[i]++;} }for(int i=1;i<=n+m;++i) if(ban[i]&&paint[i]!=-1&&paint[i]!=0) return;}update();
}
int main(){// freopen("iridescent.in","r",stdin);
// freopen("iridescent.out","w",stdout);n=read(),m=read(),c=read();for(int i=1;i<=n;++i)for(int j=n+1;j<=n+m;++j)col[i][j]=read(),ban[i]|=!col[i][j],ban[j]|=!col[i][j];for(int i=1;i<=n+m;++i) check(i);if(ans==oo) return puts("-1"),0;printf("%d\n",ans);for(int i=1;i<=ans;++i) out(i);
}
NOI模拟 五彩斑斓相关推荐
- JZOJ 7066. 【2021.4.24 NOI模拟】ehzeux与圆周(DP)
JZOJ 7066. [2021.4.24 NOI模拟]ehzeux与圆周 题目大意 圆周上有2∗n2*n2∗n个点,两两相连构成nnn个点对,其中有mmm个点对已经连好,求所有方案下的连通块数量和. ...
- NOI模拟(5.11) BJOID2T3 治疗之雨 (bzoj5292)
治疗之雨 题目背景: 5.11 模拟 BJOI2018D2T3 分析:期望DP + 高斯消元优化 我对这道题真的是有一千句喵喵喵,因为一句特判没写,100变10分,内心崩溃.直接说正解吧,定义dp[i ...
- NOI模拟(5.19) JSOID2T3 军训列队 (bzoj5319)
军训列队 题目背景: 5.19 模拟 JSOI2018D2T3 分析:二分 + 主席树 没有想到啊,最水的题竟然在T3,考虑显然如果按照原本的相对顺序填入集合区间,所得的代价一定是最优越的,那么也就是 ...
- NOI模拟(5.23) TJOID2T3 教科书般的亵渎 (bzoj5339)
教科书般的亵渎 题目背景: 5.23 模拟 TJOI2018D2T3 分析:拉格朗日差值 这个题的题意怕不是有毒,注意他每一次的k是相同的,为总共要用多少次卡片,然后卡片是每次先将所有的数减一,如果这 ...
- NOI模拟题4 Problem C: 填格子(board)
Solution 首先我们要有敏锐的直觉: 我们将每一列中不选哪种颜色看作是一个序列, 则我们发现这个序列要求相邻两位的颜色不同. 我们还发现, 一个这样的序列对应两种不同的合法的棋盘, 因此统计合法 ...
- 【NOI模拟赛】黑色大桥(DP优化,李超树)
题面 时间限制:1s,空间限制:1024MB 题目描述 手拿咒刃砍金门,众神直呼不是人 椅子玩自定义咒刃,一路打到了第三关的银行,祂想在黑色大桥无伤看守者之前找点刺激的. 加了模组的银行极大.具体地说 ...
- NOI 模拟试题(一)
智子入侵 [题目背景] 三体发现了人类. 在疲于应付三个无法预测规律的太阳的时候,地球是他们唯一的希望. 为了限制住人类的基础物理研究,避免 300 年的技术爆炸,智子到达了地球. 目标:所有的粒子对 ...
- NOI模拟 : Vain (并查集维护割点)
题意: 对于 1 ≤ i ≤ n, 求出点 i 度数强制为 1 的情况下最小生成树的最大边的权值. 题解: 相当于求出删掉每个点之后的MSTMSTMST的最大值. 我们按边的权值从小到大加入新图, 很 ...
- 【NOI模拟赛】纸老虎博弈(博弈论SG函数,长链剖分)
题面 某天,C 和 K 觉得很无聊,于是决定玩一个经典小游戏: 在一棵有 nnn 个结点的有根树上,标号为 iii 的节点上有 aia_iai 个棋子.游戏时玩家轮流操作,每次可以将任意一个节点 u ...
最新文章
- 成为软件高手的几个忌讳
- 性能超越GPU、FPGA,华人学者提出软件算法架构加速AI实时化
- Jackson ObjectMapper
- JSP(五):属性范围
- 20159320《网络攻防实践》第5周教材总结
- Http协议(7)—Http缓存
- Alamofire源码导读二:发起请求及内部加锁的逻辑
- linux jdk bin下载,Linux下安装jdk-6u45-linux-x64.bin
- eclipse中文汉化操作 2020-12
- 马斯克搞的超级高铁,为什么注定会失败?
- 交换友情链接时要谨防以下12种情况
- 邮箱的正确格式是什么,如何发送一封规范的邮件
- JavaScript实现节点的增加修改删除查找
- 基于Vue.js的2048小游戏的设计与实现
- 多线程写法 与老虎机的制作
- 谨以此篇献给正在迷茫的人生 浅谈网络时代各种骗局
- Bluetooth sco协议录音
- 【ShaderToy】开篇
- 程序员如何克服浮躁的心态?然后静下心来韬养自己的技术?
- jmeter http并发测试设置教程(设置线程组,设置http,csv参数化,查看结果集)