摘要:
对网格图黑白染色,在黑色格中填不同的质数,白色格中填相邻黑色格的lcm+1,但这样会超过1e15的上限将网格图划分为两类对角线,每一条对角线选一个质数,然后每一个点就是两条对角线的质数相乘,而白格的值就仅为四个较小质数的乘积+1(注意不能让两个大质数配到一起) 1 #include<bits/std 阅读全文
摘要:
先按照d从小到大排序,遍历所有建筑i,如果能修,显然要去修的考虑不能修,显然选择让之前所需时间最多的那个建筑不修(如果就是自己那就放弃),用堆来维护 1 #include<bits/stdc++.h> 2 using namespace std; 3 struct ji{ 4 int t,d; 5 阅读全文
摘要:
二分答案,考虑答案是否会大于等于这个mid,显然所有数值分为两类:大于等于mid和小于mid将n个数转化为01串,如果0和1不相邻,那么答案就是第一个数/最后一个数(一定会相同),考虑有连续两个0/1否则连续的两个数一定会上升到某一个高度并变为一个数,因此只需要找到最高的一层全部变成0/1时,也就是 阅读全文
摘要:
有一个结论:两个区间的最长路的端点一定是这两个区间中的最长路端点(4选2),所以可以用线段树来维护区间最长路的两个端点,然后最终合并即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 100005 4 #define L ( 阅读全文
摘要:
将s所有长度为d/2的子串放进ac自动机中,直接匹配就可以判定半现串了再对其做一个差分,询问一个前缀的半现串个数,在ac自动机上数位dp,f[i][j][0/1]表示走了i步(i位的字符串),走到节点j,是否达到上限的方案数对于ac自动机上的结束节点,直接重置并累计答案即可 1 #include<b 阅读全文
摘要:
首先可以发现对于两条链来说,显然是对两边都排好序,然后大的配大的,小的配小的(正确性比较显然),最后再加入根(根只能单独选)这个结果其实也可以理解为将所有max构成一条新的链,求出因此,对于每一个结点计算出答案,然后与别的点合并得到父亲,用启发式合并+set时间复杂度为两个log。 1 #inclu 阅读全文
摘要:
分治,维护一个dp数组,当递归到区间[l,r]时,需要保证这个dp数组维护的是除去[l,r]以外的dp数组维护其实很简单,就是递归左区间是先将右区间加入,然后再将左区间加入(要先复原)然后递归右区间即可 1 #include<bits/stdc++.h> 2 using namespace std; 阅读全文
摘要:
先考虑一个联通块,可以发现这个联通快内不会存在两个偶数的点证明:如果存在,那么这两个点的某一条路径上的边全部反过来,可以使答案+2,即答案为点数或点数-1同时,发现答案的奇数点数一定与边数同奇偶,那么答案就被确定了,具体实现可以使用并查集 1 #include<bits/stdc++.h> 2 us 阅读全文
摘要:
(以下用$Sa=\sum_{j=1}^{i}xi\cdot ai$,Sb和Sc同理)令f[i][x]表示前i个数,$Sa\le x\le Sb$时最小的Sc考虑第i个数是否选择,可以得到递推式$f[i][x]=min(f[i-1][x],min(f[i-1][x-j])+ci)$(j满足$ai\le 阅读全文
摘要:
先可以将所有出度为0的节点连向一个点,然后问题变为求到这个点的必经之点这其实是一道模板题,因为有一个东西叫做支配树容易发现一个点的必经之点都是一条链,其实可以把这条链上最浅的点作为这个点的父亲,那么一个点的所有必经之点显然就是他到根的路径上的点具体来说,这个点的父亲就是他所有联通的点的lca(不能叫 阅读全文