08 2021 档案
摘要:题面传送门 首先是牛顿迭代。 举个例子,你要求并且你不会解一元二次方程。 然后你先找到一个算出的当前值。 然后求当前点的切线,大概是 带入就可以解得$x=x_0+\frac{f(x_0)}
阅读全文
摘要:题面传送门 zj:这种屑题最多评个蓝 首先判一下无解,然后将同样的缩成一个点。 然后设为最后有个联通块的答案,所以最后答案容斥一下就好了。 这个东西分治的时候NTT合并答案就好了。 有亿点卡常,时间复杂度 code: #include<bits/stdc++.
阅读全文
摘要:题面传送门 n这么小就很诡异。 考虑设阈值 如果当前的那么直接暴力建边就好了,这时候的边数是的。 如果当前的那么放到一起处理,发现如果是相同的,那么位置相同的全部位置只要在左右之间建边就好了,其它边是可以迭代进
阅读全文
摘要:题面传送门 指导居然卡空间差评!!!! 首先肯定可以暴力建图然后跑费用流,每次增加一个流量,这样可以 然后发现如果一行是一个连续没有障碍段那么肯定走到最后再换行一定不会更劣。 所以可以这样缩点,并把每个点拆成出点和入点限流,然后对于每个障碍点连出条边即可。 时间复杂度$O(n2
阅读全文
摘要:题面传送门 这么大肯定只能矩乘(暴论 但是不能出现这个串的限制很难搞,考虑设表示第位然后匹配到答案第位。 然后如果预处理出kmp就可以搞了。 把这个递推改成矩乘就可以轻松跑过。 code: #include<bits/s
阅读全文
摘要:题面传送门 这个题很屑啊强行套两个题上去。 首先肯定要从高到低枚举位然后看这一位是否可以为 然后问题转化为判定能否分成段,且或的值是一个给定数的子集,这个东西可以的dp解决掉。 具体的,设为分了段,到了第个数的方案数,转移的
阅读全文
摘要:题面传送门 一眼线段树分治然而想想都会T 考虑什么更优的算法。 我们用线段树维护权值大于的树上路径交,然后线段树上二分,看看树上路径交是否包含这个点即可。 时间复杂度,需要使用LCA code: #include<bits/stdc++.h> #define I
阅读全文
摘要:题面传送门 首先这个在树上的边肯定只是变小,不在树上的边肯定只是增大。 我们设在树上的一条边为,边权和变化量为和,与这条边构成环的非树边为 那么肯定有 移项以后是$W_e-W_{e'}\leq
阅读全文
摘要:题面传送门 考试的时候想了2h写了个假做法意识到错以后20min切掉我是sb 首先这个东西肯定是一个图论问题,然后发现如果边表示爆了跟着爆那么缩点以后答案就是这个点拓扑下去的点个数。 然后前面这个线段树优化建图就好了。 一个点拓扑下去的个数显然可以bitset但是不是我们想
阅读全文
摘要:题面传送门 首先显然有一个三只log的做法,就是先二分,然后点分找大于这个值的路径,直接爆炸。 考虑有什么更优的方法,我们将点分治的顺序跑出来,然后发现一个点计算答案的区间一定是一段区间。 然后我们像超级钢琴那样就好了。 区间最大值的话如果是线段树是,st表是$O(nlog^
阅读全文
摘要:题面传送门 我再不判图联通我是sb! 我们可以先跑出这个图的一个生成森林,然后在生成森林上跑。 如果两个环叠在一起那么肯定是有解的,就是两个环的交集的两个端点。 所以我们让每条非树边往上打标记,碰到标记说明有环重叠。 然后把两个环拿出来处理一下就好了。 时间复杂度 code: #incl
阅读全文
摘要:题面传送门 太神了。这道题。 考虑先两次拓扑找到为起点到这个点的最长路,为这个点开始的最长路。 然后按照拓扑序操作点。 如果我们将操作过的点设为集合,没有操作过的点设为集合,那么最长路只可能是以下三种: A集合内部,B集合内部,A集合到B集合。 前面两个很好维护,第三个在
阅读全文
摘要:题面传送门 首先肯定要找到任意一个在所有形态树中都一样的点,那么肯定找到重心。 然后找到中心以后设为与子树的最小答案。 然后对于这两个点的子树KM一下就可以得到答案了再加上自己。 时间复杂度 code: #include<bits/stdc++.h
阅读全文
摘要:题面传送门 这个一眼分数规划然后转化成树上长度在之间的最长路径问题。 这个东西可以长链剖分解决,就是像重链剖分一样用线段树维护,然后轻儿子暴力查找和加入即可。 注意不要忘了一条链的情况。 时间复杂度 code: #include<bits/stdc++.h>
阅读全文
摘要:A 刚开始其实并不会然后看了看样例发现自己会了。 大概就是把最大的拿出来然后剩下的放一起,正确性易证。 code: using namespace std; int T,n,x;ll Maxn,ToT; int main(){ scanf("%d",&T);while(T--){ scanf("%d
阅读全文
摘要:题面传送门 这道题形象地给我们展示了DAG下支配树地求法。 我们建立一棵树,每个点的父亲表示如果灭绝了,一定灭绝。容易发现答案就是子树节点个数-1 考虑这个东西怎么求。 我们从入度为的点出发,对于一个点,它的父亲是在DAG上所有儿子在支配树上lca,因为只有
阅读全文
摘要:题面传送门 首先把这颗树转化成最小的括号序。 然后有一个神奇的结论:如果两棵有根树的最小括号序相同,那么他们同构。 仔细想想其实是这么回事,这个东西使树的形态确定。 然后对于无根树我们找到它的重心做根就好了 时间复杂度 code: #include<bits/stdc++.h> #
阅读全文
摘要:题面传送门 考虑长链剖分。我们对于每个链顶存下这条链上的点和往上长度个点。 然后倍增预处理出一个点往上祖先。 对于一个点的的级祖先,我们让他先跳级祖先,此时这个点所在的长链一定大于等于$2^{\lfloor logk\rf
阅读全文
摘要:题面传送门 就这?就这?建议评蓝。 首先这个东西肯定是所有点的出现期望加起来。 考虑单个点怎么算,那么就是所有儿子的子树内不出现概率乘个边权乘起来最后用1减掉就好了。 那多个点不就换个根就好了。 时间复杂度 code: #include<bits/stdc++.h> #define I
阅读全文
摘要:题面传送门 似乎是很平凡的idea了啊,而且这道题也不卡常啊。 容易想到一个暴力dp,就是设表示点,有了的状态,当前点为的方案数,这样子是枚举子集要的过不掉。 然后接下来这个idea大概出自[SHOI2016]黑暗前的幻想乡(也不能说出自因
阅读全文
摘要:题面传送门 不得不说这个正解是真的暴力本来还想写可持久化平衡树的( 考虑我们将每个新加入的树看作一个点。 那么我们要支持这些操作: 查询一个点在那个树里面,这个直接lowerbound就好了。 查询一颗树内某个点在原树哪个节点,这个直接把原树的dfs序拍了然后主席树区间大就好了。 查询现在树上
阅读全文
摘要:题面传送门 发现自己写了个屑的做法。 首先这种走步的东西想到根号分治。 设阈值,若的话那么就暴力跳,时间复杂度 若的话那么对于每个一起处理,每次做一遍倍增就好了。这个单次倍增时间复杂度$O
阅读全文
摘要:1003 手玩一下发现如果是一维的只能有两个,二维的只能有三个。 所以得出结论,一维能分开一个。 code: int T;ll n,k; int main(){ scanf("%d",&T);while(T--) scanf("%lld%lld",&n,&k),puts(n<=k+1?"Yes":"
阅读全文