10 2021 档案
摘要:Lisa 贪,就硬贪 显然当权值最大的那个点可以选了之后,必须立马选它答案才会最有 既然这个点必须立即选的话,那么何不把它和父亲合并起来,取个平均值 然后这颗新树上重复这个操作 就可以得到一个染色的顺序 #include<iostream> #include<cstdio> #include<cma
阅读全文
摘要:Lisa 对于这样的贪心题,很容易想到按照某个顺序排个序,比如说最小的spfa值递减 因为这样的话,对于每一瓶防晒霜,要不前面的牛能用,要不只有前面的牛能用 这样为了给后面省出尽可能多的防晒霜,不如把能用的最大的给前面的牛 也确实如此 #include<iostream> #include<cstd
阅读全文
摘要:Miku hash一波 然后拉链法散列表 #include<iostream> #include<cstdio> #include<cmath> #include<vector> #include<algorithm> using namespace std; template<class T>in
阅读全文
摘要:Miku 如果我们知道哪两个点可以用跑路机1s到达就好办了 怎么知道呢?如果两个点的距离可以为,那么一定有一个中转接点,到两个点的距离都是,也就是如此了。 这样显然可以用预处理出来距离 #include<iostream> #include<cstdio> #i
阅读全文
摘要:Miku 这个题可以用树hash做 怎么搞呢,对于一棵树,我们要用hash记录他的形态 对于二叉树,我们要记录的就是左儿子的hash和自己和右儿子。 然后进行比较 我采用的是对于左右儿子和自己乘上不同质数的方式 还有自然溢出,以及两次hash #include<iostream> #include<
阅读全文
摘要:你必须跳下悬崖,在半空中生出翅膀 在OI生涯的最后,很难得的我也听课了,进行最后的突击 效率会决定生死,写一下这个让自己基础 太过于舒适的环境会消磨斗志,也可能只是由于自己的意志 一边这么做一边调整行了 自己的意志坚定才行
阅读全文
摘要:Lisa 运用一点初中知识可以知道 维护一下区间平方和和区间和就可以处理了 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m; int f; i
阅读全文
摘要:Lisa 显然一定会走条边,会有一条边剩下走不了 这一条边是谁呢 这个图上有一个环,这个环呢上的每一个点,他走不到的那个边一定是在这个环上的和它相邻的那两个边当中的那个美观度较小的(显然等到回来的时候就是走完了) 对于不在换上的点,一定会走到环上,然后就和第一种情况一样了. #includ
阅读全文
摘要:或许你需要安装IE11
阅读全文
摘要:Jennie 和常规的求逆序对差不多 在从根节点往下走的时候,我们必须要避免不在他子树内的点的影响 那就先减去他们呗。 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm>
阅读全文
摘要:Jennie 经过一番思考,我们可以意识到最后数列里肯定只会有,这样我们就对此进行dp #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using na
阅读全文
摘要:Jennie 转移的时候要知道区间最值 那何不利用线段树来解决 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace
阅读全文
摘要:Jennie 因为要记录余数的问题,不能单纯追求最大 那么就加上一维来记录维数 再开一个数组记录是怎么转移的 #include<cstdio> #include<iostream> #include<cstring> #include<iomanip> #include<cmath> #includ
阅读全文
摘要:Jennie 搞出一个二维dp'还是比较显然的 #include<cstdio> #include<iostream> #include<cstring> #include<iomanip> #include<cmath> #include<algorithm> #define int long l
阅读全文
摘要:Jinnie 显然还是一个线性基的问题,那么很显然要用线性基 对于一堆石头,如果加入X会令异或值为0的话,那么显然我们可以拿出一块再把x放进去 这样只需要线性基检查能不能放,从大到小放就行。 这告知了我们求线性基可以考虑改变顺序 #include<bits/stdc++.
阅读全文
摘要:Jinnie 显然是一个线性基的问题,那么很显然要用线性基 想要知道所有的方案数,线性基的性质就是用其中的元素 出来的元素保证互不相等 这样的话只要知道线性基内元素的数量就可以了 #include<bits/stdc++.h> #define int long long using nam
阅读全文
摘要:Lisa 删边似乎挨个删复杂度也不会高到离谱 毕竟也就是的事。,因为显然可以想到先删点权最大的点,然后拓扑排序缩点啥的来一波 但是也可以从边的考虑,每一条边只会被删一次,且应会是在删两边较大的那个点的点权的时候被删,这样从边的视角考虑就省事了。 #include<cstdio> #i
阅读全文
摘要:Lisa 如果真的要枚举,排序暴力硬做的话肯定会挂掉 那么就是要优化的,显然划分一个2c的序列,答案不回比划分两个c的更优 可以画个图证明一下 而划分成小于c的序列,就相当于划分成一堆1的序列 划分成c-2c的序列呢?显然是不如划分成c和另外一个,肯定不会更差 这样的话就检查划分成c和1就可以解决了
阅读全文
摘要:JIsoo 期望得分要dp,然后期望长度是有关系的 那就一块dp #include<cstdio> #include<iostream> #include<cstring> #include<iomanip> #include<cmath> #include<algorithm> using nam
阅读全文
摘要:JIsoo 就是一个背包 #include<cstdio> #include<iostream> #include<cstring> #include<iomanip> #include<cmath> #include<algorithm> using namespace std; #define
阅读全文
摘要:JIsoo 关键在于压缩长度 不会证明怎么办 感性理解开个大数 #include<cstdio> #include<iostream> #include<cstring> #include<iomanip> #include<cmath> #include<algorithm> usin
阅读全文
摘要:JIsoo 首先考虑floyd本质就是dp,然后扔进新的一维,表示i和j之间经过k条边的最短路 枚举的时候是5个for?那也太疯狂了。 考虑一下如果i和j经过k能够作为当前边数的最短路的话,如果k和i,j距离不是1,那么在这一条路径上,一定可以用距离i为1的那个点来更新,这样的
阅读全文
摘要:Jisoo 找一个最长的周期 就是要找最短的border然后加上中间的部分 这样 出动 然后发现可以 “记忆化”一波进行优化 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<alg
阅读全文
摘要:Jisoo 作为dp来说这个题没啥意思 但是从中我们可以学到数学证明对于dp的指导 例如,只要 和 都不等于 那么这个序列是对数增长 这样似乎暴力也不怎么暴力了 #include<iostream> #include<cstdio> #include<cstri
阅读全文
摘要:Lisa 尺取法搞一波 然后前缀和优化一波 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int a[500005]; bo
阅读全文
摘要:Lisa 显然两个在一起的空格是没有意义的。 所以空格的相对的一定是字符 这样在匹配的时候考虑对于两个字符,加不加空格和加在哪里 因为连续的空格有额外贡献 所以要记录有没有和在哪里 #include<iostream> #include<cstdio> #include<cstring> #incl
阅读全文
摘要:Lisa 显然的dp,只需要再二分查找一下 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int n; struct to{
阅读全文
摘要:LIsa 就DP本身来说非常好想,但是怎样知道这个东西有没有在字典里出现过呢 hash似乎还是有点慢 这时候就应该用字典树了 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorith
阅读全文
摘要:Lisa 很水的kmp小题 思考一下就可以知道,肯定要跑kmp,但是当我们删掉一个串后剩下怎么办 答:从上一次的位置接着匹配 记录一下这个东西就行了 #include<iostream> #include<cstring> #include<iostream> using namespace std
阅读全文
摘要:LIsa 就是一个背包 #include<cstdio> #include<iostream> #include<cstring> #include<iomanip> #include<cmath> #include<algorithm> #define int long long using na
阅读全文
摘要:LIsa 只要理解kmp,就会知道应该找前缀和后缀了 把当前输入的串和已知的答案串拼起来,然后中间加上一个小小的不存在字符,跑kmp #include<cstdio> #include<iostream> #include<cstring> #include<iomanip> #include<cm
阅读全文
摘要:Jisoo 枚举一下next也没事 也可以运用结论 这个结论画个图证明就可以了 #include<cstdio> #include<iostream> #include<cstring> #include<iomanip> #include<cmath> #include<algorithm> us
阅读全文
摘要:Jisoo kmp中的next数组表示按照当前位置结尾的相同的最大真前缀和后前缀长度 那么如果这玩意真的存在,那么next[n] 一定不为零 然后枚举一下2-n-1,找找有没有相等的next就可以了 #include<cstdio> #include<iostream> #include<cstri
阅读全文
摘要:Jisoo 不显然的树上dp 定义为第i位和为子树所选奇数个/偶数个点的方案数 然后显然会发现奇数加奇数等于偶数等规律 然后就可以转移了 #include<cstdio> #include<iostream> #include<cstring> #include<iomanip>
阅读全文
摘要:Jinnie 处理出所有可能的品,然后尺取法找所有的正好n个的地方,取答案 正确性?假如正确答案不是n个连在一起,那么中间无论多了谁,一定会不止多一个 并且一定会存在一种n个在一起的更优解 #include<iostream> #include<cstdio> #include<vector> #i
阅读全文
摘要:Jinnie 显然的线性dp 预处理谁是回文串就可以了 #include<iostream> #include<cstdio> #include<vector> #include<queue> #include<cstring> using namespace std; int all[1005][
阅读全文
摘要:Jisoo 显然的转移,但是会是的,这很不好 但是可以意识到从不是同一颗树转移的时候,无需在意到底是那颗而只在意最大值 并且不会影响从自己转移 那就记录一下最大值 #include<iostream> #include<cstdio> #include<vector> #includ
阅读全文
摘要:Jisoo 思路比较显然的dp 我们怎么走?状压一波 当然可以,但是也不用 表示第i天的最小花费,显然我们只要枚举上一个转换点就可以了 毕竟转换了之后,之前怎么走的就不重要了 然后spfa预处理一波 #include<iostream> #include<cstdio> #includ
阅读全文
摘要:Jennie k是给定的 把m和n扔到一个坐标系里 成了二维的了,我们又都知道 然后求和那个奇特的范围 这就是个二维的前缀和啊 #include<iostream> #include<cstdio> #include<algorithm> #
阅读全文
摘要:#include #include #include #include #include #include #include #define int long long struct co{ int p; int c; int d; }c[500005]; int n,k,m; struct pp{
阅读全文
摘要:auto 是非常强的东西 ++k这种东西会在执行完整个语句后+1 unordered_map<>单纯的hash random_shuffle ()随机打乱一个序列 混着cin和getchar并且关闭流同步会出事 期望是概率的倒数 碰到异或题考虑按位处理 多组数据一定要读完数据!! 树状数组就像是一个
阅读全文
摘要:Jennie 这也就是个裸的一批的换根dp #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<stack> #include<map> #define
阅读全文
摘要:Lisa 先想一个朴素的 dp 表示前 个把 放在子序列 位的方案数,显然我们的 不是 的因数的时候 会直接从上一位继承下来 是不是有 背包那味了 对于每一个 我们分解质因子再转移 #include<iost
阅读全文
摘要:Rose 用维护区间最长连续1的方法就可以维护 但是还要维护一下最左边,不过这问题不大 维护一个区间最长连续子段,不在意位置就可以了 然后就可以在查询的时候,先看一看在不在左边,在看一看在不在中间,最后看一看在不在右边 就解决了 可见学线段树靠背模板是不行的 #include<iostream> #
阅读全文
摘要:Lisa 显然的贪心思路就是尽可能的不浪费, 那么就首先从前往后扫,把能拿且不浪费的大的都拿到 然后从小往大,在第一次没取到过的情况下争取放一个就可以大于c 然后记录一下这个情况,加快运算速度 #include<iostream> #include<cstdio> #include<algorith
阅读全文
摘要:Lisa 有非常显然的一点是这个题可以二分 也可以不。 我们可以首先用普通牌凑出尽可能多的幅,然后对于缺的情况缺一张用joker添就行了,缺两张或更多就用joker去完整的一副里换出所需要的东西 二分的话思想也差不多 二分了mid的时候,最多可以用mid张joker, 然后结合上面的思想,缺了的用j
阅读全文
摘要:Jennie 很有意思 首先贪心的对每一个a中字符匹配B中出现的第一个对应未匹配字符,这样的话就有了顺序 然后每一次的操作是交换相邻的字符,很像某种求逆序对方式对不对 然后这个题就是求逆序对 #include<iostream> #include<cstdio> #include<algorithm
阅读全文
摘要:Jennie 根据异或的性质,,如果A到B的路径和A到C的路径的异或和都是零 那么B到C的也都是零 所以说嘛,我们只要考虑从一个叶子节点外走就可以了 如果这一个叶子节点到其他叶子节点的路径都是偶数,,那么全设为1就是一种很好的方案 如果有奇数的路径,那么再搞出两个数,比如说2和3,就能构造出来了 那
阅读全文
摘要:Lisa 这一道题绝对恶意评分了 0-9,那么不如全求一遍 对于每一个数字的话,显然先改差为 1 的,然后2 并且把大数改小是优先的 而且把大数该小从前往后,小数改大从后往前 这样我们先记录一下每个数字有多少个 就好办了 #include<iostream> #include<cstdio> #in
阅读全文
摘要:Rose 很有趣的题目一道 显然的贪心就是按照时间顺序做,先最耗时短的,零点前的都零点交,零点后的都做完就交 正确性怎样保证呢 我们按照这个耗时进行排名后,假如交换两个任务的话 如果这两个任务都再零点前,没有影响, 如果后一个任务跨零点了,那么交换以后,后面的任务的罚时不会变,但前面的任务有可能也要
阅读全文
摘要:Lisa 贪心,贪心 首先考虑能打就打,我方最牛逼的能干过对方最牛逼的就干他 我们最垃圾的能干过对方最垃圾的就上去干他 如果都不行的话,那就派我方最垃圾的干翻敌方最垃圾的 我方最差情况就是敌方最好情况 #include<iostream> #include<cstdio> #include<algo
阅读全文
摘要:2021拓维游记 So wonderful 好吧第一天坐车司机车速飞快,在车上看完了人体的暗战,感觉很好 到了地方把东西一放玩会糖豆人,半个小时就到了吃饭的时间 为了完成时间线的收缩,我们决定仍然去吃米线 和以前一样拍完位置,拍了张和以前差不多的照片。 不得不说米线的量太大了,竟然吃不了,只好让gj
阅读全文