摘要:campjls讲过模数循环节的问题,今天做cf才做到这类题 h1->a1的长度为len1,a1->a1的长度为cir1 h2->a2的长度为len2,a2->a2的长度为cir2 要注意特判,再用exgcd求 len1+cir1*t1 = len2+cir2*t2的一组整数解,把t1回代就是答案
阅读全文
摘要:从2e5-1依次枚举每个数作为主显卡,然后分段求比它大的数的个数,这里的复杂度是调和级数ln2e5,即埃氏筛的复杂度、、
阅读全文
摘要:用基本算数定理求约数和的思想来计算, 首先用pi,ci来表示第i个质数,指数为i,然后对于每个pi,pi^2...都有指数为mul{(c_1+1)(c_2+1)(c_i-1+1)(c_i+1+1)...}的贡献,所以枚举累乘即可 注意要用欧拉降幂来计算质数,同时用中间挖掉一个值的累乘,可以预处理前缀
阅读全文
摘要:和以前有一题构造01串的很像,固定住一个7,求出3的个数,对1的位置进行贪心
阅读全文
摘要:以后碰到这种题就应该往对称性想:设x的对称数x‘是1e6-x+1 对于任意一组对称数x+x'-2=1e6-1,2e6-(x+x')=1e6-1,即X集合Y集合同时加上任意一组对称数都是可以的 枚举每个xi,如果其对称数1e6-xi+1不在集合X中,那么在Y中添加这个对称数即可,正确性显然 反之如果对
阅读全文
摘要:一开始没有什么头绪,后来注意到m<=10,考虑是否可以用dp[i][j]表示第i位,前面跟了j个数的最大值 那么第i+1个数,直接和第i个数的[0,m]的m+1种状态去转移即可,如果是由0或m状态拓展出去的,那么值要-k 策略和序列最大连续子段和的贪心策略一样
阅读全文
摘要:两两枚举点(xi,yi)(xj,yj)对于第三个点(xk,yk),只要向量ik和ij方向不同即可 只要(xj-xi,yj-yi) 和 (xk-xi,yk-yi)化简后不相同即可,用每个点开个map存下一个gcd的pair即可
阅读全文
摘要://枚举高度[1,100000],>l的全部割掉, using namespace std; #define N 100005 #define ll long long struct Node{ll id,l,d;}a[N],b[N]; int cmp(Node a,Node b){ return a.lcnt[i]){ res+=cnt[i]*i; ...
阅读全文
摘要:excrt的理解 问对于方程组x = ai % ci 的 通解 x+tM, (x+tM) % k 是否有唯一值 看tm%k是否==0即可
阅读全文
摘要:暴力搜索超时,但是折半后两部分状态支持合并的情况,可用折半枚举算法 poj3977 给一个序列a[],从里面找到k个数,使其和的绝对值最小 经典折半枚举法+二分解决,对于前一半数开一个map,map[sum]里存下凑出当前sum的最小元素个数 枚举后面一半的所有情况,然后lower_bound去找m
阅读全文
摘要:换根dp就是先任取一点为根,预处理出一些信息,然后在第二次dfs过程中进行状态的转移处理 本题难点在于任意割断一条边,求出剩下两棵子树的直径: 设割断的边为(u,v),设down[v]为以v为根的子树的直径长度,up[v]为u所在的子树的直径长度,那么down[v]就是很常规的子树直径的换根dp的求
阅读全文
摘要:02:线段树两次扫描 #include<bits/stdc++.h> #include<vector> using namespace std; #define maxn 300005 struct Line{int x,y;char s[10];}a[maxn]; int n,m,K; int c
阅读全文
摘要:思维性比较强,代码挺简单的,dp[u][j]表示在u子树下安排j个机器人,让其不回u 注意转移时的初始值
阅读全文
摘要:/*这题显然不适用依赖背包的优化,因为不能保证根是必选的,但是可以按照常规依赖背包的思路进行转移,即每次对一个儿子进行C^2的转移 还是树形的背包,dp[u][j]表示u的子树里,切割出一个大小为j的包含u的联通块的代价 那么dp[u][j]按照常规的依赖背包转移即可 初始状态时dp[u][1],切割掉u的所有儿子的代价 注意本题需要特别讨论u是根和非根的情况,即非根的儿子是度数-1,但是最后以...
阅读全文
摘要:这个题用优化后的依赖背包做难以实现,所以用常规的泛化物品的和来做即可 每个节点的容量定义为这个节点下的叶子结点个数,dp[u][j]用来表示节点u下选取j个物品的最大收益,最后从m-0查询dp[1][i],一旦发现是非负数,i则是答案 需要注意的地方:初始化时将所有的dp[i][0]都赋值为0,一个
阅读全文
摘要:换根dp的部分比较容易,难点在于求求最长的任意两元素差不超过M的子段 首先会想到双指针维护(尺取法),如果p1,p2间的max-min>M,那么p1向右移动,直到p1,p2间的max-min>M 这个过程可以用线段树(ST)来询问max,min 另外有一种更强大的方案,因为只要max,min,所以只
阅读全文
摘要:给定一棵边权树,求距离每个点最远的点,输出这个距离
阅读全文
摘要:经典题了,网上博客一大堆O(nCC)的做法,其实是可以将复杂度降到O(nC)的 参考依赖背包优化(泛化物品的并) 根据背包九讲,求两个泛化物品的和复杂度是O(CC)的,所以依赖背包暴力求解的复杂度是O(nCC) 然后对其进行优化,考虑 F[u][j] 用来表示以结点u为根的子树(不包括u)体积为j的
阅读全文
摘要:A:01概率退背包,这是赛后看题解补的,概率的背包和普通的背包有点不太一样,但思想还是差不多的 /* n张牌带权值ai随机洗牌,然后抽牌 将每次抽到的ai累计到sum,可以重复抽牌,也可以停止 如果最后sum在区间(a,b]则胜利,反之失败 问获胜概率 先考虑该问题的弱化版:从n张牌里选出点数总和在
阅读全文
摘要:10:签到求n!取模 #include <iostream> #include <iterator> #include <algorithm> typedef long long ll; using namespace std; const ll mod=1e6+3; ll n; ll res[mo
阅读全文
摘要:$$ 求\sum_{i=1}^{n}(\sqrt[3]i,i)\\ 首先转化一下这个式子,考虑对于i\in[j^3,(j+1)^3 1],\sqrt[3]i=j\\ 所以可以枚举所有j,然后对i\in[j^3,(j+1)^3 1]区间的(i,j)求和即可 那么我们把n分成两部分,分别求和:\\ \s
阅读全文
摘要:A:一类线性dp,时间卡的有点紧 /* 定义 dp[t][i][j][k]代表填完前 t 个位置后,{0, 1, 2, 3} 这 4 个数字最后一次出现的位置, 排序后为 t, i, j, k(t > i > j > k) 的方案数目,则按照第 t 位的数字的四种选择,可以得 到四种转移。 t选t-
阅读全文
摘要:模板题。。去网上学了可撤销的并查集。。 下面是比较简洁的代码
阅读全文
摘要:涉及的知识点挺多,但是大多是套路 1.求曼哈顿距离的最值一般对所有情况进行讨论 2.三维树状数组用来求前缀最大值
阅读全文
摘要:求01矩阵里有多少个不同的1矩阵 首先预处理出pre[i][j]表示i上面连续的1个数,对每行的高度进行单调栈处理 栈里的元素维护两个值:pre[i][j]和向前延伸最多能维护的位置pos 然后算贡献,从左往右扫时维护一个最靠右下面没有1的列的位置p, 元素在被弹出时判断其pos是否能包含p,如果能
阅读全文
摘要:多校第一场第一题,这种类型的dp之前做过两题,状态转移一般是从当前状态往后推的 很经典的dp,不过很卡时间
阅读全文
摘要:/* set里的一定是本质不同的回文串,所以先建立回文树 当a可以通过nxt指针到达b,或者b可以通过fail指针到达a时,a就是b的子串 对于回文树里的每个结点u,我们可以将和其有关的结点为两部分: 1.结点下方的子树,这部分的所有结点都可以由u在两边加点得到,设大小为 size[u] 2.结点向上的fail链,这条链上的所有结点都是u的回文后缀,设大小为 tot[u] 那么...
阅读全文
摘要:拖了很久才补的回文树,感觉网上的博客都是一个做法。。回文树统计不同种类的回文串出现次数,然后用字符串hash来判每个回文子串是否符合要求
阅读全文
摘要:/* x[1,A] y[1,B] x^yC 把ABC拆成二进制后按位进行数位dp dp[pos][s1][s2][f1][f2] 表示从高到低第pos位,条件一状态为s1,条件2状态为s2,x在pos为的限制状态为f1,y在pos的限制状态为f2的方案数 条件状态s=0|1|2表示前pos位数运算结果C前pos位数 dp时枚举下一位的所有可能情况,如果当前状态已经确定(满足或不满足),那么下...
阅读全文
摘要:这个区间离散化把我调死了。。 总之用vector来离散化,然后叶子节点维护的是一段区间,记录下每个叶子结点的起点+长度 千万要注意下标不能弄错! update:其实用数组离散化也可以,,只是我的数组开小了一直不知道错在哪里。。
阅读全文
摘要:脑瘫一样暴力,贪心找最小表示的串,判一个串是否是最小表示法时也是暴力地判。。 但是想不通复杂度是怎么算的。。
阅读全文
摘要:/* 每个状态存最长匹配长度,然后多个串匹配过程中取最小的最长匹配长度 和LCS1不同的地方:LCS只要维护住当前匹配长度和最长匹配长度即可,但是多串匹配需要维护的是每个状态结点(即后缀树上)的信息 所以对每个状态存下两个值Max,Min,分别表示该状态对于该串的最长匹配长度,以及所有已经匹配过的串在该状态下的最小的最长匹配长度 在对一个串进行匹配后,在后缀树上自底向上回溯一次,更新Max值 更新
阅读全文
摘要:经典题 注意匹配的时候:用t串去s串的SAM里进行匹配,和字典树一样遍历t中字符,用cur记录当前已经匹配的长度,如果能当前字符能匹配则cur++(这里不能直接用cur=len[now]),反之用link指针进行失配,直到完成匹配后cur=len[now] 为什么匹配成功时不能直接cur=len[n
阅读全文
摘要:又领悟到了一点新的东西,后缀自动机其实可以分为两个数据结构,一个是后缀树,还有一个是自动机 后缀树用来划分endpos集合,并且维护后缀之间的关系,此时每个结点代表的是一些后缀相同且长度连续的子串 自动机用来处理边的转移,或者用来解决串的匹配问题,此时每个结点代表的只是一个串,这个串等于从root开
阅读全文
摘要:后缀自动机的入门博客 https://www.luogu.org/blog/Kesdiael3/hou-zhui-zi-dong-ji-yang-xie 有两种求法,分别对应了两种性质
阅读全文
摘要:考的其实是同构图的性质: 1.同构图的顶点数,边数相等 2.同构图通过点的映射后邻接矩阵相同 这篇博客讲的很好https://www.jianshu.com/p/c33b5d1b4cd9 本题还需要一步构造的方案,通过最基础的n=4和n=4+1的图的图推广到n=4k和n=4k+1的状态
阅读全文
摘要:这题的不能用二分做,因为不满足单调性的 可以用multiset做
阅读全文
摘要:模拟bfs,以空团为起点,用堆维护当前最小的团,然后进行加点更新 在加入新点时要注意判重,并且用bitset来加速判断和转移构造
阅读全文
摘要:试了很多种爆搜和剪枝,最后发现还是状压的比较好用 然后还有一种不同思路的搜索,一开始两个集合都为空,然后往两个集合里填元素,这样会少很多冗余的搜索
阅读全文
摘要:题目是求次大子矩形,那么在求最大子矩形的时候维护M1,M2即可 转移M2时比较的过程要注意一下
阅读全文
摘要:和两天做了两道数据结构优化dp的题,套路还是差不多的 题解链接! https://www.cnblogs.com/kls123/p/11221471.html 一些补充 其实这道题的dp[i]维护的不是每个点,而是每个离散化的y,也可以理解为当前折线停留在纵坐标为y的答案 从左往右,从上往下进行遍历
阅读全文
摘要:比赛的时候脑瘫了没想出来。。打多校以来最自闭的一场 显然从s中选择大于m个数组成的数必然比t大,所以只要dp求出从s中选择m个数大于t的方案数 官方题解是反着往前推,想了下反着推的确简单,因为高位的数优先级高,如果高位满足条件,那么低位只要用组合数求一下就行 然后是正着往后推,其实难度也不大,只不过
阅读全文
摘要:[1,n]n个数分成k组,每组n/k个,问k组数和相等的解决方案 首先(1+n)*n/2判定一下是否可以被k整除 n/k为偶数时显然成立 n/k为奇数时每组数前三个很难配,我想了一种玄学的结论,也证明不出来为什么是对的。。
阅读全文