随笔分类 - ALG Records
摘要:4481. 方格探索 /* 1st" f[i][j][a][b]表示向右a步向左b步能否到达(i,j) => 2nd" f[i][j][a]表示向右走a步能够到达(i,j)最少需要向左走多少步 => 3rd" f[i][j]表示能够到达(i,j)最少要向右走多少步(j - c == a - b) 4
阅读全文
摘要:6050. 字符串的总引力 对任意一个子串,观察序列中每个字符对该子串**“引力”**的贡献,我们规定序列中第一次出现的字符贡献1,其他的字符贡献为0 遍历字符串s,统计每个字符的贡献,即每个字符可以做出贡献的子串数目 维护当前遍历到的字符的上一次出现的位置H 则子串左端点在$[H + 1, i]\
阅读全文
摘要:领奖台数 题意:给定任意一个序列$a_1,\cdots, a_n$,其中没有重复元素。如果$i < j < k$ 且$a_j > a_i > a_k$,三个数字的大小关系就像运动会颁奖时的领奖台。于是我们称序列中满足该条件的三元组$(i,j,k)$的个数为序列的领奖台数。设计一个算法来计算序列的领奖
阅读全文
摘要:1552D_Array Differentiation 思维:联想到图 /* 题意:给定序列 a 问能否构造出 b 使得 a 中每个数都可由 b 中数作差得到 将b数组看成点权,a数组看成边权,ai = bj - bk => j~k间有向边边权为ai,把作差理解成一条有向边 那么即得到一个 n 点
阅读全文
摘要:Reverse Sort Sum 法1:首先可得数组A中的1的总个数,对于$f(i,A)$,如果前$i$位有$x$个1,那么数组C的$[i - x + 1, i]$区间会+1,所以考虑反向操作,让区间-1,然后从后往前推(每次将Bi的贡献从Ci中删除),然后遍历到$C_i$时,如果大于0则$A_{i
阅读全文
摘要:381. O(1) 时间插入、删除和获取随机元素 - 允许重复 class RandomizedCollection { public: unordered_map<int,unordered_set<int>>hash; vector<int> nums; // 380基础上 哈希套哈希 Rand
阅读全文
摘要:380. O(1) 时间插入、删除和获取随机元素 class RandomizedSet { public: unordered_map<int,int>hash; vector<int>nums; // 使用哈希表支持O(1)插入删除 // 使用数组配合支持随机索引 RandomizedSet()
阅读全文
摘要:564. 寻找最近的回文数 回文数的前一半确定则整体确定。 对于ABCDEF而言,考虑五种情况: ABCCBA (ABC - 1)(…),为10…01时,\(10^{len - 1} - 1\); (ABC+ 1)(…),为99…9时,\(10^{len} + 1\) 考虑一个集合S,放入五种情况的
阅读全文
摘要:2014. 重复 K 次的最长子序列 统计s中每个字符出现频率cnt,获得频率大于等于k的字符,答案只会由这些字符组成,因此dfs全排列再check该排列是否符合出现k次这一条件 为了保证字典序,将chs逆序存储,并从大到小枚举字符串长度,遇到符合即返回答案 class Solution { pub
阅读全文
摘要:862. 和至少为 K 的最短子数组 法1:单调栈 + 二分 \(O(nlogn)\) #define max(a,b) (a>b?a:b) #define min(a,b) (a<b?a:b) class Solution { public: int shortestSubarray(vector
阅读全文
摘要:382. 链表随机节点 蓄水池算法: 描述:样本总数未知,从所有样本中抽取若干个,要求每个样本被抽到的概率相等 算法:从前往后处理每个样本,第i个样本覆盖当前结果的概率为 \(\frac{1}{i}\) , 返回最后结果即为抽样结果 证明:证明每个样本最终被抽到的概率相同: 设共n个样本,第 i 个
阅读全文
摘要:318. 最大单词长度乘积 关键:快速判断两个字符串是否有相同字母 解决:预处理出每个单词的二进制数字表示,二进制表示一共有 26 位,如果该单词含有字母 a,则第 0 位为 1,依次类推。 暴力枚举单词对,如果两个单词的按位与(&) 为 0,则这两个单词可以被选择,求长度的乘积和最大值作比较即可。
阅读全文
摘要:1938. 查询最大基因差 离线 + \(Trie\) 建树后$dfs$,每访问一个节点 \(v\),就插入 \(Trie\) ,并回答v的所有询问,然后将 \(v\) 从 $Trie$中删去。 using PII = pair<int,int>; const int N = 1e5 + 10; i
阅读全文
摘要:638. 大礼包 完全背包 + 状压 + 记忆化搜索 class Solution { public: vector<vector<int>>special; vector<unordered_map<int, int>> f; vector<int>price; int n; int dp(int
阅读全文
摘要:5909. 并行课程 III DAG上的动态规划 板子题 const int N = 5e4 + 20; int h[N],ne[N * 2], e[N * 2],idx,res,q[N],hh,tt,n,d[N],ddl[N]; class Solution { public: void add(
阅读全文
摘要:5908. 统计最高分的节点数目 dfs using ll = long long; class Solution { public: ll n, res, ans; ll dfs(vector<vector<int>>& G, int root){ ll cnt = 1,tmp = 1; for(
阅读全文
摘要:5906. 句子中的有效单词数 暴力 class Solution { public: int countValidWords(string sentence) { int cnt = 0, n = sentence.size(); for(int i = 0; i < n; ++i){ if(se
阅读全文
摘要:5907. 下一个更大的数值平衡数 打表 + 二分 class Solution { public: vector<int>t; int nextBeautifulNumber(int n) { t = {0,1,22,122,212,221,333,1333,3133,3313,3331,4444
阅读全文
摘要:767. 重构字符串 法1:贪心,每次在$res$尾巴放剩余数目最多的字符,但要保证与当前尾巴字符不同,若相同则换次大字符,用堆维护。 using PIC = pair<int,char>; class Solution { public: string reorganizeString(strin
阅读全文
摘要:Jury Meeting 会有一个人连续说两个任务说明在某一轮中他是最后一个发言且除他之外的人都已经说完了所有任务,因此在下一轮中他成为了第一个发言的人。因此我们可以从所有人的任务数中的最大值的角度考虑这个问题。 如果最大值的数量不唯一,则这些任务数量最大的人一定是在同一轮说完所有任务的,不会出现不
阅读全文
浙公网安备 33010602011771号