往日回忆
再也不打啦
爱喝可乐的HCHO
这个作者很懒,什么都没留下…
展开
-
稳蓝冲紫之——做过的题也能忘」」」」Equalizing by Division (hard version)
题目如题这样,一开始想着啪啦啪啦用map然后各种秀操作,放了两三天一直不敢动手,发给队友后:然后就emmm然后发现这题emm,是第二次打cf的场。。。= =那时候菜到这题看了看题解,然后就点开了之前的代码不到一秒,看了行数。。。那好好想想,纸笔上来Orz…,然后就巴拉巴拉各种,发现诶,排序之后,越大的数字到越小的数字的操作次数会越来越大,然后palapala那就一个数组放数字个数,一个数组放操作数,然后就过了emmm…啊啊啊啊啊思维题,干嘛想成码力题。。。。所以做题还是不能看题解啊啊啊啊Orz原创 2020-07-10 11:50:13 · 137 阅读 · 0 评论 -
HDU - 4641 K-string(SAM,后缀自动机)
题目大意:先给一个串,然后有多次操作,每次可以+一个字符,或者查询超过k次的子串。很明显,+一个字符的操作是有后缀自动机的感觉,但是需要在线查询且复杂度不能太高,这时候就需要边+边维护答案。设置一个cut数组,由于后缀自动机的fa指向的是该状态前面的后缀,由于数据太少,我们可以每次累加cnt,向fa指的方向跑,要注意判断的是重复计算的问题,如果大于k次我们是一定不要再次进行计算的了。还有新建结点的时候数据的转移…只要大于k说明其状态的子串够格可以累加了。也就有no[now].len-no[no[now]原创 2020-07-09 00:04:20 · 125 阅读 · 0 评论 -
Loli, Yen-Jen, and a cool problem(广义后缀自动机,裸题)
题意:给一颗字符串树,求从哪个结点向上L长度的字符串出现了多少次题目链接诶,感觉也没什么好讲的。可记下一个特性:求一个状态向前长度为L的出现次数不需要跑自动机,只需要跳fa结点,跳到其fa<L就可以,直接cnt[p],因为拓扑排序已经将cnt计算出来了。#include<bits/stdc++.h>using namespace std;const int maxn=6e5+10;struct node{ int fa,ch[26],len;}no[maxn];原创 2020-07-10 10:53:57 · 731 阅读 · 1 评论 -
Tree (树形dp,换根,逆元)
联通点集如何计算,我们求dp[u]为该子树的联通集个数有:dp[u]=∏v(dp[v]+1)dp[u]=\prod_v(dp[v]+1)dp[u]=∏v(dp[v]+1)那么先求一次dfs求得每个字数的dp值,之后我们需要有一个数组存放其结点向上的一个贡献有demo[u]=ans[f]/(dp[u]+1)demo[u]=ans[f]/(dp[u]+1)demo[u]=ans[f]/(dp[u]+1)。换根的思想。ans的答案为ans[u]=(demo[u]+1)∗dp[u]ans[u]=(demo[u].原创 2020-07-09 15:17:02 · 163 阅读 · 0 评论 -
Resource Archiver HDU - 3247(ac自动机+TSP+BFS)
题意:给多个字符串然后和病毒串,求一个最小串包含全部字符串,但没有病毒串。这题一开始看了下数据范围,时间10秒,诶,n<=10,状压待定。有两种串,那么我们都读进去,存上模式串在自动机上的位置,每次跑bfs,不经过病毒串,之后就嘿嘿嘿得到一个dis数组,之后有距离+有状压=TSP= =#include<bits/stdc++.h>using namespace std;const int maxn=2e5+10;map<int,int> mp;int dis[1原创 2020-07-10 16:29:02 · 349 阅读 · 1 评论 -
2020牛客暑假多校第二场A. All with Pairs(ac自动机+kmp)
题目链接不看代码:树状数组+dfs序列ORdfs维护子树大小(这个子树大小指的是叶子节点个数),对于一个ac自动机来说,建fail后,其父节点状态为子节点状态的后缀。反过来说,当前结点的子树大小为拥有该后缀的字符串个数。所以把所有串丢到ac自动机,计算每个子树大小。对于aaabbb,我们跑ac自动机,之后计算每个状态其子树的贡献。具体细节可以想想。主要是这个去重,这个我没想出kmp来搞。例如aaaaa和baaaa,如果能匹配就是aaaaa和baaaa。按着上面的方法跑了前4个贡献是a,aa,aaa原创 2020-07-15 15:32:35 · 220 阅读 · 0 评论 -
Drainage Ditches POJ - 1273
网络流板子题:贴下dinic的板子吧,原理直接百度博客就可以知道了#include<iostream>#include<cstring>#include<queue>#include<cstdio>using namespace std;const int N=200006;const int maxn=200006;int cost[N];int head[maxn];struct edge{ int v,nxt,w;}e[原创 2020-07-16 11:50:49 · 103 阅读 · 0 评论 -
CF稳蓝上紫之_Paint the Digits CodeForces - 1209C
题意: 染色,如何使得,1和2部分连接起来为上升序列,看数据能想到枚举0到9,但emmm卡在了处理问题,之后知道可以枚举就瞎写判断a了。要大胆些emmm,应该20分钟搞定的害…#include<bits/stdc++.h>using namespace std;const int maxn=3e5+10;int sum[maxn];int a[maxn];int dp[maxn];int h[maxn];char ans[maxn];int n;bool check(in原创 2020-07-09 10:56:46 · 280 阅读 · 0 评论 -
力扣第165场周赛
作者:HCHO来源公众号:甲醛实验室第一题A 和 B 在一个 3 x 3 的网格上玩井字棋。井字棋游戏的规则如下:玩家轮流将棋子放在空方格 (" ") 上。第一个玩家 A 总是用 “X” 作为棋子,而第二个玩家 B 总是用 “O” 作为棋子。“X” 和 “O” 只能放在空方格中,而不能放在已经被占用的方格上。只要有 3 个相同的(非空)棋子排成一条直线(行、列、对角线)时,游戏结束。如果...原创 2019-12-02 14:20:29 · 341 阅读 · 0 评论 -
每日dp(E. Increasing Frequency)最大子数组和
题目链接:我好菜啊给你一个队列,可以进行一次操作:选择一个区间对其中全部元素+k(k是整数)。要求使得最后队列中为c的个数最多是多少?对于这种区间操作问题而且又涉及到全部可以考虑双指针?类似于对于同一个数字。最优的操作一定是两个相同的数字之间的全部数字进行操作,所以显然要计算如果对这些数字进行操作后对全部的贡献,可以知道操作后的贡献为2-...原创 2020-08-05 11:13:47 · 239 阅读 · 0 评论 -
每日dp,啊这去掉思维就是01水题
入口题目:给你2*n的数组。构造两个n的数组,使得两个数组可以按着前面小的先排列构造一个成2*n的数组。如上所示,2314由31和24构成,2和3出2,3和4出3,4和1出1,最后4。可以发现,需要后面的数要是比前小,一定是不可能放到别的队列里的,所以统计背包的物品个数就为一段连续的,且第一个数字最大的序列的个数,然后就上代码。#include<bits/stdc++.h>using namespace std;struct node{ int l,r;原创 2020-07-23 00:26:17 · 99 阅读 · 0 评论 -
Largest Common Submatrix(每日dp(划)每日一题)
给两个矩阵,其中数字由1到n*m,求两个矩阵的公共最大矩阵。。。啊啊啊啊我好菜#include<bits/stdc++.h>using namespace std;char str[1005];int dp[1005][1005];int a[1005][1005];int b[1006][1006];int sum[1006][1006];int len[1006][1006];struct MP{ int x,y;}mp[1005*1005];int原创 2020-07-11 11:19:17 · 216 阅读 · 0 评论 -
Two Strings CodeForces - 223B每日dp(划),每日思维*
题意:我也是看别人的题意得诶。给两个字符串,S,T,求多次T中的序列能不能覆盖掉S。一开始想不到。跑完步回来洗澡后就想到了维护最右的点,然后balabala,wa25,wa27。看看一开始的代码吧#include<bits/stdc++.h>using namespace std;char str[1005];int dp[30];int main(){ string a,b; cin>>a>>b; map<char,i原创 2020-07-10 22:21:04 · 253 阅读 · 0 评论 -
每日dpPawn CodeForces - 41D
可以跳左上或者跳右上,注意k范围比较小,所以开3维dp搞搞就ok啦。要注意的是%(k+1)而不是(k),记录路径套路(开个数组)一下,还有就是答案可能是零,所以ans初始化不要是0…#include<bits/stdc++.h>using namespace std;const int maxn=1e6+10;int dp[105][105][11];int path[105][105][11];int tu[105][105];int main(){ int .原创 2020-07-09 18:16:30 · 185 阅读 · 0 评论 -
Towers CodeForces - 229D(每日DP)*
题意:给你一排的塔,可以一座塔可以叠在他的左边和右边。,求变成LCS的最小操作。一开始看到数据以为要O(N)好吧其实5000可以On。。。其他塔向左还是向右这没区别我们用dp[i]来表示到这个塔的最小操作,每次操作是一个区间需要的次数就是i-j-1这下直接两个for可以了。但是有一个情况是操作后塔高要如何处理= =,然鹅有些题解直接开了一个数组存放最小的塔高(解锁新操作),就这样直接搞满足区间累加高度本来高度以及操作后的最小塔高就可以了。#include<bits/stdc++.h>原创 2020-07-09 08:42:25 · 203 阅读 · 0 评论