对于这一个平面用$a_{x,y}$来表示,即$(x,y)$为黑色则$a_{x,y}=1$,否则$a_{x,y}=0$,之后定义$a$能生成$b$当且仅当$a$能够通过若干次操作后得到$b$

令$p_{y}=\bigoplus_{x}a_{x,y}$、$q_{x,i}=\bigoplus_{y\equiv i(mod\ 3)}a_{x,i}$(其中$0\le i<3$),考虑两个序列能相互生成当且仅当$pa_{i}=pb_{i}$且$\forall x,(qa_{x,0}\oplus qb_{x,0})=...=(qa_{x,2}\oplus qb_{x,2})$,证明如下:

首先考虑一次操作$(x,y)$会带来的影响:对于$p_{i}$没有影响,对于$q_{i}$是将$q_{x}$和$q_{x+1}$所有位置异或1,那么所能产生的仅有原序列和异或1后的序列,即证明了后面条件的必要性

接下来证明对于两个满足上述条件的$a$和$b$,证明$a$能生成$b$(操作可逆,因此生成也具有可逆性)

找到$a_{x,y}=1$,满足$x\ge 2$且$y\ge 3$,若仍有多个取$x$最大的,若仍有多个取$y$最大的(若不存在则停止),之后执行$(x-2,y-1)$这个操作

对$a$和$b$都重复此过程,若最终得到的$a=b$,则根据操作可逆性,初始的$a$能生成$b$,因此以下来证明$a=b$,先将整个平面分为四个部分,分别证明相等:

1.$x\ge 2$且$y\ge 3$,此时$a_{x,y}=b_{x,y}=0$(否则还可以继续操作)

2.$x=1$且$y\ge 3$,此时$a_{x,y}=b_{x,y}=p_{y}$(两者$p_{y}$相同)

3.$x\ge 2$且$y\le 2$,此时$qa_{x,0}=qb_{x,0}=0$,因此$a_{x,1}=qa_{x,1}=qb_{x,1}=b_{x,1}$,同理$a_{x,2}=b_{x,2}$

4.$x=1$且$y\le 2$,根据3可以得到$a_{x,1}=b_{x,1}$,可推出$\bigoplus_{x>1}a_{x,1}=b_{x,1}$,又因为$pa_{1}=pb_{1}$,因此$a_{1,1}=b_{1,1}$,类似的$a_{1,2}=b_{1,2}$

由此,即证明了该结论,现在我们要找到满足此条件下最小的1个数最小的$a$

考虑先暴力$o(2^{\infty})$去枚举每一个$q_{x}$是否要全部异或1(即让$q$需要完全相等),接下来构造最少的$a$

首先,若$0\le i<3$满足$\bigoplus_{y\equiv i(mod\ 3)}p_{y}\ne\bigoplus_{x}q_{x,i}$,意味着产生了矛盾,无解

(其实这里产生这个条件的原因是每一次翻转了两列,因此翻转的列数必然是偶数列,但如果翻转奇数列会引发$p_{i}$变化,不存在合法的$a$,而证明就是对于给定已经合法的$a$和$b$去考虑,因此没有问题)

其次,考虑至少需要$\sum_{i=0}^{2}\max(\sum_{y\equiv i(mod\ 3)}p_{y},\sum_{x}q_{x,i})$个,接下来构造恰好达到下限的解:

对于$p_{y}=1$且$q_{x,i}=1$(其中$y\equiv i(mod\ 3)$),仅在$(x,y)$放置一个就可以满足两个,对于其他的在$(x,\infty)$或$(\infty,y)$放即达到了该下限,且由于异或相等,即必然剩余偶数个,最终$p_{\infty}$和$q_{\infty,0/1/2}$都为0

预处理初始前面以及后面的三个值,分别记作$(X,Y,Z)$和$(x,y,z)$,翻转即将$(x,y,z)$其中一个减1并将另外两个加1,之后满足$x\equiv X,y\equiv Y,z\equiv Z(mod\ 2)$且最小化$\max(x,X)+\max(y,Y)+\max(z,Z)$

贪心去操作$x-X$、$y-Y$和$z-Z$中最大的数(如果会使答案增加就不操作),最终若$x\not\equiv X(mod\ 2)$则再操作一次即可

 1 #include<bits/stdc++.h>
2 using namespace std;
3 map<int,int>p1,p2;
4 map<int,int>::iterator it;
5 int n,x,y,s,ans,a[3];
6 int calc(){
7 return max(a[0],0)+max(a[1],0)+max(a[2],0);
8 }
9 int main(){
10 scanf("%d",&n);
11 for(int i=1;i<=n;i++){
12 scanf("%d%d",&x,&y);
13 p1[x]^=(1<<(y%3));
14 p2[y]^=1;
15 }
16 for(it=p1.begin();it!=p1.end();it++){
17 x=(*it).second;
18 if ((x==1)||(x==6))a[0]++;
19 if ((x==2)||(x==5))a[1]++;
20 if ((x==4)||(x==3))a[2]++;
21 }
22 for(it=p2.begin();it!=p2.end();it++)
23 if ((*it).second){
24 ans++;
25 a[(*it).first%3]--;
26 }
27 s=calc();
28 while (1){
29 sort(a,a+3);
30 a[0]++,a[1]++,a[2]--;
31 if (calc()>=s){
32 a[0]--,a[1]--,a[2]++;
33 break;
34 }
35 s=calc();
36 }
37 if (a[0]&1){
38 sort(a,a+3);
39 a[0]++,a[1]++,a[2]--;
40 }
41 printf("%d",ans+calc());
42 }

[atAGC051C]Flipper的更多相关文章

  1. Flipper

    Flipper Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  2. Flipper & React Native

    Flipper & React Native Flipper Flipper是一款用于调试移动应用程序的出色开发人员工具,在Android和iOS社区中颇受欢迎. Flipper is a g ...

  3. HDU 3328 Flipper 栈 模拟

    首先想说,英语太烂这题读了很长时间才读懂......题意是说输入有几张牌,然后输入这些牌的初始状态(是面朝上还是面朝下),然后输入操作方式,R表示翻一下右边的牌堆,L表示翻一下左边的牌堆,直到最后摞成 ...

  4. HDU 3328 Flipper

    题解:直接建n个栈,模拟过程即可…… #include <cstdio> #include <cstring> #include <stack> using nam ...

  5. HDU 3328 Flipper (stack)

    最近着手打基础,做做STL的题目,虽然一般STL题目难度不大,但需要加快速度的准确率............................. 本题有N张牌,一开始每个位置一张(正面朝上或者朝下),有 ...

  6. CSS3图片翻转切换案例及其中重要属性解析

    图片翻转切换,在不使用CSS3的情况下,一般都是使用JS实现动画,同时操作元素的width和left,或者height和top以模拟翻转的效果,并在适当时候改变src或者z-index实现图片切换. ...

  7. Android开发自学笔记(Android Studio)—4.4 AdapterView及其子类

    一.引言       AdapterView本身是一个抽象类,而它派生的子类在用法上也基本相似,只是在显示上有一定区别,因此把他们也归为一类.       AdapterView具有如下特征: Ada ...

  8. css旋转

    翻转180度 /* entire container, keeps perspective */ .flip-container { perspective: 1000; } /* flip the ...

  9. css动画属性性能

    性能主要表现:流量.功耗与流畅度 在现有的前端动画体系中,通常有两种模式:JS动画与CSS3动画. JS动画是通过JS动态改写样式实现动画能力的一种方案,在PC端兼容低端浏览器中不失为一种推荐方案. ...

随机推荐

  1. 洛谷5038 [SCOI2012]奇怪的游戏(二分+网络流+判断奇偶)

    寒假的时候就听过这个题.但是一直没有写. qwq 首先,我们发现题目中的图是个网格图,然后每次可以将相邻两个格子加一. 很容易就想到是黑白染色.那么每次操作,就相当于同时操作一个白点,一个黑点. 我们 ...

  2. SpringBoot入门04-组件扫描ComponetScan

    被扫描的包下面的类如果被下面注解,则被创建加入到IOC中去 @Component:没有明确的角色 @Service:业务层角色 @Repository:持久层角色 @Controller:控制层角色 ...

  3. 【Java虚拟机8】自定义类加载器、类加载器命名空间、类的卸载

    前言 学习类加载器就一定要自己实现一个类加载器,今天就从一个简单的自定义类加载器说起. 自定义类加载器 例1 一个简单的类加载器,从一个给定的二进制名字读取一个字节码文件的内容,然后生成对应的clas ...

  4. 【数据结构与算法Python版学习笔记】树——二叉查找树 Binary Search Tree

    二叉搜索树,它是映射的另一种实现 映射抽象数据类型前面两种实现,它们分别是列表二分搜索和散列表. 操作 Map()新建一个空的映射. put(key, val)往映射中加入一个新的键-值对.如果键已经 ...

  5. cunda 常用命令,删除,创建,换源

    https://github.com/tensorflow/tensorflow/ conda create --name [虚拟环境名] python=3.7 创建一个环境 conda activa ...

  6. find&正则表达式

    标准的正则表示式格式 常用元字符 代码 说明 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线 \s 匹配任意的空白符 \d 匹配数字 \b 匹配单词的开始或结束 ^ 匹配字符串的开始 $ ...

  7. 单片机STM32的启动文件详解--学习笔记

    启动文件简介 启动文件由汇编编写,是系统上电复位后第一个执行的程序.主要做了以下工作: 1.初始化堆栈指针SP=_initial_sp 2.初始化PC 指针=Reset_Handler 3.初始化中断 ...

  8. Oracle 11g 常用sql记录

    --表备份 create table xxx_bak as select * from xxx; --表数据清除 truncate table xxx --锁表问题处理sql开始 select ses ...

  9. wifi 热点配置最优信道

    wifi热点服务hostapd启动需要配置hostad.conf文件,其中有一个参数channel是用来配置信道的,信道的可选参数如下: # channel 1-14 is 2.4 GHz ; cha ...

  10. palindrome-partitioning leetcode C++

    Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...