题目
lyx_2016
蒟蒻,OIer
展开
-
【牛客contest16806 C】【状态压缩】【bitset】
题目链接题目描述一共有 n个数,第 i 个数是 xixi 可以取 [li , ri] 中任意的一个值。设 S=∑xi2S = \sum{{x_i}^2}S=∑xi2,求 S 种类数。n, l, r 都是1~100首先考虑暴力做法,因为n很小,暴力枚举是10^6用dp[100][10^6] 这样一个数组来存结果。第一维i表示用了i个数,第二维j表示要凑出j这个数,dp[i[][j]取值只有0和1,表示这个数能不能凑出来。首先bool数组可以用bitset来节省空间,bitset每位数只占1b原创 2021-06-14 21:37:01 · 166 阅读 · 0 评论 -
【学习笔记】博弈论
博弈论的题比较重思路,代码都比较好写,所以我打算脑内做题不写代码,梳理一下遇到的博弈论题目的思路。Codeforces 1215D Ticket Game题意是给一个由数字0~9和问号构成的字符串,长度为N,N为偶数【需要注意可能没有问号】,B和M两人轮流用数字替换问号,M先手,若所有问号都被替换后前一半的数字之和等于后一半的数字之和,B胜,否则M\胜。考虑三种情况:没有问号。只要判断两边数字之和即可。数字之和大的那边问号多,则一定是M胜。剩下的情况,若问号的数量除以二等于两边的差值,则B胜,原创 2021-03-01 10:42:14 · 165 阅读 · 0 评论 -
【CodeForces 1183H】【dp】【容斥】
题目链接题目大意是给一个字符串s,找出最长的k个互不相同的子串需要注意这道题里子串的定义,是可以不连续的几个字母,例如“asdf”有2^4个子串,分别是“asdf” “asd” “asf” “adf” “sdf” “as” “ad” “af” “sd” “sf” “df” “a” “s” “d” “f” “”(空串)n的范围是1~100, k的范围是1~10^12最开始没好好看这道题里什么是子串,我以为必须是连续的字母,n的数据范围又小,暴力枚举就行唉,不好好看题就急着写的下场这样的话,我们考虑原创 2021-02-06 15:49:24 · 159 阅读 · 0 评论 -
【CodeForces 1003F】【map编码+暴力kmp】
题目链接题目大意是给一个单词序列,里面如果出现重复的单词组(两个及以上连续单词),就可以将单词组里面的单词用一个字母替换,总长度就会减小。每次只有一个重复出现的单词组可以替换,求总长度的最小值。例如“to be or nor to be”就可以替换成"TB or not TB",总长度就由18变为12。我一开始想的是用“.”替换空格,然后在新的字符串中找最长重复子串。上网搜了一下可以用后缀数组求,也可以二分最长重复子串的长度。但是写着写着发现不可行,这样有可能最后得到的子串不是完整的单词。看了一篇题原创 2021-02-06 11:35:18 · 197 阅读 · 0 评论 -
【PAT a1052】【静态链表】
题意是给你一条静态链表,让你根据键值排序有两点需要注意:一是题目里可能会给不在给定链上的节点,给节点加一个onlist值,在写cmp函数的时候判断,把不在链上的放到后面去二是有可能出现给定链上没有节点的情况,做题一定要多想一下为0的情况,需要特判输出#include <cstdio>#include <algorithm>#include <iostream>#include <climits>using namespace std;con原创 2021-02-02 16:07:01 · 121 阅读 · 0 评论 -
【PAT a1032】【静态链表】
又是一道非常简单的题 但是小细节出了问题TvT输入数据中给了当前节点的地址和下一个节点的地址,一看就是静态链表,这道题甚至不需要排序,只需要两条链扫一遍就行。但是很重要的一点是静态链表一开始是用地址来作为数组下标的,这样才能方便找到下一个节点。#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int MAXN = 1e6 + 5;struct原创 2021-02-01 13:01:21 · 141 阅读 · 0 评论 -
【POJ2406】【KMP】next数组用于求循环节
这篇博客解释的很清楚,比我讲的要好得多有个结论就是串的长度size能整除size - next[size],这个串就存在循环节,循环节的长度就是size - next[size]#include <cstdio>#include <iostream>#include <cstring>using namespace std;char a[1000005];int nextval[1000005];int main(){ while (scan原创 2021-01-31 15:45:05 · 89 阅读 · 0 评论 -
【HDU 2087】【KMP】
一道kmp模板题,发现我还是有一些细节没有理解到位先简述一下kmp算法:给定一个文本串和一个模式串,求模式串在文本串中不重叠地出现了几次。若文本串和模式串中有许多部分是一样的,那么采用传统的方法就会有一些浪费。简单一点来说,kmp算法就是对模式串进行预处理,用一个next数组,next[j]的数值表示模式串的第j位之前的串中前多少位与最后多少位相等再加一,也就是如果第j位不匹配的话应该从第next[j]开始匹配。例如,abcabx 对应的next数组的值为011123于是在匹配时abcabc…a原创 2021-01-31 14:45:33 · 146 阅读 · 0 评论 -
【PAT A1056】【队列】
恶心!!这道题太恶心了!!为什么题面要写的这么难懂,为什么输入数据成心给你添麻烦!本来很简单很裸一看就能想到的一道队列题,非得写这么复杂哼在老鼠的顺序和体重之间,我本来打算用一个map来通过体重得顺序,通过顺序得体重,后来出了bug我才发现,它无法判断你给的int是key还是value = =再细细一想,这不是用数组下标就能解决的事吗 = =||在算排名的时候我不太会,看了题解才知道,由于每组晋级一只老鼠,所以每轮一共晋级group只老鼠,未晋级的老鼠排名就是group+1#include <原创 2020-12-16 21:11:23 · 91 阅读 · 0 评论 -
【PAT A1051】【栈/模拟】
题目大意:给你栈的容量M和k个长度为n的序列,问你将1,2,…,n依次入栈,这k个序列所代表的出栈顺序是否可行。我一开始觉得可行序列可能遵循某种规律,但是找了半天没有发现。看了题解之后才惊觉模拟就可以解决。TvT在将n个元素依次入栈的过程中,判断当前要入栈的元素是否与需要判断的出栈序列里的元素相同,如果相同的话就依次出栈。栈满,或者最后栈中仍有元素则输出“NO”,否则就是“YES”【我实在是个很差的讲题人TvT 这个模拟感觉挺裸的,不知道该咋个描述】#include <cstdio>原创 2020-12-16 19:42:35 · 155 阅读 · 0 评论 -
【PAT b1025】【静态链表】
Ahhhh回来啦!最近可能集中做一波题www之前去浅尝辄止了半天别的,现在学不下去了再回来做做题TvT在看程杰老师的《大话数据结构》以及胡凡老师的《算法笔记上级训练实战指南》,想多做点题巩固一下我相当于没有的数据结构基础。【p.s.大话数据结构真的讲的通俗易通,程杰老师是用好几个生动的例子来分布讲解一个数据结构,我之前想的是能不能把数据结构具象化、模拟化,串成一个完整的情景和故事讲出来,还是有点难quq】这道题的题意很简单,链表节点信息是由一个五位数构成的地址、数据以及下一个节点的地址构成的。要求是给原创 2020-12-15 11:31:38 · 177 阅读 · 0 评论 -
【LeetCode834】【树形dp】每日一题day35
道题要求每个节点到其他所有节点的距离之和先考虑一个节点到其他所有节点的距离之和的问题。看到距离首先我想到的就是最短路,但是树上没啥最短路_(:з」∠)_然后我就没想出什么行之有效的方法_(:з」∠)_看了题解是树形dp,那么问题来了,为什么呢?这道题也没有什么最值,看起来距离之和是一个很固定的东西,一点都不动态。其实我觉得,与其说是dp,不如说是递推。这里的中心思想就是从叶子往上推,处理距离distSum[root] = sigma(distSum[root'sChild] + childSum[原创 2020-10-16 11:16:13 · 210 阅读 · 0 评论 -
【LeetCode24】【链表/递归】每日一题day34
这道题写是能写,就是又臭又长,看了题解的递归写法之后恍然大悟。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, List原创 2020-10-16 10:21:56 · 116 阅读 · 0 评论 -
【LeetCode416】【DP】每日一题day33
好久不见~我一开始看到,元素和是一个定值嘛,我觉得可以转换成LeetCode40 组合总和II,找nums里面和为一个定值的元素,就写了回溯,结果超时了class Solution {public: bool recall(int cnt, int sum, map<int, int> appearNumber, vector<int> nums) { if (sum == 0) return true; if (sum <原创 2020-10-12 10:36:27 · 101 阅读 · 0 评论 -
【LeetCode18】【双指针】每日一题day32
题面:给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。这道题我一看,和组合总和差不多嘛,十分钟就写了个回溯,结果一堆bugTvT 虽然它最后还是超时了,但是有一些写回溯的心得我要写一下class Solution {public: void recall(vector<int> nums, vector&l原创 2020-10-05 11:36:55 · 102 阅读 · 0 评论 -
【LeetCode1】【哈希】每日一题 day30
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { map<int, int> cha; vector<int> ans; int size = nums.size();原创 2020-10-03 21:30:32 · 1364 阅读 · 2 评论 -
【LCP19】【DP】每日一题day29
天哪!LeetCode的每日一题终于不是树啦!前几天觉得题目类型有些重复,都是一看就会写的_(:з」∠)_ 开始了动态规划!字符串!!正是我薄弱的地方,希望接下来一个月都是这些能让我好好学习学习这道题一眼就能看出来是我不会的dp。因为[红,黄,红]每一块的长度不固定,真的不知道该怎么设定它的状态,如何状态转移也毫无头绪,好像当前叶子和它的前一片叶子关系不大。我们试着按照动态规划的思路来分析一下:一、...原创 2020-10-02 11:02:59 · 180 阅读 · 0 评论 -
【LeetCode235】【LCT】每日一题day28
这道题是要找二叉搜索树的最近公共祖先,就是从根往下搜的第一个在两个值中间的数,如果当前根比两个值都大,就递归搜左子树,都小就右子树。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} *原创 2020-09-29 09:44:47 · 88 阅读 · 0 评论 -
【LeetCode113、106】【递归、DFS】每日一题day26、27
LeetCode113…太裸了,实在没啥好说的,但是我写的程序有点慢,就先把代码贴在这看看以后能不能优化一下。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */cla原创 2020-09-26 17:13:53 · 81 阅读 · 0 评论 -
【LeetCode501】【中序遍历】每日一题day25
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: void bianli(TreeNode *t, int &a原创 2020-09-24 20:48:23 · 96 阅读 · 0 评论 -
【LeetCode617】【递归】每日一题day24
很简单的一个递归嘛,我就建了一颗新树/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: void hebing(原创 2020-09-23 17:46:18 · 71 阅读 · 0 评论 -
【LeetCode968】【贪心】每日一题day23
题面:给定一个二叉树,我们在树的节点上安装摄像头。节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。计算监控树的所有节点所需的最小摄像头数量。一遇到这种题我就一点办法没有TvT一开始觉得,是dp吧,很明显是要从子节点推上来。但是子节点就那么几种情况,而且每种情况下当前节点要做出什么选择也是确定的,因此当前节点的选择与子节点是如何走过来的无关,所以不是dp是贪心。那么考虑状态,放相机和没放相机,但是没放相机的时候又要分为需要放和不需要放。于是:0 表示当前节点需要被监控1 当前节点没放原创 2020-09-22 10:22:39 · 87 阅读 · 0 评论 -
【LeetCode78】【位运算/递归】每日一题day21
这个是在补之前的题。这道题就是让你输出一个无重复数字的序列的全部子集,听起来hin简单,但是我却想不出来怎么做。看了题解之后两种方法都很简单,但是我自己又不会写。方法一:每一个数字有取和不取两种状态,想到了什么?二进制。于是每次+1就可以枚举出所有情况class Solution {public: vector<int> t; vector<vector<int>> ans; vector<vector<int>>原创 2020-09-21 19:29:39 · 114 阅读 · 0 评论 -
【LeetCode538】【中序遍历】每日一题day22
天哪这道题大有文章哈哈哈哈哈哈哈题目里面很重要的一点是二叉搜索树,而我对这一点完全没有在意…二叉搜索树是左儿子小于自己,右儿子大于自己,左右子树又都满足这个条件的一棵树。那么知道这个之后就能发现如果反向中序遍历,得到的就是一个由大到小的序列,直接累加求前缀和就行了。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *r原创 2020-09-21 10:25:34 · 90 阅读 · 0 评论 -
【LeetCode404】【递归】每日一题day20
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: void diGui(TreeNode *t, int &am原创 2020-09-19 19:02:10 · 78 阅读 · 0 评论 -
【LeetCode47】【全排列】每日一题day19
含有重复数字的数组的全排列class Solution {public: void permutation(vector<int> &nums, int cnt, vector<int> &res, vector<bool> &used, set<vector<int>> &pre) { if (cnt == nums.size()) { p原创 2020-09-18 09:26:41 · 156 阅读 · 0 评论 -
【LeetCode37】【回溯】每日一题day18
这道题是补的前几天的题,是我在写LeetCode79单词搜索的时候错过的【社团出去聚餐了quq】这道题又零零散散写了三天。一眼就能看出来是回溯,但是具体要怎么写一时间我还想不出来,感觉限制条件太多,比N皇后还要复杂。之后看了一眼题解,维护三个bool数组col[9][10], row[9][10], block[3][3][10]。col[i][j]表示j这个数字在第i行用没用过。之后按行来遍历回溯【按列或者块都是可以的】。思想是非常简单直白的。class Solution {public:原创 2020-09-17 22:18:25 · 100 阅读 · 0 评论 -
【LeetCode685】【并查集】每日一题day17
昨天day16做了一道二叉树的翻转,迭代或者递归都行,很简单没啥好说的。今天这个并查集…我反省,我没看出来。给你一棵有n个节点,n条边的树,让你找出那条多余的边。考虑有两种情况:1、冲突。即有一个点有两个父亲。这个可以统计每个点的入度,也可以在union的时候判断一下是不是已经有父节点了2、成环。这里用到并查集,连接两个点的时候看看它们是不是已经连上了【这里应该能看出来是并查集的】那么就可能出现三种情况:1、只成环。删掉最后一条成环的边即可。2、只冲突。删掉最后一条起冲突的边即可。3、既冲原创 2020-09-17 21:01:39 · 115 阅读 · 0 评论 -
【LeetCode94】【迭代】每日一题day15
二叉树的中序遍历,递归很好写,但是用迭代要怎么写呢?迭代就是知道了初始条件之后一步步往下推,获得新的条件,继续推。这道题需要用栈储存信息我想到的需要标记它是否访问过,但是我不会改leetcode里面结构体的definition,自己电脑上也还没配leetcode环境【对我一直在它的网页里写题TvT】就先把代码放在这,回头来再试试/** * Definition for a binary tree node. * struct TreeNode { * int val; * T原创 2020-09-15 23:57:26 · 103 阅读 · 0 评论 -
【LeetCode79】【回溯】每日一题day14
这道题是前天的每日一题,我前天写了一整晚上,昨天时间不多都没有调过,还拉下了两天的题我尽量今天补上。题面:给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。思路:遍历整个网格,找到单词开头的那个字母开始搜索,看这个字母的上下左右和单词的下一个字母一不一致,如果一致的话标记访问过再下去递归,如果递归后上下左右都找不到返回false就把访问过的标记去掉。cl原创 2020-09-15 12:20:00 · 90 阅读 · 0 评论 -
【LeetCode637】【BFS/队列】每日一题day13
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vector<double> averageOfL原创 2020-09-12 08:47:43 · 84 阅读 · 0 评论 -
【每天更新】做题&复习列表
?:还有没解决的问题*:看了题解但没有未解决的问题y:没问题了【分类方法依照这个回答】分类情况题目备注回溯?LeetCode51 N皇后慢回溯yLeetCode77 组合回溯?LeetCode39 组合总和回溯?LeetCode40 组合总和II回溯?LeetCode216 组合总和III特别慢DFS*LeetCode 841 钥匙和房间DFSyLeetCode257 二叉树的所有路径BFS原创 2020-09-11 23:09:33 · 138 阅读 · 0 评论 -
【LeetCode216】【回溯】每日一题day12
class Solution {public: void huiSu(vector<vector<int>> &ans, vector<int> res, int k, int n, int cnt) { if (k == 0 && n != 0) { return; } if (k == 0 && n == 0)原创 2020-09-11 22:23:49 · 87 阅读 · 0 评论 -
【LeetCode 39、40】【回溯】每日一题day10、11
这两道题是组合总数和组合总数II。第一题是在一个无重复数字的数列里可重复取数去组成给定的一个数k,第二题是在有重复数字的数列里每个数只能取一次去组成k。两个题都是回溯嘛。先说第一题,我一开始觉得它有三种情况:1、选它,下一个还选他2、选它,去选下一个3、不选它,去选下一个然后就发现问题了,它同一个答案会输出好几遍,原因是1+3和2是一样的结果,然后我想到了用一个bool值记录它上一次是不是选了它自己,如果是的话就不能走3从这里就开始乱了,后面还出现了漏解的情况…我又一拍脑袋想出了另一种回溯方法原创 2020-09-10 11:30:47 · 92 阅读 · 0 评论 -
【LeetCode77】【回溯】每日一题day9
这道题我一看就不会啊…本来觉得看看题解可能一两个小时都写不完,结果写个回溯试试十几分钟就过了quq 可能做题多了就是想不过都难的感觉吧,最近特别想做题,多做!多做!多做!class Solution {public: void chooseNum(int s, int t, int k, vector<int> &res, vector<vector<int>> &ans) { if (k == 0)原创 2020-09-08 15:37:05 · 80 阅读 · 0 评论 -
【LeetCode 347】【map】每日一题day8
class Solution { typedef pair<int, int> PAIR;public: struct CmpByValue { bool operator()(const PAIR& lhs, const PAIR& rhs) { return lhs.second < rhs.second; } }; vector<int> topKFrequent(原创 2020-09-07 16:18:51 · 84 阅读 · 0 评论 -
【LeetCode107】【BFS】每日一题day7
气死我了气死我了气死我了, while语句右面加了个; 我debug半小时愣是没看着TTTTvTTTT/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class So原创 2020-09-06 16:05:12 · 85 阅读 · 0 评论 -
【LeetCode60】【全排列】每日一题day6
class Solution {public: int nums[10]; string getPermutation(int n, int k) { for (int i = 1; i <= n; i++) { nums[i - 1] = i; } for (int i = 1; i < k; i++) { next_permutation(nums原创 2020-09-05 23:24:16 · 126 阅读 · 0 评论 -
【LeetCode257】【DFS】每日一题day5
/** * Definition for a binary tree node. struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} };*/ class Solution {public: void search(TreeNode *t, vector<st原创 2020-09-04 09:35:02 · 94 阅读 · 0 评论 -
【LeetCode 51】【N皇后/回溯】【树的遍历】每日一题 day4
参考了这篇题解N皇后问题,典型的回溯。先看暴力做法,就是把第一个皇后放在第一行第一列,然后再把第二个皇后放在第二行,这样试试试不行了就回去,但是你的棋盘已经改了,回去的话再改棋盘就很麻烦题外话:【这里可以发现就是树的前序遍历:根→子树从左到右】【树的遍历共有5中:前序(根→左子树→右子树)、中序(左→根→右)、后序(左→右→根)、bfs、dfs(一枝搜到底,再回到根节点去搜它的其他子树) 我以前不知道它们有什么用_(:з」∠)_原来是可以和实际的搜索结合起来的(看了这篇学到了)】所以我们改成回溯,关键原创 2020-09-03 22:48:26 · 118 阅读 · 0 评论