08 2019 档案

摘要:题面 裸的树上背包: 设f[u][i]表示在以u为子树的树种选择i条边的最大值,则:f[u][i]=max(f[u][i],f[u][i-j-1]+f[v][k]+u到v的边权); 阅读全文
posted @ 2019-08-31 15:46 神之右大臣 阅读(200) 评论(0) 推荐(0)
摘要:题面 这是一道标准的带反悔贪心; 利用大根堆来维护最大值: 当选择了num[i]后,反悔了,反之选择选了num[i-1]和num[i+1]时获利便增加了num[i-1]+num[i+1]-num[i]。 所以当num[i]被选时,我们就可以删去num[i-1]和num[i+1],并把num[i]改成 阅读全文
posted @ 2019-08-31 14:48 神之右大臣 阅读(334) 评论(0) 推荐(0)
摘要:题面 lcm(x,y)=xy/gcd(x,y) lcm(x1,x2,···,xn)=lcm(lcm(x1,x2,···,xn-1),xn) 阅读全文
posted @ 2019-08-31 13:35 神之右大臣 阅读(314) 评论(0) 推荐(0)
摘要:题面 我来一发很实用的题解;本人想出了O(n)的做法,是一种DP;先说大体思路:答案分两种情况,一种是选择的两段均不跨越n到1(也就是环),另一种是选择的两段跨过了环;如果均不跨越环,那么也就是意味着这是一道模板题;设maxl[i]表示从1~i的最大字串和,maxr[i]表示i~n的最大字段和;很明 阅读全文
posted @ 2019-08-31 13:29 神之右大臣 阅读(414) 评论(2) 推荐(0)
摘要:题面 注意一个细节,查询和更新都需要pushdown(); 阅读全文
posted @ 2019-08-30 16:03 神之右大臣 阅读(239) 评论(0) 推荐(0)
摘要:求1~n的n/i的总和: 我们会发现:总会有很多的(n/l)~(n/r)的值是重复的,所以我们可以寻找这样的区间; 即:n/i=n/(i+d) 我们要干的就是在O(1)的时间复杂度内找出这个d 阅读全文
posted @ 2019-08-30 12:00 神之右大臣 阅读(461) 评论(0) 推荐(0)
摘要:题面 这道题是一道隐藏的比较深的DP(我太蒟蒻了!) 设f[i][j]表示到第i列时高度为j的最少步数是多少; 求上升时的方案就是一个完全背包!,求下降时的方案就是一个01背包; 然后处理边界就能A掉; 阅读全文
posted @ 2019-08-30 11:33 神之右大臣 阅读(233) 评论(0) 推荐(0)
摘要:题面 并查集处理问题的基本思路:如果不是强制在线那么可以倒着处理,把删边改为可爱的加边,然后使用并查集来判断是否联通; 所以可以较为轻松的写出AC代码: 阅读全文
posted @ 2019-08-29 15:24 神之右大臣 阅读(249) 评论(0) 推荐(0)
摘要:题面 一道思维难度不大的状态压缩,也并不卡常,但细节处理要格外注意; f[i][j]表示前i行最后一行状态是j的方案数 阅读全文
posted @ 2019-08-26 15:48 神之右大臣 阅读(201) 评论(0) 推荐(0)
摘要:题面 一个树形DP, f[i]=表示以i为根可以得到的子树个数; 则f[i]*=(f[j]+1); 初始化f[i]=1; ans=sigma(f[i]); 阅读全文
posted @ 2019-08-26 14:00 神之右大臣 阅读(177) 评论(0) 推荐(0)
摘要:题面 挺有意思的。 设f[i]表示gcd(i,j)=i的个数,g[i]表示k|gcd(i,j)的个数; g[i]=(n/i)*(n/i); g[i]=f[i]+f[2i]+f[3i]+...; 所以f[i]=g[i]-f[2i]-f[3i]-f[4i]-...... 阅读全文
posted @ 2019-08-24 15:23 神之右大臣 阅读(133) 评论(0) 推荐(0)
摘要:题面 状态可能不太好想,设f[i][j][k]表示前i行其中有j行是放一个炮,有k行是放两个炮的合法方案数; 那么: f[i+1][j][k]+=f[i][j][k] 在这一行不放任何棋子; f[i+1][j+1][k]+=f[i][j][k]*(m-k-j); 在剩余的m-k-j个空行中随机选择一 阅读全文
posted @ 2019-08-22 20:45 神之右大臣 阅读(236) 评论(0) 推荐(0)
摘要:题面 这道题我觉得是个不错的题; 根据题意可以较清晰的发现ans只和n和k有关;(因为输入的只有这两个数啊~); 那么设f[i][j]表示前i层用了j个节点的方案数,g[i][j]表示深度小于等于i并且用了j个节点的方案数总和; 对于一颗树,可以把它分成3部分:根节点,左字树,右子树; 对于一颗深度 阅读全文
posted @ 2019-08-22 19:58 神之右大臣 阅读(211) 评论(0) 推荐(0)
摘要:题面 设f[i][j][k][l]为从小渊传到小轩的纸条到达(i,j),从小轩传给小渊的纸条到达(k,l)的路径上取得的最大的好心程度和。 f[i][j][k][l]=max( f[i][j-1][k-1][l] , f[i-1][j][k][l-1] , f[i][j-1][k][l-1] , f 阅读全文
posted @ 2019-08-22 18:53 神之右大臣 阅读(274) 评论(0) 推荐(0)
摘要:题面 对于m==1和m==2两种状态进行不同的dp; 设sum[i][1]表示第一列的前缀和,sum[i][2]表示第二列的前缀和; sum[i][1]=sum[i-1][1]+a[i][1]; sum[i][2]=sum[i-1][2]+a[i][2]; 当m=1时, 设f[i][j]表示前i个数 阅读全文
posted @ 2019-08-22 17:21 神之右大臣 阅读(244) 评论(0) 推荐(0)
摘要:题面 大家都是两遍SPFA吗?我这里就一遍dp啊; 首先判断对于一个点u,是否可以从一号点走到这里,并且可以从u走到n号点; 对于这样的点我们打上标记; 那么抛出水晶球的点一定是从打上标记的点中选出一个;(自己可以理解一下) 然后跑一遍dp,dp[i]表示从点1到点i的若干条路径中,所经过的点的权值 阅读全文
posted @ 2019-08-21 15:58 神之右大臣 阅读(167) 评论(0) 推荐(0)
摘要:题面 先反向建边,这样以t为源点一遍bfs即可判断出哪个点不可以到达t点; 然后正向建边,以s为源点再一遍bfs计算距离;对于一个点u枚举其叶子结点v来判断u的子节点是否可以直接或间接到达t; 阅读全文
posted @ 2019-08-20 19:07 神之右大臣 阅读(163) 评论(0) 推荐(0)
摘要:题面 提前知识:gcd(a/d,b/d)*d=gcd(a,b); lcm(a,b)=a*b/gcd(a,b); 那么可以比较轻松的算出:gcd(x/a1,a0/a1)==gcd(b1/b0,b1/x)==1; 那么我们求解的x仅仅从b1的因数中挑选就可以,x要符合以上条件且x%a1==0; 时间复杂 阅读全文
posted @ 2019-08-20 17:37 神之右大臣 阅读(173) 评论(0) 推荐(0)
摘要:题面 这道题可以分成两部分来处理; 第一部分: 设f[i][j]表示右下角以(i,j)结尾的最大正方形的边长。 显然f[i][j]=min(f[i][j-1],f[i-1][j-1],f[i-1][j])+1 第二部分: 可以使用悬线法进行解决。 定义: 有效竖线:除了两个端点外,不覆盖任何障碍点的 阅读全文
posted @ 2019-08-15 15:01 神之右大臣 阅读(156) 评论(0) 推荐(0)
摘要:题面 奇数+奇数一定不是质数(1+1除外),偶数+偶数一定不是质数,质数只可能出现在偶数+奇数中 把所有的点排成两列,权值为奇数的点在左边,权值为偶数的在右边 如果左边的点x+右边的点y是质数,我们就连一条x->y的边 最后答案显然是最大独立集=n-最小点覆盖=n-最大匹配数 由于1比较特殊,考虑到 阅读全文
posted @ 2019-08-15 14:27 神之右大臣 阅读(215) 评论(0) 推荐(0)
摘要:题面 按照常见树形背包定义状态:设dp[u][j]表示在以u为根的子树中,选择j个客户所能获得的最大收益。 状态转移:dp[u][j]=max(dp[u][j-k],dp[v][k]-w(u,v)); 注意因为二维的是滚动数组,所以应该倒着循环。 阅读全文
posted @ 2019-08-14 13:37 神之右大臣 阅读(373) 评论(0) 推荐(0)
摘要:题面 对于“n个物品选任意个”我们就可以想到一种递推方法,即设f[i][j]表示前i个物品选j个的最大收益 我们发现正着转移并不好转移,我们可以倒着转移,使选择的当前第i号物品为第一个物品,这样的话我们就发现这个物品对答案做的贡献就变成了a[i].w−a[i].r∗(j−1),于是写出转移方程: f 阅读全文
posted @ 2019-08-14 12:03 神之右大臣 阅读(158) 评论(0) 推荐(0)
摘要:题面 这道题好狗的说,数组开大一点会MLE掉,开少一点会RE掉~; 下面是正解: 我们设计状态:f[i][j][k][now]四维DP 第一维和第二维(i,j)表示处于矩阵的(i,j)处(最后的结尾是(i,j)); 第三维k表示小A瓶中的值-小uim瓶中的值。(可以利用神奇的取模运算来使其是正数); 阅读全文
posted @ 2019-08-13 15:09 神之右大臣 阅读(141) 评论(0) 推荐(0)
摘要:题面 很简单的一个二维DP f[i][j]表示最后吃到(i,j)所能获得的最大值, 那么f[i][j]=max(f[i+1][j-1],f[i+1][j],f[i+1][j+1])+a[i][j]; 注意f要初始化为负无穷大; 阅读全文
posted @ 2019-08-13 14:16 神之右大臣 阅读(158) 评论(0) 推荐(0)
摘要:题面 用一个单调递减队列来维护一个区间,单调队列的头就是该区间的最大值; 因为在该数前面进队的数如果比后进的数要小就说明了前面进队的数绝对不会影响答案。 阅读全文
posted @ 2019-08-13 13:58 神之右大臣 阅读(273) 评论(0) 推荐(0)
摘要:题面 离线处理;大体思路就是将数组排序,然后对于第k次询问把不可行的数打上标记,然后从头开始寻找第k个没打标记的点的值(排序后的数组保证了它是第k小的)。实现方法:首先离散化原始数组,得到数组find[],find[i]=j表示原位置为i的数从小到大排序后的位置是j。a[]数组表示原数组,b[]数组 阅读全文
posted @ 2019-08-12 15:55 神之右大臣 阅读(244) 评论(0) 推荐(0)
摘要:题面 这道题虽然是练习匈牙利算法的,但可以用网络流来切掉它; 我们可以建立一个超级源和一个超级汇,超级源连接左部分点,超级汇连接右部分点; 然后在该图上跑最大流就可以了; PS:我设的超级源是2001,超级汇是2002; 阅读全文
posted @ 2019-08-10 14:48 神之右大臣 阅读(160) 评论(0) 推荐(0)
摘要:题面: 割点性质: 节点 u 如果是割点,当且仅当存在 u 的一个子树,子树中没有连向 u 的祖先的边(返祖边)。 换句话说,如果对于一个点u,它的子节点是v,如果low[v]>=dfn[u],就代表u的子图中没有返祖边,即该节点u是割点; #include <bits/stdc++.h> usin 阅读全文
posted @ 2019-08-10 13:38 神之右大臣 阅读(241) 评论(0) 推荐(0)
摘要:题面 这道题就是标准的堆优化dijkstra; 注意堆优化的dijkstra在出队时判断vis,而不是在更新时判断vis 阅读全文
posted @ 2019-08-10 13:08 神之右大臣 阅读(266) 评论(0) 推荐(1)
摘要:这道题的难度应该达到普及+了吧我太蒟蒻了其实做完这道题后仔细想一想发现了一种神奇的问题:计算机好笨啊!!!Q:为什么?A:你想啊,计算机没有自己的思想,一直被人牵着鼻子走,这难道不笨吗?Q:蛤?什么意思?A:题目虽然说计算机会破坏人类的选择,但实际上人类一直选择数值最优的那一对的其中一个,那么计算机 阅读全文
posted @ 2019-08-09 15:13 神之右大臣 阅读(166) 评论(0) 推荐(0)
摘要:题面 本题是一道有向图博弈问题: 该题便是著名的巴什博弈; 我们可以发现,当n=0的时候后手必胜(设其为P态),n=1~m这几种状态由于先手可以一次全部取完导致先手必胜(设其为N态)。 接着当n=m+1时,因为先手无论取走几个都会使后手一次全部取走导致后手必胜; 接着当n=m+2~2*m时,因为先手 阅读全文
posted @ 2019-08-09 14:10 神之右大臣 阅读(199) 评论(0) 推荐(0)
摘要:题面 因为 n=lcm(a,b)n = lcm(a, b)n=lcm(a,b) ,可以得出: a 和 b 的质因数都是 n 的质因数 对于 n 的每个质因数 x ,在 n 中的次数为 y ,那么 x 在 a 和 b 中至少有一个次数为 y,在另一个中的次数 <=y。 所以我们只要把 n 的每个质因数 阅读全文
posted @ 2019-08-08 11:54 神之右大臣 阅读(197) 评论(0) 推荐(0)
摘要:题面 本题其实主要就这几点: 1.离线,以右端点排序(从小到大); 2.建立树状数组c[],c[i]表示从1~i中有多少种不同的数字; 3.对于每次查询的答案就是sum(r)-sum(l-1); 4.由于问题是离线排序回答,所以应该注意输出顺序(离散化前的顺序); Q:直接统计前缀和,然后对于每次询 阅读全文
posted @ 2019-08-08 11:50 神之右大臣 阅读(212) 评论(0) 推荐(0)
摘要:就是一个模板,不多说别的了。 阅读全文
posted @ 2019-08-08 09:58 神之右大臣 阅读(384) 评论(0) 推荐(0)
摘要:注意,是自动AC机,并不是AC自动机!(没事做了一个很好玩的东西) 好孩子请自觉不要阅读本文章; 亲测对于lemon,cena好使; 阅读全文
posted @ 2019-08-08 09:57 神之右大臣 阅读(790) 评论(0) 推荐(2)
摘要:题面 给大家普及一个知识,只要看到最大值最小或最小值最大等字样就往二分上想吧!然后是正解部分: 我们可以二分答案; 对于每次二分的区间取中间值mid,并对其进行check()判断; 如果所有段的最大值为mid时可以分成m段(注意,如果此时分成的段比m还小,那么也是可行的,因为你可以随便拆拆就能拆成m 阅读全文
posted @ 2019-08-08 09:30 神之右大臣 阅读(320) 评论(0) 推荐(0)
摘要:题面 首先你需要知道这条定理: C(n,m)=C(n%p,m%p)*C(n/p,m/p); 这样可以递归实现; 注意坑点:是C(n+m,m),并不是C(n,m); 阅读全文
posted @ 2019-08-07 14:11 神之右大臣 阅读(182) 评论(0) 推荐(0)
摘要:题面 本题的难度其实不及紫题的难度。主要是在hash时的处理细节比较繁琐; 首先是树hash的模板: 对于无根树在数据不多的时候可以依次枚举每个点当根时的根节点的hash值,然后将这些树上hash值变为一组数的hash值; 然后n^2比较每棵树的线性hash值就可以了; 阅读全文
posted @ 2019-08-07 13:48 神之右大臣 阅读(294) 评论(0) 推荐(0)
摘要:题面 这道题竟然是E?还是洛谷中的黑题? wow~!! 于是就做了一下; 然后一下就A了;(这并不代表想的容易,而是写的容易) 这道题就是骗人的!! 什么manacher,什么回文自动机,去靠一边站着,看我的无敌大模拟! 可以设定l,r两个点,初始时分别指向1和n; 如果是s[l]==s[r],那么 阅读全文
posted @ 2019-08-03 16:31 神之右大臣 阅读(271) 评论(0) 推荐(0)
摘要:题面 本题是一道区间最大公约数的模板题; 如果N^2暴力的话当然会超时,所以我们要发掘出区间gcd的特点; 设gcd[i]表示区间[1,i]的最大公约数; 我们可以发现,从一个点i到1之间的所有区间的gcd均满足gcd[j]=GCD(gcd[j-1],a[j]); 由于gcd的性质,所以gcd[]是 阅读全文
posted @ 2019-08-03 16:01 神之右大臣 阅读(117) 评论(0) 推荐(0)
摘要:题面 这题好水的说~很明显就是主席树的大板子 然而我交了3遍才调完所有的BUG,开好足够的数组,卡掉大大的常数; 针对与每次操作,change()会创建新节点,而ask()虽然也会更新左右儿子的节点编号,但并不会创建除根节点以外的点; 处理好以上change()和ask()的细节就可以轻松地切掉这道 阅读全文
posted @ 2019-08-02 20:45 神之右大臣 阅读(109) 评论(0) 推荐(0)
摘要:题面 啊~,很水的一道trie树模板题; 当两个串存在关系时情况有两种: 若当前串插入后没有任何新建节点,则该串肯定是之前插入的某个串的前缀; 若在插入的时候,有某个经过的节点带有某串结尾的标记,则之前插入的某个串是当前串的; 阅读全文
posted @ 2019-08-02 17:05 神之右大臣 阅读(179) 评论(0) 推荐(0)
摘要:NO.10: 循环展开: 在缓存和寄存器允许的情况下一条语句内大量的展开运算会刺激 CPU 并发(蛤?这是个什么原理,算了,反正写了没坏处就这么写吧) NO.9: 特殊运算优化:(或许这真的没用) 取模优化: 绝对值优化: NO.8: 前置++/--运算符:(有利无弊) NO.7: if()else 阅读全文
posted @ 2019-08-02 16:22 神之右大臣 阅读(1415) 评论(1) 推荐(3)
摘要:题面 本题随便看两眼就知道该题满足了优美的查分性质; 对于在区间[x,y]内操作时,应该将查分数组的第x项和第y+1项进行相反操作; 询问答案时,问第i个数的值就是查分数组的前i项和; 暴力+玄学卡常可以A掉数据十分水的数据; 正解是求前i项和的时候用树状数组来维护; 阅读全文
posted @ 2019-08-02 15:32 神之右大臣 阅读(169) 评论(0) 推荐(0)
摘要:对于一个数列a[],比如说:5 3 4 2 1; 我们可以将其离散化成b[],先在位置5加1,然后在位置3加1,然后在位置4加1,以此类推; 当在一个位置x加1时,b[]中已经加完的的值保证了其l<r; 那么如何统计a[l]>a[r]的个数呢? 这个个数就是sum(b[1]~b[x]); 到这里求得 阅读全文
posted @ 2019-08-01 20:48 神之右大臣 阅读(133) 评论(0) 推荐(0)
摘要:题面 1. 图书馆馆长的考验(library) 红魔馆的拥有者蕾米莉亚的好友帕秋莉是红魔馆的大图书馆的馆长。擅长操纵五行,名言是“万物都有属性。所谓的属性,和弱点是一样的”。 一天,因为魔理沙看了神之右大臣的视频却不投硬币不点收藏不加关注导致受到了幽幽子的追杀。在博丽灵梦的引荐下,魔理沙来到红魔馆去 阅读全文
posted @ 2019-08-01 10:38 神之右大臣 阅读(415) 评论(0) 推荐(0)
摘要:“疲劳”传说 (legend.pas/c/cpp) 【题目描述】 炉石传说:魔兽英雄传是一款由暴雪开发的非常流行的游戏。这个问题建立在这个游戏的基础上,但是即使你不知道这个游戏,你也能非常轻松的解决这个问题。 每一局游戏是两个对手1v1的比赛。炉石传说的游戏方式是回合制,每个玩家轮流打出自己手中的牌 阅读全文
posted @ 2019-08-01 10:27 神之右大臣 阅读(305) 评论(0) 推荐(0)
摘要:题面 这道题的数据范围一看就是dfs或状压啦~ 本文以状压的方式来讲解 f[i][j]表示目前的节点是i,已经经历过的节点的状态为j的简单环的个数; 具体的转移方程和细节请看代码; PS:(i&-i)的意义便是树状数组 阅读全文
posted @ 2019-08-01 08:56 神之右大臣 阅读(166) 评论(0) 推荐(0)