2-SAT 问题与解法小结】的更多相关文章

2-SAT 问题与解法小结 这个算法十分的奇妙qwq... 将一类判定问题转换为图论问题,然后就很容易解决了. 本文有一些地方摘录了一下赵爽<2-SAT解法浅析> (侵删) 一些概念: \(SAT\)问题:就是给一些布尔变量赋值,使得所有给你的条件成立的问题---适定性(Satisfiability)问题.我们令\(k\)为所有条件中含有变量的最大值,那么我们就可以称其为\(k-SAT\)问题. 可以证明\(k>2\)时候为NP完全问题,而\(k=2\)的时候存在多项式解法. \(2-S…
由于某毒瘤出题人 redbag 不得不学习一下这个史诗毒瘤算法. 本文参考了 Owaski 的 GameTheory 的课件. 定义 我们对于一些二维 \(\mathrm{Nim}\) 游戏(好像更高维也行),可以拆分成两维单独的 \(\mathrm{Nim}\) 然后求 \(\mathrm{Nim}\) 积. 定义为 \[ x \otimes y = \mathrm{mex}\{(a \otimes b) \oplus (a \otimes y) \oplus (x \otimes b), 0…
[SinGuLaRiTy-1013] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 这是 三道 USACO 的题...... 第一题:奶牛飞盘 题目描述 有n(2<=n<=20)头奶牛在玩飞盘,可是飞盘飞到了高处.现在他们要想办法叠在一起,去取飞盘.飞盘的高度为H(1 <= H <= 1,000,000,000).给出每头奶牛的重量.高度.强壮度(能够承受的重量),问他们是否够得到,如果能够取到,求它们额外还能承受最多多少…
题意 给你 \(n\) 个元素,\(m\) 个方程. 每个方程形如 \[ \begin{align} \gcd(x_i, y_i)=c_i\\ \mathrm{lcm}(x_i,y_i) = d_i \end{align} \] 之类的形式. 询问这个方程组是否有解.有 \(T\) 组数据. \(1 \le T \le 10, 1 \le n, m \le 200\) . 题解 这道题是一个很巧妙的 \(2-SAT\) .不会的话,可以参考 2-SAT 问题与解法小结 . 我们可以这样设计变量,…
目录 题目链接 注意点 解法 小结 题目链接 https://leetcode.com/problems/surrounded-regions/ 注意点 边缘不算包围'O' 解法 解法一:dfs.找处在边缘上的O然后dfs将与之相邻的O都改为#.处理完之后再把这时候的O改为X,#改为O即可 class Solution { public: void solve(vector<vector<char>>& board) { int n = board.size(); for(…
目录 题目链接 注意点 解法 小结 题目链接 Word Ladder - LeetCode 注意点 每一个变化的字母都要在wordList中 解法 解法一:bfs.类似走迷宫,有26个方向(即26个字母),起点是beginWord,终点是endWord.每一次清空完队列ret+1表示走了一步.bfs可以保证是最短路径. class Solution { public: int ladderLength(string beginWord, string endWord, vector<string…
目录 题目链接 注意点 解法 小结 题目链接 Best Time to Buy and Sell Stock - LeetCode 注意点 在卖出之前必须要先购入 解法 解法一:遍历一遍,随时记录当前数字之前的最小的数字.将当前数字与当前最小数字相减查看收益.时间复杂度O(n) class Solution { public: int maxProfit(vector<int>& prices) { int size = prices.size(); if(size < 1) r…
目录 题目链接 注意点 解法 小结 题目链接 Path Sum II - LeetCode 注意点 不要访问空结点 解法 解法一:递归,DFS.每当DFS搜索到新节点时,都要保存该节点.而且每当找出一条路径之后,都将这个保存为一维vector的路径保存到最终结果二维vector中.并且,每当DFS搜索到子节点,发现不是路径和时,返回上一个结点时,需要把该节点从一维vector中移除. /** * Definition for a binary tree node. * struct TreeNo…
目录 题目链接 注意点 解法 小结 题目链接 Subsets II - LeetCode 注意点 有重复的数字 数组可能是无序的,要先排序 解法 解法一:递归,只需要在Subsets中递归写法的基础上多加一句if(find(ret.begin(),ret.end(),tmp) == ret.end()) ret.push_back(tmp);j即可,因为已经排序了,所以加进去的如果已经存在就说明是重复的. class Solution { public: typedef vector<int>…
目录 题目链接 注意点 解法 小结 题目链接 Find Common Characters - LeetCode 注意点 不能单纯的以字母出现的次数来判断是否是公共的字母 解法 解法一:将第一个字符串的每个字母逐个在其他字符串中查找,如果所有的字符串都含有就加入res.时间复杂度O(n^2),n是所有字符串的长度之和. class Solution { public: vector<string> commonChars(vector<string>& A) { vecto…
目录 题目链接 注意点 解法 小结 题目链接 Longest Word in Dictionary through Deleting - LeetCode 注意点 长度一样的字符串要按字典序返回较小的 解法 解法一:遍历字典中的单词,用一个变量i来记录单词中的某个字母的位置,我们遍历给定字符串,如果遍历到单词中的某个字母来,i自增1,如果没有,就继续往下遍历.这样如果最后i和单词长度相等,说明单词中的所有字母都按顺序出现在了字符串s中.如果能得到,而且单词长度大于等于结果ret的长度,我们再看是…
目录 题目链接 注意点 解法 小结 题目链接 Merge Intervals - LeetCode 注意点 区间是无序的 每个区间start一定小于end 解法 解法一:首先以start的值从小到大来排序,排完序我们就可以开始合并了.先把第一个区间存入ret,然后从第二个开始遍历所有区间,如果与ret中最后一个区间有重叠就更新,否则就直接存入ret.时间复杂度O(n) /** * Definition for an interval. * struct Interval { * int star…
目录 题目链接 注意点 解法 小结 题目链接 Jump Game - LeetCode 注意点 解法 解法一:贪心算法,只关注能到达最远距离,如果能到达的最远距离大于结尾说明能到达,否则不能.并且如果i超过了能到达的最大距离说明不能到达,因为i是每次加一都能超过最大距离,小于i的所有位置都会走到某个最远距离为0的位置.时间复杂度O(n) class Solution { public: bool canJump(vector<int>& nums) { int n = nums.siz…
目录 题目链接 注意点 解法 小结 题目链接 Group Anagrams - LeetCode 注意点 字母都是小写的 解法 解法一:用一个字符串表示strs[i]中出现的字母,比如:abc->111000000000000000000000000.aab->210000000000000000000000000.同时用map保存hash与vector的下标对应关系.时间复杂度O(n) class Solution { public: vector<vector<string&g…
目录 题目链接 注意点 解法 小结 题目链接 Find First and Last Position of Element in Sorted Array - LeetCode 注意点 nums可能为空 时间复杂度为O(logn) 解法 解法一:最普通的二分搜索,先找到一个target,然后向两边拓展. class Solution { public: int binarySearch(vector<int>& nums, int target) { int left = 0,rig…
目录 题目链接 注意点 解法 小结 题目链接 Permutations II - LeetCode 注意点 不确定有几种排列 解法 解法一:因为有重复的数字所以排列的个数不确定几个,一直生成新的排列直到和原始的数列相同为止 class Solution { public: vector<int> nextPermutation(vector<int> nums) { int n = nums.size(),i = n-2,j = n-1; while(i >= 0 &…
目录 题目链接 注意点 解法 小结 题目链接 Rotting Oranges - LeetCode 注意点 解法 解法一:bfs.首先先统计所有新鲜的橘子数目fresh,如果fresh大于0则一直执行bfs.我们只处理昨天刚腐烂的橘子,grid[i][j]的值就表示第几天腐烂的橘子,由于新鲜橘子的值一开始就是2,所以每次修改的时候都要改为day+3即 day+1+2(2是本来就有的,1表示经过了一天).如果bfs之后发现新鲜橘子数没有减少则return -1,否则继续下一天的腐烂. class…
目录 题目链接 注意点 解法 小结 题目链接 Next Permutation - LeetCode 注意点 如果是字典序最大的串则要返回字典序最小的串 解法 解法一:参见:http://www.cnblogs.com/grandyang/p/4428207.html 时间复杂度O(n). class Solution { public: void nextPermutation(vector<int>& nums) { int n = nums.size(),i = n-2,j =…
目录 题目链接 注意点 解法 小结 题目链接 Min Cost Climbing Stairs - LeetCode 注意点 注意边界条件 解法 解法一:这道题也是一道dp题.dp[i]表示爬到第i层的最小cost,想要到达第i层只有两种可能性,一个是从第i-2层上直接跳上来,一个是从第i-1层上跳上来.所以可以得到dp[i] = min(dp[i- 2] + cost[i - 2], dp[i - 1] + cost[i - 1]).时间复杂度O(n). class Solution { pu…
目录 题目链接 注意点 解法 小结 题目链接 Climbing Stairs - LeetCode 注意点 注意边界条件 解法 解法一:这道题是一题非常经典的DP题(拥有非常明显的重叠子结构).爬到n阶台阶有两种方法:1. 从n-1阶爬上 2. 从n-2阶爬上.很容易得出递推式:f(n) = f(n-1)+f(n-2)于是可以得到下面这种最简单效率也最低的解法 -- 递归. class Solution { public: int climbStairs(int n) { if(n == 0 |…
目录 题目链接 注意点 解法 小结 题目链接 Satisfiability of Equality Equations - LeetCode 注意点 必须要初始化pre 解法 解法一:典型的并查集算法应用.先遍历所有等式,将等号两边的字母加入同一分类,每类中的字母都是相等的.然后遍历不等式,如果不等号两边的字母属于同一类则返回false.时间复杂度O(nm) class Solution { public: map<char,char> pre; char Find(char x) { cha…
目录 题目链接 注意点 解法 小结 题目链接 Generate Parentheses - LeetCode 注意点 解法 解法一:递归.当left>right的时候返回(为了防止出现 )( ) class Solution { public: void recursion(int left,int right,string str,vector<string> &ret) { if(left > right) return; else if(left== 0&&a…
目录 题目链接 注意点 解法 小结 题目链接 Maximum Subarray - LeetCode 注意点 最大值有可能是正负数交替着出现 解法 解法一:一次遍历即可.当sum小于0的时候就重新开始求和,因为sum小于0再加上一个数字绝对不可能是max(即sum+nums[i] < nums[i])时间复杂度为O(n) class Solution { public: int maxSubArray(vector<int>& nums) { int max = nums[0],…
目录 题目链接 注意点 解法 小结 题目链接 Merge Two Sorted Lists - LeetCode 注意点 两个链表长度可能不一致 解法 解法一:先比较两个链表长度一致的部分,多余的部分直接加进答案链表即可.时间复杂度为O(n) /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL)…
目录 题目链接 注意点 解法 小结 题目链接 Valid Parentheses - LeetCode 注意点 考虑输入为空的情况 解法 解法一:如果是'('.'{'.'['这三者就入栈,否则就判断栈是否为空和栈顶括号是否与之匹配.注意两个判断顺序不可以颠倒,不然会runtime error.时间复杂度为O(n) class Solution { public: bool isValid(string s) { stack<char> stk; for(auto &ch:s) { if…
目录 题目链接 注意点 解法 小结 题目链接 Letter Combinations of a Phone Number - LeetCode 注意点 可以不用按字典序排序 解法 解法一:输入的数字逐个处理,在已经生成的字符串后面追加该当前数字对应的所有字符.时间复杂度为O(n) class Solution { public: vector<string> letterCombinations(string digits) { vector<string> ans,temp_an…
目录 题目链接 注意点 解法 小结 题目链接 3Sum Closest - LeetCode 注意点 和3Sum那道题的target是0,这道题是题目给定的 要先计算误差再移动指针 解法 解法一:做法类似3Sum那道题解法二,每次移动指针前先计算误差,如果误差为0,直接返回target即可.时间复杂度为O(n^2) class Solution { public: int threeSumClosest(vector<int>& nums, int target) { sort(num…
目录 题目链接 注意点 解法 小结 题目链接 3Sum - LeetCode 注意点 和two sum那道题不一样的是这题返回的是具体的数字,不是下标 解法 解法一:将每个数字都作为target,剩下的数字按照two sum那道题来做,得到的结果先排序然后放进set,保证没有重复的结果.因为用了太多STL容器所以...时间复杂度为O(我也不知道怎么算) class Solution { public: vector<vector<int>> threeSum(vector<i…
目录 题目链接 注意点 解法 小结 题目链接 Integer to Roman - LeetCode 注意点 考虑输入为0的情况 解法 解法一:从大到小考虑1000,900,500,400,100,90,50,40,10,9,5,4,1这些数字,大于就减去,直到为0.时间复杂度为O(n) class Solution { public: string intToRoman(int num) { string ans = ""; while(num > 0) { if(num &g…
目录 题目链接 注意点 解法 小结 题目链接 Container With Most Water - LeetCode 注意点 没什么好注意的... 解法 解法一:暴力求解,假设任意两个端点会是最佳答案,逐个比较.时间复杂度为O(n^2) class Solution { public: int maxArea(vector<int>& height) { int i,j,n = height.size(),max = 0; for(i = 0;i < n;i++) { for(…