CF1344F Piet's Palette 题解
我们发现,如果两项颜色相同,则把两项都删去,这很符合异或的性质。再结合后面一条两项颜色不同,将这两项替换为与这两种颜色不同的颜色,我们发现需要找到三个数 \(a,b,c\) 来代表三种颜色,并且满足 \(a\oplus b=c,a\oplus c=b,b\oplus c=a\)。当 \(a=1,b=2,c=3\) 时,刚好满足条件。自然,\(0\) 就代表了白色与空位。
接下来,我们考虑如何维护另外三种操作。每一个位置的颜色需要两个二进制位来存储,我们把每一个位置的两个二进制位拆成 \(a_i\) 和 \(b_i\),其中 \(a_i\) 表示低位,\(b_i\) 表示高位。我们令 \(1\) 对应红色,\(2\) 对应黄色,\(3\) 对应蓝色。
对于 RY 操作,我们只需要把子序列内 \(a_i\) 和 \(b_i\) 交换,就把所有 R 变为 Y,所有 Y 变为 R,B 和空位置不变。
| 修改前颜色 | 修改前编号 | 修改后编号 | 修改后颜色 |
|---|---|---|---|
R |
\(01\) | \(10\) | Y |
Y |
\(10\) | \(01\) | R |
B |
\(11\) | \(11\) | B |
. |
\(00\) | \(00\) | . |
对于 RB 操作,我们只需要把子序列内 \(b_i\) 改为 \(a_i\oplus b_i\),就把所有 R 变为 B,所有 B 变为 R,Y 和空位置不变。
| 修改前颜色 | 修改前编号 | 修改后编号 | 修改后颜色 |
|---|---|---|---|
R |
\(01\) | \(11\) | B |
Y |
\(10\) | \(10\) | Y |
B |
\(11\) | \(01\) | R |
. |
\(00\) | \(00\) | . |
对于 YB 操作,我们只需要把子序列内 \(a_i\) 改为 \(a_i\oplus b_i\),就把所有 Y 变为 B,所有 B 变为 Y,R 和空位置不变。
| 修改前颜色 | 修改前编号 | 修改后编号 | 修改后颜色 |
|---|---|---|---|
R |
\(01\) | \(01\) | R |
Y |
\(10\) | \(11\) | B |
B |
\(11\) | \(10\) | Y |
. |
\(00\) | \(00\) | . |
我们需要对于每个位置维护两个变量,\(sa_i\) 和 \(sb_i\),分别表示低位是 \(a_i,b_i,a_i\oplus b_i\) 中的哪一个和高位是 \(a_i,b_i,a_i\oplus b_i\) 中的哪一个。我们利用位运算,来记录构成这一位的答案中是否存在 \(a_i\) 或 \(b_i\) 。
对于每一个 mix 操作,把子序列中的低位和高位依次异或,结果要等于给出的混合结果对应的编号的低位和高位,我们就能得到两个等式。于是,我们就得到了一个异或方程组。直接使用高斯消元算法求解即可。
#include <bits/stdc++.h>
using namespace std;
long long n,k,now[4100],y[4100],sa[4100],sb[4100],cnt=0;
bool a[4100][4100],b[4100],ans[4100];
string op;
void ry()
{
long long m=0,now=0;
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>now;
swap(sa[now],sb[now]);
}
}
void rb()
{
long long m=0,now=0;
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>now;
sb[now]=sa[now]^sb[now];
}
}
void yb()
{
long long m=0,now=0;
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>now;
sa[now]=sa[now]^sb[now];
}
}
void mix()
{
long long m=0,id=0;
char col=0;
cin>>m;
for(int i=1;i<=m;i++)cin>>now[i];
cin>>col;
if(col=='W')id=0;
if(col=='R')id=1;
if(col=='Y')id=2;
if(col=='B')id=3;
cnt++,b[cnt]=id&1;
for(int i=1;i<=m;i++)
{
if(sa[now[i]]&1)a[cnt][now[i]]=1;
if(sa[now[i]]&2)a[cnt][now[i]+n]=1;
}
cnt++,b[cnt]=(id>>1)&1;
for(int i=1;i<=m;i++)
{
if(sb[now[i]]&1)a[cnt][now[i]]=1;
if(sb[now[i]]&2)a[cnt][now[i]+n]=1;
}
}
bool gauss()
{
long long now=1,res=0;
for(int i=1;i<=n*2;i++)
{
long long mx=now;
for(int j=now;j<=cnt;j++)
if(a[j][i]!=0)
{
mx=j,res=max(res,mx);
break;
}
if(a[mx][i]==0)continue;
if(now!=mx)
{
for(int j=1;j<=n*2;j++)swap(a[now][j],a[mx][j]);
swap(b[now],b[mx]);
}
for(int j=now+1;j<=cnt;j++)
if(a[j][i]==1)
{
b[j]^=b[now];
for(int k=i;k<=n*2;k++)a[j][k]^=a[now][k];
}
y[now]=i;
now++;
}
for(int i=now;i<=cnt;i++)
if(b[i])return 0;
return 1;
}
void print(long long p)
{
if(ans[p]==0&&ans[p+n]==0)printf(".");
if(ans[p]==1&&ans[p+n]==0)printf("R");
if(ans[p]==0&&ans[p+n]==1)printf("Y");
if(ans[p]==1&&ans[p+n]==1)printf("B");
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)sa[i]=1,sb[i]=2;
for(int i=1;i<=k;i++)
{
cin>>op;
if(op=="RY")ry();
else if(op=="RB")rb();
else if(op=="YB")yb();
else if(op=="mix")mix();
}
if(!gauss())printf("NO\n");
else
{
printf("YES\n");
ans[y[n*2]]=b[n*2];
for(int i=n*2-1;i>=1;i--)
{
ans[y[i]]=b[i];
for(int j=n*2;j>y[i];j--)
if(a[i][j])ans[y[i]]^=ans[j];
}
for(int i=1;i<=n;i++)print(i);
printf("\n");
}
return 0;
}
CF1344F Piet's Palette 题解的更多相关文章
- 2018-2019 ACM-ICPC 徐州区域赛 部分题解
题目链接:2018-2019 ACM-ICPC, Asia Xuzhou Regional Contest A. Rikka with Minimum Spanning Trees 题意: 给出一个随 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- Android开发-之认识palette
Android开发中,Google工程师已经给我们封装好了很多的按钮,使得我们在开发中非常的方便和便捷. 那么今天就来认识一下常用的按钮,那么在之前的课程中我已经详细讲过了Button按钮,那么这里就 ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
随机推荐
- 测试工作中用到的MongoDB命令
1.远程连接MongoDB mongo host:port/dbname (host和port根据自己需要修改) 连接成功页面如下: 2.显示所有数据库 show dbs 3.切换到oversea-a ...
- Spring的三级缓存详解
目录 1.什么是三级缓存 2.三级缓存详解 Bean实例化前 属性赋值/注入前 初始化后 总结 3.怎么解决的循环依赖 4.不用三级缓存不行吗 5.总结 一.什么是三级缓存 就是在Bean生成流程中保 ...
- element-ui $prompt输入弹框和$confirm确认弹框用法--输入框默认值、校验、阻止关闭等问题
可输入弹框 $prompt 1.默认值.校验 this.$prompt( '请输入文件夹名称:', '提示', { confirmButtonText: '确定', cancelButtonText: ...
- Git常用命令大全:git命令基本用法
1. 常用的git命令 Git 常用的六个命令是什么? ·"git clone"克隆代码: ·"git log"查看日志: ·"git tag&quo ...
- asp.net里cookie、session进一步理解
参照: session+cookie简单讲解以及持久化登录实现_session实现用户登录_AkagiSenpai的博客-CSDN博客 sessionID和cookie - 哈哈呵h - 博客园 (c ...
- windows下安装maven环境(windows10)
1.下载maven https://archive.apache.org/dist/maven/maven-3/ 2.安装配置 1.解压后新建本地仓库 2.编辑apache-maven-3.0.5-b ...
- Java编程--单例(Singleton)设计模式
单例设计模式 一个类只有一个实例,根据创建的时机又分为懒汉式和饿汉式,它们的区别主要体现在实例的创建时机和线程安全性上. 饿汉式(Eager Initialization): 特点: 在类加载时就创建 ...
- 【记录】PR使用技巧记录
@ 目录 [PR最重要的两个操作] 一.关键帧 1. 如何设置关键帧? 2. 应用实例 1)1s内视频从明变暗 2)1s内视频画面由大到小 二.入点.出点 [其他] PR批量调整视频效果 PR剪视频片 ...
- 遇到的问题之“一个压缩流,多个文件流,在循环文件流时进行文件读时后执行下一个文件流会报错:java.io.IOException: Stream closed”
一.问题 遇到的问题之"一个压缩流,多个文件流,在循环文件流时进行文件读时后执行下一个文件流会报错:java.io.IOException: Stream closed" 二.原因 ...
- .NET外挂系列:4. harmony 中补丁参数的有趣玩法(上)
一:背景 1. 讲故事 前面几篇我们说完了 harmony 的几个注入点,这篇我们聚焦注入点可接收的几类参数的解读,非常有意思,在.NET高级调试 视角下也是非常重要的,到底是哪些参数,用一张表格整理 ...