上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 29 下一页
摘要: 一眼二分。然后重点是树上贪心部分 长得像dp一样,设mn为子树内已炸点的最浅点,mx为子树内没有炸并且需要炸的最深点,然后转移直接从子树继承即可 然后是判断当前u点是否需要炸,当mx[u]+mn[u] include using namespace std; const int N=300005; 阅读全文
posted @ 2018-09-15 21:07 lokiii 阅读(178) 评论(0) 推荐(0) 编辑
摘要: 按根号300000=m分情况讨论 查询是,当x小于等于m,那么可以暴力记录直接出解;否则,用分块维护区间值,查询的时候以x为步长跳根号m次取最小值即可 还有一种并查集方法,来自https://www.cnblogs.com/CQzhangyu/p/7088337.html cpp include i 阅读全文
posted @ 2018-09-15 19:17 lokiii 阅读(132) 评论(0) 推荐(0) 编辑
摘要: 这题加个 include都会MLE…… 神思路,每个数抵消宇哥和它不同的数,最后剩下的就是众数 cpp include int n,la,x,tot; int main() { scanf("%d",&n); for(int i=1;i 阅读全文
posted @ 2018-09-15 11:10 lokiii 阅读(95) 评论(0) 推荐(0) 编辑
摘要: 神区间dp 设f[l][r][0]为在l到r中压缩的第一个字符为M,并且区间内只有这一个M,f[l][r][0]为在l到r中压缩的第一个字符为M,并且区间内有两个及以上的M 然后显然的转移是f[i][j][1]=min(f[i][k][0],f[i][k][1])+min(f[k+1][j][0], 阅读全文
posted @ 2018-09-15 11:01 lokiii 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 注意到周期234的lcm只有12,也就是以12为周期,可以走的状态是一样的 所以先预处理出这12个状态的转移矩阵,乘起来,然后矩阵快速幂优化转移k/12次,然后剩下的次数暴力转移即可 cpp include include include using namespace std; const int 阅读全文
posted @ 2018-09-15 10:17 lokiii 阅读(140) 评论(0) 推荐(0) 编辑
摘要: 好眼熟啊 直接dp显然很难算,所以设val为只在n点建一个仓库的费用,然后设f[i]为在i~n点建若干仓库并且i点一定建一个仓库的最大省钱数 转移很显然,设s为p的前缀和,f[i]=max{f[j]+s[i]\ (x[j] x[i])} a[i] 然后推转移 $$ f[i]=f[j]+s[i] x[ 阅读全文
posted @ 2018-09-15 09:59 lokiii 阅读(186) 评论(0) 推荐(0) 编辑
摘要: 脑补一下给出的图:一个环,然后有若干连接环点的边,我们就是要求这些边不重叠 考虑一下不重叠的情况,两个有交边一定要一个在环内一个在环外,所以把相交的边连边,然后跑黑白染色看是否能不矛盾即可(可能算个2 SAT?) cpp include include include using namespace 阅读全文
posted @ 2018-09-15 08:40 lokiii 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 等于有传递性,所以hash一下把等于用并查集连起来,然后再判断不等于是否合法即可 cpp include include include include using namespace std; const int N=200005; int T,n,x,y,v,f[N],g[N],tot,has; 阅读全文
posted @ 2018-09-15 08:09 lokiii 阅读(98) 评论(0) 推荐(0) 编辑
摘要: spfa预处理出最短路数组dis,然后反向建边bfs出ok[u]表示u能到n点 然后发现有0环的话时候有inf解的,先dfs找0环判断即可 然后dfs,设状态f[u][v]为到u点,还可以跑最短路+v的长度,记忆化,然后直接搜即可 cpp include include include includ 阅读全文
posted @ 2018-09-15 07:50 lokiii 阅读(143) 评论(0) 推荐(0) 编辑
摘要: 设f[i]为凑i元的方案数,这个随便dp一下就行了 然后处理限制,我们考虑用容斥,也就是4个超限 3个超限+2个超限 1个超限,这里用状压枚举一下,然后i硬币超限就当做选了d[i]+1个,在s里减去,最后用来容斥的就是f[s'] 阅读全文
posted @ 2018-09-14 15:46 lokiii 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 思路有点眼熟啊,就是设l1记录长为x的极长全1串贡献x的答案,l2记录长为x的极长全1串贡献x^2的答案,f记录真正的答案 转移的话根据n (n 1)=1,n^2 (n 1)^2=2n 1,n^3 (n 1)^3=3n^2 3n+1直接转移即可 cpp include include using n 阅读全文
posted @ 2018-09-14 15:11 lokiii 阅读(99) 评论(0) 推荐(0) 编辑
摘要: 今天脑子不太清醒,把数据范围看小了一直TTTTLE…… 最大费用最大流,每个格子拆成两个(x,y),(x,y)',(x,y)向(x,y)'连一条费用a[x][y]流量1的边表示选的一次,再连一条费用0流量inf的表示取走之后再从这里走,然后每个(x,y)'向(x,y+1),(x+1,y)连一条费用0 阅读全文
posted @ 2018-09-14 14:59 lokiii 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 对于三个点求最小路径长度和,答案肯定在某两个点的lca上,因为如果把集合点定在公共lca上,一定有两个点汇合后再一起上到lca,这样显然不如让剩下的那个点下来 这个lca可能是深度最深的……但是我懒得证了,反正只有三个lca,每个都求一遍然后取个max就好啦 cpp include include 阅读全文
posted @ 2018-09-14 14:08 lokiii 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 设sj,so,si分别是J O I的个数前缀和,然后要求求最长(l,r)满足sj[r] sj[l 1]==so[r] so[l 1]==si[r] si[l 1],化简一下就是满足so[r] so[l 1] (sj[r] sj[l 1) (si[r] si[l 1] (so[r] so[l 1))= 阅读全文
posted @ 2018-09-14 11:52 lokiii 阅读(169) 评论(0) 推荐(0) 编辑
摘要: 很容易发现行数就是lcm环长,也就是要求和为n的若干数lcm的个数 有结论若p1^a1+p2^a2+...+pm^am include using namespace std; const int N=1005; int n,p[N],tot; long long f[N][N]; bool v[N 阅读全文
posted @ 2018-09-14 10:48 lokiii 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 我有病吧……明明直接枚举是否匹配就可以非要写hash,然后果然冲突了(……我个非酋居然还敢用hash 设f[s][i]为已选串状态为s并且最后一个串是i,还有预处理出g[i][j]表示最长有长为g[i][j]的i串后缀等于j串前缀这里,直接暴力匹配即可…… 然后注意到比较麻烦的事要求字典序最小,但是 阅读全文
posted @ 2018-09-14 09:56 lokiii 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 二分mid,然后用1~mid的操作在差分序列上加减,最后把差分序列前缀和起来,看是否有有超过初始r值的 线段树,模拟即可,洛谷上会T一个点(开O2能过) 阅读全文
posted @ 2018-09-13 21:54 lokiii 阅读(274) 评论(0) 推荐(0) 编辑
摘要: 和数据备份差不多 设二元组(i,a[i]),开一个大根堆把二元组塞进去,以len排序,每次取出一个二元组 因为单纯的贪心是不行的,所以设计一个“反悔”操作。 记录二元组的前驱pr后继ne,把拿出来的二元组的len加进答案,然后把当前二元组和它的前驱后继当成一个,也就是len[x]=a[pr[x]]+ 阅读全文
posted @ 2018-09-13 21:23 lokiii 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 不难想,就是处理起来比较麻烦 设f[i][j][k]为是否可以把区间(i,j)合并为k,初始状态是f[i][j][s[i]]=1,转移的话另一段枚举长度x,向(i x,j),(i,j+x)转移 把四个字符hash成1234比较好写(大概 cpp include include include usi 阅读全文
posted @ 2018-09-13 20:45 lokiii 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 裸的点分治,运算在模3下进行然后统计答案的时候统计余1的\ 余2的\ 2+余0的^2 cpp include include using namespace std; const int N=20005; int n,h[N],cnt,ans,rt,sum,si[N],hs[N],de[N],t[5 阅读全文
posted @ 2018-09-13 19:25 lokiii 阅读(82) 评论(0) 推荐(0) 编辑
摘要: 二分值mid,然后把 =mid的赋值为1,其他赋值为0,每次排序就是算出区间内01的个数,然后分别把0和1放到连续的一段内,这些都可以用线段树来维护 二分的判断条件是操作完之后q位置上是否为1 cpp include include using namespace std; const int N= 阅读全文
posted @ 2018-09-13 18:53 lokiii 阅读(95) 评论(0) 推荐(0) 编辑
摘要: 很明显的暗示,就是在树的dfs序上维护树状数组,加减的时候差分即可 cpp include include include include using namespace std; const int N=500005; int n,m,h[N],cnt,s[N],top,tot,t[N],fa[N 阅读全文
posted @ 2018-09-13 17:31 lokiii 阅读(125) 评论(0) 推荐(0) 编辑
摘要: ……我真是太非了,自己搞了7个质数都WA,从别人那粘5个质数就A了…… 就是直接枚举解,用裴蜀定理计算是否符合要求,因为这里显然结果很大,所以我们对多个质数取模看最后是不是都为0 cpp include include include include using namespace std; con 阅读全文
posted @ 2018-09-13 17:05 lokiii 阅读(140) 评论(0) 推荐(0) 编辑
摘要: 其实就是 n~n中求选k个不同的数,和为0的方案数 学到了新姿势叫整数划分,具体实现是dp 详见:https://blog.csdn.net/Vmurder/article/details/42551603 设f[i][j]为j个数和为i的方案数,然后因为互不相同,所以转移的话有两种,就是当前j个数 阅读全文
posted @ 2018-09-13 16:48 lokiii 阅读(249) 评论(0) 推荐(0) 编辑
摘要: 处理出一个序列c,a[i] b,c[i]=1;a[i]==b,c[i]=0;a[i] include using namespace std; const int N=200005; int n,a[N],b,w,s[N],mp[N],ans; int read() { int r=0,f=1; c 阅读全文
posted @ 2018-09-13 15:33 lokiii 阅读(120) 评论(0) 推荐(0) 编辑
摘要: 首先很容易计算对于一个如意郎君列表里有x个男性的女性,编号排第i位的男性被选的概率是 $$ p (1 p)^{i 1}+p (1 p)^{i 1+n}+p (1 p)^{i 1+n}+… $$ $$ =p ((1 p)^{i 1}+(1 p)^{i 1+n}+(1 p)^{i 1+n}+…) $$ 阅读全文
posted @ 2018-09-13 15:06 lokiii 阅读(141) 评论(0) 推荐(0) 编辑
摘要: 有趣啊 先spfa分别求出以s1,t1,s2,t2为起点的最短路,然后把在s1 t1或者s2 t2最短路上的边重新建有向图,跑拓扑最长路即可 cpp include include include include include using namespace std; const int N=15 阅读全文
posted @ 2018-09-13 11:44 lokiii 阅读(99) 评论(0) 推荐(0) 编辑
摘要: 合并中间那块的时候没取max……WAWAWA 在线段树上维护一堆东西,分别是len区间长度,sm区间内1的个数,ll0区间从左开始最长连续0,ml0区间中间最长连续0,rl0区间从右开始最长连续0,ll1区间从左开始最长连续1,ml1区间中间最长连续1,rl1区间从右开始最长连续1(起始这六个东西可 阅读全文
posted @ 2018-09-13 11:18 lokiii 阅读(178) 评论(0) 推荐(0) 编辑
摘要: 调死我了…… 首先观察移动方式,需要移动的格子每次移动到相邻格子,一定是先把空白格子挪过去,所以我们得到一种做法,就是bfs预处理出每一个格子的四联通格子之间的空白格子移动距离建边,注意这个移动是不能经过当前枚举的中心格子的,然后把中心格子和它的四联通格子建边权为1的边 注意这里用来建边的点,是(x 阅读全文
posted @ 2018-09-13 09:27 lokiii 阅读(259) 评论(0) 推荐(0) 编辑
摘要: 知道按位贪心但是不知道怎么贪…… 求一个a的异或前缀和s,然后按位从大到小贪心,ans的当前位能为0的条件是s中有 =m个位置这一位为0且没有flag,并且s[n]的这一位为0 如果符合要求,那么把s中这一位不为0的位置都打上flag,表示这些点不能作为区间断点了(如果作为断点的话这一位就要为1了, 阅读全文
posted @ 2018-09-12 20:16 lokiii 阅读(147) 评论(0) 推荐(0) 编辑
上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 29 下一页