各种题
文章平均质量分 58
杂题
荼白777
这个作者很懒,什么都没留下…
展开
-
奇怪的汉诺塔 && Four Column Hanoi Tower
奇怪的汉诺塔题面传送门思路首先考虑三个柱子的汉诺塔;假设当前有nnn个盘子; 先把前n-1个盘子从A柱移到B柱, 然后把A柱上剩的那一个盘子移动到C柱 最后把B柱上的那n-1个盘子移动到C柱上因此可以得到递推式f(i)=f(i−1)∗2+1f(i)=f(i-1)*2+1f(i)=f(i−1)∗2+1+1+1+1指的是最后一个盘子,而f(i−1)∗2f(i-1)*2f(i−1)∗2则是因为n−1n-1n−1个盘子需要移动两次(先A到B,再B到C)接着考虑四个盘子的汉诺塔 先把j原创 2021-11-15 11:58:14 · 766 阅读 · 0 评论 -
程序自动分析——无序离散化+并查集
题面237. 程序自动分析注意点这道题的离散化不需要维护相对顺序,因此我们直接用unordered_map;注意我们离散化了,因此注意并查集的上限是hash_val因此初始化的并查集时候需要注意,如下//p(i)是并查集for(int i=1;i<=hash_val;++i){ p[i] = i;}Code#include <iostream>#include <unordered_map>using namespace std原创 2021-09-29 17:22:34 · 98 阅读 · 0 评论 -
238. 银河英雄传说
题面题目思路如果不问两个数之间的距离,那么就是个裸的并查集;维护距离的话,我们可以像维护树上的节点的距离一样操作;即维护每个点到根节点的距离,那么两个点之间的距离只需要相减即可(前缀和思想);那么如果将a合并到b中,我们最朴素的方法就是像下图这样操作;但是这样肯定超时,我们优化一下;a集合中的每个点要走到b节点,必然会经过pa;那么我们只需要给pa加上一个数,相当于给a集合中的每个元素都加了一个数;只需要在find函数查找的时候,同时更新距离即可;Code注意一个细节;f原创 2021-10-02 16:48:07 · 105 阅读 · 0 评论 -
Kobolds and Catacombs——思维
题目链接题意是给我们一个数组,让我们给它分成连续的若干个子数组;要求给子数组排序后,这个数组满足不降;思路一考虑排序后的数组和排序前数组的差异;写几个样例容易发现,如果他们的前缀和是一样的;那么我们就可以划分出一个子数组#include <iostream>#include <algorithm>using namespace std;const int N = 1e6+10;typedef long long ll;int a[N],n;ll s原创 2021-09-12 22:00:54 · 224 阅读 · 0 评论 -
牛牛的MEX
题目题目来源思路因为a[i]a[i]a[i]各不相同,比如我们当前要求[L,R][L,R][L,R],那么我们只需要取[1,L−1]和[R+1,n][1,L-1]和[R+1,n][1,L−1]和[R+1,n]的最小值即可;Code1可以用前缀最小值 + 后缀最小值来完成;#include <iostream>using namespace std;const int N = 1e5+10;int mnL[N],mnR[N],a[N];int n,q;int m原创 2021-09-08 20:56:24 · 113 阅读 · 0 评论 -
牛客不降数——矩阵快速幂应用
不降数首先暴力打表,寻找规律;/*1 1 1 1 1 1 1 1 1 (0~9)9 8 7 6 5 4 3 2 1 (10~99)45 36 28 21 15 10 6 3 1 (100~999)165 120 84 56 35 20 10 4 1 (1000~9999)495 330 210 126 70 35 15 5 1 (10000~99999)*/以第二行为例,9是10~19的总数;8是20~29的总数;以第三行为例,45是100~199的总数;以此类推我们容易发现,下一行原创 2021-04-10 17:28:48 · 81 阅读 · 0 评论 -
多重集组合数POJ3046
#include <iostream>using namespace std;const int N = 1010;int x[N];int f[N][100010];//f(i,j)表示前i种数 选j个时 取法的个数const int MOD = 1000000;int main(){ int t,a,s,b; cin >> t >> a >> s >> b; for(int i=1;i<=a;i++原创 2021-03-20 17:32:15 · 58 阅读 · 0 评论 -
POJ2481
题意思路一、使用树状数组#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;const int N = 1e5+10;struct Cow{ Cow(int l,int r,int p) :l(l),r(r),pos(p){} Cow(){} int l,r,pos;}c[N]原创 2021-04-22 23:47:47 · 99 阅读 · 0 评论 -
小C的数学问题——单调栈应用
小C的数学问题利用单调栈维护一个三元组(vali,Li,Ri)(val_i,L_i,R_i)(vali,Li,Ri)对于每个值,我们都假设其为最小值;看看这个值,作为最小值能取的区间是多少;比如数据63 1 6 4 5 2有以下几个三元组(3,1,1)(3,1,1)(3,1,1)(1,1,6)(1,1,6)(1,1,6)(6,3,3)(6,3,3)(6,3,3)(4,3,5)(4,3,5)(4,3,5)(2,3,6)(2,3,6)(2,3,6)我们可以发现答案在(4原创 2021-07-25 18:28:44 · 93 阅读 · 0 评论 -
LIS变形——AcWing1014登山
AcWing1014 登山LIS变形题,枚举山顶;如果不预处理的话是需要n3n^3n3的,或者说用nlogn的方法求也要n2lognn^2lognn2logn预处理一下即可注意1->n 的严格降序 不等价于 n->1 的严格升序结果是一样的,但是对于某个点来说,是不同的;即结果相同,过程不同;比如写成这样#include <iostream>using namespace std;const int N = 1010;int a[N];int f[N]原创 2021-05-17 20:08:28 · 81 阅读 · 0 评论 -
Acwing.95费解的开关
题目我们很容易想到两点每一个位置顶多只会操作一次(因为如果操作两次的话,相当于不操作,必然是不满足最优解)在一套方案中,操作的顺序无关紧要(因为每个按钮是0还是1,只取决于它或它周围的按钮被按下的次数)我们假定上一行已经不能改变了那么如果上一行中存在’0’,我们想让它变成’1’,就需要按下一行的按钮;即若第iii行存在’0’,我们现在固定(不按按钮)第iii行,要想让这些’0’变成’1’,只能去按i+1i+1i+1行的按钮;同理若i+1i+1i+1行是固定的,要操作只能去操作i+2i+2原创 2021-08-16 22:03:46 · 83 阅读 · 0 评论 -
AcWing.100 增减序列 ---- 差分、贪心
题目来源题面思路首先看到区间加减,要维护区间加减,最简单的操作就是使用差分;那么我们就按照差分的思路往下走;原问题1是最少操作多少次,能使得数列中所有数都一样;因为差分数列b1=a1,bi=ai−ai−1b_1 = a_1,b_i = a_i - a_{i-1}b1=a1,bi=ai−ai−1可以发现,问题1转化成了最少操作多少次,使得b2到bn=0b_2到b_n = 0b2到bn=0问题2是问这样的数列有多少种,经过差分就转化成了b_1有多少种取值那么现在明确目标原创 2021-08-21 00:16:29 · 112 阅读 · 0 评论 -
糖果传递 &&七夕祭
糖果传递题目来源思路根据题意,希望最终每个点的值都是平均值那么我们先假设有6个点,和n个点是一样的;对于每个点iii来说,本身有aia_iai个糖果,传递出去xix_ixi个糖果,接受到xi−1x_{i-1}xi−1个糖果,最终一定是avgavgavg个糖果;我们可以列出式子;a1−x1+x6=avga_1-x_1+x_6=avga1−x1+x6=avga2−x2+x1=avga_2-x_2+x_1=avga2−x2+x1=avg…a6−x6+x5=avga_6-x_原创 2021-08-27 15:00:10 · 89 阅读 · 0 评论 -
最小覆盖子串
题目来源思路很简单,用尺取法即可;代码中有一个优化,见initL和initR;举个例子s=XXXABCXXX,t=ABC这个优化会将ABC两边的XXX去掉,因为是无用的状态;Codeclass Solution {public: unordered_map<char,int> umt,ums;bool ck(){ for(const auto& x : umt){ if(ums[x.first]<x.second) return fa原创 2021-08-31 18:05:55 · 73 阅读 · 0 评论