题解【AcWing95】费解的开关】的更多相关文章

题解 这道题目有三个状态条件值得考虑: 每一个开关被按0次或者1次才有意义,如果超过1次,那么等同于按0或1次. 最终的结果与按的顺序无关 因为2,所以可以人为地规定比较合理的顺序. 现在以每一行为顺序.先经过一波操作把上一行全部搞成1,然后看这行,如果有0,那么只能按下一行的,以此类推. 起始状态难以把握,但是我们可以使用暴力枚举. 暴力地把第一行分割为2^5种情况. 代码 #include <bits/stdc++.h> using namespace std; int origin[7]…
这道题的确比较难想,首先我们知道图比较小,有可能是枚举,那么该如何枚举呢??? 你可以发现,我们只要把第一排定了,并且保证第一排不准动,那么答案就定了 也就是说,我们首先用二进制枚举,枚举第一行需要翻转的,然后让第一行不准再翻转,后面的翻转只能在第二行进行,那么第二翻转的实际上是定好了的,然后因为定好了,所以不能翻转,那么第二行也定了,我们要改变第二行,只能通过第三行,最后判断一下最后一位是不是0就好了,做法的话,可以把每一行用一个数字保存,然后进行异或操作,对某位的1或者0进行操作,或者笨一点…
P1266 费解的开关 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述     你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态. 游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态.    我们用数字“1”表示一盏开着的灯,用数字“0”表示关着的灯.下面这种状态 1011101101101111000011011 在改变了最左上角的灯的…
目录 前言 题目链接 思路 代码 前言 博客咕咕咕了好久了,是时候写一下了 题目链接 AcWing 95 费解的开关 思路 首先可以看出 1.每一个位置顶多只会操作一次.因为如果操作两次的话,相当于不操作,必然是不满足最优解 2.在一套方案中,操作的顺序无关紧要. 3.如果我们确定了第I行的操作方案的话,那么后面的行数都可以依此递推,下面给出一个详细的解答. 11011 10110 01111 11111 比如说这个例子,如果我们确定了第1行,那么第二行所有的0(坐标:a[i][j]) 都只能是…
ACAG 0x02-4 费解的开关 对于这道题,我们不难发现如下性质: 每个位置之多被点击一次: 点击的先后顺序不影响结果: 若确定了第$1$行,则接下来可能的点击方案就只有$1$种.具体原因是:当第$i$行某一位为$0$时,此时前$i$行均已确定,所以只能点击第$i+1$行该位置上的数,才能使第$i$行的这一位变成$1$. 于是,我们只需要考虑第一行的点击方法.不难枚举得,共$32$种.我们可以用$0$~$31$的二进制表示点击方法. 然后,对于每种方法,我们可以递推出接下来$2$~$5$行的…
题面 一道非常好的递推练习题. 我们考虑每次枚举第一行的操作,由上一行的状态递推出下一行的状态,最后判断最后一行是否全部为 \(1\) 即可. 实现代码时要注意一些细节问题. #include <bits/stdc++.h> #define DEBUG fprintf(stderr, "Passing [%s] line %d\n", __FUNCTION__, __LINE__) #define itn int #define gI gi using namespace…
我对状态空间的理解:https://www.cnblogs.com/AKMer/p/9622590.html 题目传送门:http://www.joyoi.cn/problem/tyvj-1266 这道题的状态空间就是经过若干次开关灯之后每盏灯的状态. 然后我们可以一行一行的来开关灯.首先我们得了解两个性质: 1.每一盏灯要么不动它的开关,要么只动一次.(显然) 2.第\(i\)行我们需要按下开关的灯的位置,在第\(i-1\)行必然是关着的.(因为前\(i-1\)行不会再动了,所以我们必须要关这…
你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态.游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态. 我们用数字“”表示一盏开着的灯,用数字“”表示关着的灯.下面这种状态 在改变了最左上角的灯的状态后将变成: 再改变它正中间的灯后状态将变成: 给定一些游戏的初始状态,编写程序判断游戏者是否可能在6步以内使所有的灯都变亮. 输入格式 第一行输入正整数n,代表数据中共有n个待解决的…
直接进入正题: 分块: 分块分块,就是把一个长串东西,分为许多块,这样,我们就可以在操作一个区间的时候,对于在区间里面完整的块,直接操作块,不完整的直接操作即可,因为不完整,再加上一个块本身就不大,复杂度会很小的,然后需要输出的时候,单点输出直接把本来自身的值加上对块的操作加起来即可,而对于区间询问,格外在维护一个区间总和数组即可.那么问题来了:分为几块呢? 答案是当大小为\(n\)的序列,分为\(\sqrt{n}\),因为对于上述的操作,设块数为\(k\),复杂度是为\(O(\frac{n}{…
(题面来自ACwing) 你玩过"拉灯"游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态.游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态. 我们用数字"1"表示一盏开着的灯,用数字"0"表示关着的灯. 给定一些游戏的初始状态,编写程序判断游戏者是否可能在6步以内使所有的灯都变亮. 输入格式 第一行输入正整数n,代表数据中共有n个待解决的游戏…
恩,这题...... 看看题面想到了啥?炮兵阵地! 再仔细一思考:炮兵阵地是求放置最多,而这个显然可以递推得出. 由于每个格子至多点一次,那么我们发现: 在第一行点击状态确定的情况下,后面每个格子的点击与否都是确定的.那么我们点完之后判断一下最后一行合不合法即可. #include <cstdio> #include <iostream> #include <algorithm> #define say printf("*") using names…
正解:枚举 解题报告: 入门傻逼题,思维难度不高代码量极小,非常适合上手 然后傻逼的我第二次看这道题的时候依然没想到解法:D 没有办法,就想着写个笔记好歹记录一下以后多复习几次就记着了趴qwq 就是,显然,确定了第一行之后所有的操作都是可以确定的了(之后的行每一步都是为了维护上一个,能懂趴?) 然后就一路推过去 最后看最后一行能否成立就行 然后用点儿位运算,over #include<bits/stdc++.h> using namespace std; #define ll long lon…
这个题我愣是交了好几遍没有过...... 后来@_皎月半洒花dalao告诉我说要^儿子节点的tag,然后就明白了...... 行吧,先上题面: 题目描述 现有N(2 ≤ N ≤ 100000)盏灯排成一排,从左到右依次编号为:1,2,......,N.然后依次执行M(1 ≤ M ≤ 100000)项操作,操作分为两种:第一种操作指定一个区间[a, b],然后改变编号在这个区间内的灯的状态(把开着的灯关上,关着的灯打开),第二种操作是指定一个区间[a, b],要求你输出这个区间内有多少盏灯是打开的…
传送门 解题思路 枚举第一行的状态,判断后面可不可行. 代码 #include<iostream> #include<cstdio> #include<cstring> using namespace std; ; const int inf = 0x3f3f3f3f; ,tmp[MAXN],now[MAXN][MAXN]; int check(){ ; ;i<=;i++) ret+=tmp[i],now[][i]=tmp[i]; if(ret>=ans)…
其实第一反应是双向BFS或者meet in middle,$2^{14}$的搜索量,多测,应该是可以过的,但是无奈双向BFS我只写过一题,已经不会写了. 发现灯的操作情况顺序不影响结果,因为操作相当于在固定位进行xor运算,xor是可以随便交换的,所以顺序无所谓. 那么情况取决于每盏灯是否被操作过.设这个量为未知量$x_i$.于是可以设计方程,对于每个灯,有 $begin \text{xor} x_1 a_{1,1} \text{xor} x_2 a_{2,1} \text{xor} ... \…
T3:搜索 很出名的题吧,费解的开关 同T2一样也是一题很考思考的 附上题解再解释吧: 对于每个状态,算法只需要枚举第一行改变哪些灯的状态,只要第一行的状态固定了,接下来的状态改变方法都是唯一的:每一行需要改变状态的位置都在上一行中不亮的灯的正下面,因为只有这样才能使上一行的灯全亮.我们枚举第一行的状态改变方法(共2^5种),对于每种方法都依次改变下面几行的状态使上面一行灯全亮.到最后一行我们需要判断是否最后一行也恰好全亮,并更新最小步数. 首先需要找到第一行的状态,怎么写?枚举深搜啊 找到了其…
放在原来这个地方不太方便,影响阅读体验.为了读者能更好的刷题,另起一篇随笔. 0x00 基本算法 0x01 位运算 [题目][64位整数乘法] 知识点:快速幂思想的灵活运用 [题目][最短Hamilton路径] 知识点: 状压DP.我的题解总是写得不好,大家还是看书吧qwq P2114 [NOI2014]起床困难综合症 知识点:状态压缩 0x02 递推与递归 [题目][费解的开关] 知识点:搜索?递推?模拟? +状压 [题目] 4座塔的Hanoi 知识点:递推 [题目][约数和问题] 知识点:数…
题目描述 Farmer John has arranged his N (1 ≤ N ≤ 5,000) cows in a row and many of them are facing forward, like good cows. Some of them are facing backward, though, and he needs them all to face forward to make his life perfect. Fortunately, FJ recently…
题意 游戏“The Pilots Brothers:跟随有条纹的大象”有一个玩家需要打开冰箱的任务. 冰箱门上有16个把手.每个手柄可以处于以下两种状态之一:打开或关闭.只有当所有把手都打开时,冰箱才会打开.手柄表示为矩阵4х4.您可以在任何位置[i,j](1≤i,j≤4)更改句柄的状态.但是,这也会更改第i行中所有句柄的状态以及第j列中的所有句柄. 任务是确定打开冰箱所需的最小手柄切换次数. 思路 一个和“费解的开关”,"棋盘翻转",这样的位运算的题目很像,只不过这次一次翻转1行+1…
位运算简介及实用技巧(四):实战篇 下面分享的是我自己写的三个代码,里面有些题目也是我自己出的.这些代码都是在我的Pascal时代写的,恕不提供C语言了.代码写得并不好,我只是想告诉大家位运算在实战中的应用,包括了搜索和状态压缩DP方面的题目.其实大家可以在网上找到更多用位运算优化的题目,这里整理出一些自己写的代码,只是为了原创系列文章的完整性.这一系列文章到这里就结束了,希望大家能有所收获.    Matrix67原创,转贴请注明出处. Problem : 费解的开关 题目来源    06年N…
[例题]CH0301 递归实现指数型枚举 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <vector> using namespace std; int n; vector<int> chosen; void calc(int x) { ) { ; i<chosen.size(); ++i) prin…
地址 https://leetcode-cn.com/submissions/detail/39277402/ 题目描述给你一个 m x n 的二进制矩阵 mat. 每一步,你可以选择一个单元格并将它反转(反转表示 0 变 1 ,1 变 0 ).如果存在和它相邻的单元格,那么这些相邻的单元格也会被反转.(注:相邻的两个单元格共享同一条边.) 请你返回将矩阵 mat 转化为全零矩阵的最少反转次数,如果无法转化为全零矩阵,请返回 -1 . 二进制矩阵的每一个格子要么是 0 要么是 1 . 全零矩阵是…
Chapter 1 递归与递推 时间复杂度(转载自yxc大佬) 一般ACM或者笔试题的时间限制是1秒或2秒. 在这种情况下,C++代码中的操作次数控制在 107107 为最佳. 下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择: n≤30n≤30, 指数级别, dfs+剪枝,状态压缩dp n≤100n≤100 => O(n3)O(n3),floyd,dp n≤1000n≤1000 => O(n2)O(n2),O(n2logn)O(n2logn),dp,二分 n≤10000n≤1000…
思路:乍一看好像和线性代数没什么关系.我们用一个数组B表示第i个位置的灯变了没有,然后假设我用u[i] = 1表示动开关i,mp[i][j] = 1表示动了i之后j也会跟着动,那么第i个开关的最终状态为:u[1]*mp[1][i]^u[2]*mp[2][i]....^u[n]*mp[n][i](或者改为相加 % 2).显然,前式等于B[i],所以,问题转化为了求u的解个数:MP*U = B.注意MP矩阵的写法. 关于矩阵: r(A) = r(A,b)           有解 r(A) = r(…
我们先看题面,一看是一个区间操作,再看一下数据范围,就可以很轻松地想到是用一个数据结构来加快区间查询和修改的速度,所以我们很自然的就想到了线段树. 但是这个题还跟普通的线段树不一样,这个题可以说要思考一下,我们可以知道一个区间内如果要修改的话那假如说原来有x个灯开着,那一次操作之后就变成了这个区间的长度减去x个灯.因此我们可以把懒标记确认为是否要下放因为这是棵线段树,每一个节点都表示一个区间,那一次修改可能会修改多次这个区间所以如果这次区间修改了,那就不用修改了. 其他就跟平常的线段树一样了.…
原题链接 前置知识: 线段树的单点.区间的修改与查询. 一看,我们需要维护两个操作: 区间取反: 区间求和. (因为区间 \(1\) 的个数,就是区间的和) 典型的 线段树 . 如果你只会线段树的 区间修改,单点修改,区间查询,单点查询 的话,这题的 "取反" 是个难题. 但是,这个数组有个性质: \(a_i \in {0,1}\) 也就是说,假设一个数组一开始这样子: \(1\) \(2\) \(3\) \(4\) \(a_i\) \(0\) \(1\) \(0\) \(0\) \(…
Code[VS]1690 开关灯 题解     时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description:     YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的,六点之后,会有M(2<=m<=100000)个人陆续按下开关,这些开关可以改变从第i盏灯到第j盏灯的状态,现在YYX想知道,从第x盏灯到第y盏灯中有多少是亮着的(1<=i,j,x,y<=N)…
这场有点难,QAQ.补了好久(。• ︿•̀。) ,总算能写题解了(つд⊂) A. Beautiful numbers CodeForces - 55D 题意 ​ 求\([l,r](1\le l_i\le r_i\le 9\cdot 10^{18})\)的中的 可以被自己每一位上的数字整除的数 的个数. 题解: ​ 知识:如果m%a=0,则任意x, x%a = (x%m)%a. ​ 2520是2~9的lcm.因此任何时候都有2520%pre_lcm==0. ​ 因为2520%pre_lcm==0,…
目录 #1. A + B Problem #2. Hello, World! #3. Copycat #4. Quine #7. Input Test #100. 矩阵乘法 #101. 最大流 #102. 最小费用流 #103. 子串查找 #104. 普通平衡树 #108. 多项式乘法 #119. 非负权单源最短路 #130. 树状数组 1 :单点修改,区间查询 #139. 树链剖分 #161. 乘法逆元 2 #556. 「Antileaf's Round」咱们去烧菜吧 #2030. 「SDOI…
POJ.3279 Fliptile (搜索+二进制枚举+开关问题) 题意分析 题意大概就是给出一个map,由01组成,每次可以选取按其中某一个位置,按此位置之后,此位置及其直接相连(上下左右)的位置(如果有)的0变成1,1变成0.现在求需要按多少次,才能使得整个map全部变成0. 此题解法与 UVA.11464 Even Parity 有异曲同工之妙. 首先可以看出,最多每个位置按一次,因为再按的话,相当于没按.如果我们枚举每一个位置是否按的话,2^(n*n)的复杂度爆炸. 接着思考,其实相对来…