- 博客(26)
- 资源 (1)
- 收藏
- 关注
原创 后缀自动机SAM题目总结
Hihocoder我的入门SAM后缀自动机一·基本概念题意 从零开始学习SAM入门,讲的非常好思路 仔细阅读题目理解SAM各种性质我的入门代码后缀自动机二·重复旋律5(入门题)题意 求整个串中本质不同子串个数(本质不同:两个串的长度或内容有差异) ∣S∣≤105|S|\le 10^5∣S∣≤105思路 对原串构造SAM, ans=∑i∈[1,cnt]mxl[i]...
2019-04-03 22:22:30 736
原创 简单遗传算法SGA及完整代码实现
简单遗传算法(Simple Genetic Algorithm, SGA)分为7个主要步骤:编码-随机产生初始个体-计算适应度函数-选择概率-交叉操作-编译操作-判断终止条件。
2023-04-28 15:59:18 648
原创 Codeforces 1534E Lost Array 交互题
主要算法:BFS或DP随便试试,可以发现,是哪些数字所组成的xor-sum其实无所谓,主要是组成xor-sum的个数是关键,所以可以用集合的思想两个xor-sum集合 SSS 和 TTT 中元素做XOR运算= SSS 和 TTT 的对称差= SΔTS\Delta TSΔT = (S\T)∪(T\S)=(S∪T)\(S∪T)(S\backslash T)\cup(T\backslash S)=(S\cup T)\backslash (S\cup T)(S\T)∪(T\S)=(S∪T)\(S∪T)考虑用f
2021-06-16 17:31:53 281
原创 ACM刷题
由于是直接从txt文本中直接copy过来的,故没有使用latex编写公式参考《挑战程序设计》ACM problem list✗:还未完成✓:已完成☆:有部分思路★:完全没思路Dynamic Program基础题POJ 3176: Cow Bowling ✓dp[i][j]为坐标(i,j)的最长路径dp[i][j]=max{dp[i-1][j],dp[i-1][j-1]}+a[i][j]POJ 2229: Sumsets ✓ ★法1完全背包思路考虑有20个物品,重量分别是2^0,
2021-06-10 19:31:24 265
原创 CSP202012-4 食材运输 树状DP+状压DP
传送门题意:一个有 n(n≤100)n(n\le 100)n(n≤100) 个节点的树,每条边有边权。一共有 k(k≤10)k(k\le 10)k(k≤10) 种不同的需求,树上每个节点可能拥有多种需求,又有 kkk 辆车,运输这 kkk 种需求到树上每个点去,每辆车的起始点可以自由选择,但总共不能超过 m(m≤k)m(m\le k)m(m≤k) 个。所有车辆同一时间从起始点出发,直到所有车辆全部运输完所有节点后结束,运输时间为该车辆走过路径的边权之和,记一个方案的总运输时间为该方案中运输时间最长的车所
2021-03-21 17:36:34 2058
原创 Streaming_4_noip_day2 距离统计 (本原解,勾股数,欧拉筛)
Streaming_4_noip_day2 距离统计 (本原解,欧拉筛)数据题意:给出n∗mn*mn∗m的点阵,有T组数据,对于每一组数据给出一个长度l,有多少对点阵上的点能构成长度为l的线段。n,m≤109,T≤1e3,l∈[1,2max(n,m)]n, m\le 10^9,T\le 1e3,l\in [1,2max(n,m)]n,m≤109,T≤1e3,l∈[1,2max(n,m)]思路:只需要求解有多少对正整数a,b满足a2+b2=l2a^2+b^2=l^2a2+b2=l2。该方程的解至少是一
2020-10-21 20:45:00 218 1
原创 区间众数,强制在线 [分块]
区间众数先离散化数据,将每个数据都放到对应的桶里(vector),并记下排名。再预处理一个cnt[i][j]表示第i个块到第j个块中的众数是多少,同时也可以记下众数是什么。对于每一个[l,r],ans开始是cnt[bel[l]+1][bel[r]-1]为中间块的众数。对于左边上的数字,在其对应的vector中找从他开始往后ans个数的位置是否<=r(首先要保证有后ans个数),如果...
2019-04-01 19:02:16 1031
原创 51nod 1600 Simple KMP [SAM+LCT或树链剖分] 思维好题
1600 Simple KMP题意非常难理解,读懂题,画图后发现要求的就是每次增加一个字符后当前所有后缀的匹配个数关于证明可以看程序下面由于可以直接跳prt树,但是是O(n2)O(n^2)O(n2)的,由于数据太水可以混过去如果要动态做就是要将每次Extend的时候都更新prt树上一整条链上的所有点,i节点加上mxl[i]-mxl[pre[i]]这个动态操作可以用LCT做,但感觉太麻烦写...
2019-03-27 21:27:57 214
原创 虚树dp 建树过程
问题引入在一类树上动态规划问题中,题目给出的询问往往包含树上的很多各节点,并保证总的点数规模小于某个值.如果我们直接在整颗树上进行dp的话,时间复杂度与询问的次数有关,这显然是不可接受的,如果我们可以找到一种动态规划的方法,使其时间复杂度与询问中点的实际规模相关就好了.虚树虚树即是一颗虚拟构建的一棵树,这个树只包含关键点(一般就是题目给出的点)以及关键lca的点,而其他不影响虚树结构的点和...
2019-03-22 19:58:06 483
原创 bzoj4642 泡泡 set维护扫描线
题意在二维平面上有很多个互不重叠、相交、包含的圆。求出有多少个切点。思路考虑用到扫描线,将每个圆的x轴坐标作为排序关键,每个圆只在插入和弹出时对答案产生贡献,每个圆的左端点为插入记为type1,右端点为弹出记为type0。当扫描线扫到一个新的event时当插入一个圆时,这个圆和其他在扫描线上(扫描线当前穿过的圆可能会相切,而且相切一定是离y坐标最近的两个圆,所以只用枚举2个圆当弹出一个...
2019-03-22 18:43:05 259
转载 BSGS & EXBSGS简要
BSGSBSGS主要用于求解形如xk=y(modp)x^k=y\pmod pxk=y(modp)(注意这里p和x互质)这样的方程的最小正整数解得问题设m=⌈p⌉,k=am−b,a∈[1,m],b∈[0,m)m=\lceil\sqrt p\rceil,k=am-b,a\in[1,m],b\in[0,m)m=⌈p⌉,k=am−b,a∈[1,m],b∈[0,m)那么上面的方程可以变形成xam=yx...
2019-03-21 21:21:14 173
原创 [WC2013]糖果公园 树上带修莫队
http://uoj.ac/problem/58https://www.luogu.org/problemnew/show/P4074仔细阅读题目后,发现就是树上带修莫队裸题,add时ans+=Wt∗Vians+=W_t*V_ians+=Wt∗Videl时ans−=Wt∗Vians-=W_t*V_ians−=Wt∗Vi然后直接打了,就1A了#include <bits/s...
2019-03-21 21:07:24 126
原创 嘿嘿嘿嘿的 zy 树链剖分+线段树+树上带修莫队
题意给一颗 n 个点的树,每一个点有一个颜色,然后维护几个操作。操作 1:t=1 时,将 x 点的颜色修改为 y操作 2:t=2 时,询问 x 到 y 路径上有多少个不同的颜色段操作 3:t=3 时,询问 x 到 y 路径上的出现次数最多的颜色的出现次数操作2是[SDOI2011]染色原题操作3是树上带修莫队,关于如何求出出现次数最多的颜色出现次数,考虑到时莫队做法,一次只能+1或-1...
2019-03-21 19:44:42 521
原创 SubString SAM+LCT
P5212 SubString题意给出字符串S和操作次数QADD:往S后继续加一个字符串QUERY:求给出的字符串在S中出现次数考虑SAM,插入是O(n)的,查询位置时O(n)的,问题是怎么动态维护出sz[],sz[]其实就是在后缀树上u节点子树中结束节点的个数和。考虑到要动态加边,删边,求子树和,可以用LCT维护。每个np(新加节点)将其到根节点的路径上都加上1就行了。查询直接spl...
2019-03-20 21:21:15 230
原创 [SHOI2007]园丁的烦恼 CDQ三维偏序
[SHOI2007]园丁的烦恼题意:平面图上有n个点,m次询问,每次询问一个二维区间中包含了多少点。使用CDQ三维偏序,第一维是时间,第二维是x坐标,第三维是y坐标。时间开始就已经排好,x坐标是CDQ排序关键,y坐标可以用树状数组计算前缀。注意:1、树状数组update和clean开始不能是02、ask数组大小开为5倍大小N+M*4#include <bits/stdc++.h...
2019-03-18 18:39:19 196
原创 树的双直径 (树形dp,两条不相交链边权和的乘积最大)
树的双直径题意给一个n个节点的树,每条边都有权值,求出两条不相交链边权和的乘积最大数据范围: n≤4⋅105∣ci∣≤109n\le 4\cdot 10^5\quad \left | c_i \right|\le10^9n≤4⋅105∣ci∣≤109ps:51nod支持int128,边权可能为负只有ans需要__int128,其他的都可以开long long先用dfs求出每个节点,由...
2019-03-17 18:07:19 783
原创 [FJOI2015]火星商店问题 线段树分治
这道题的每个询问都有两个区间,一个是时间区间,一个是商店编号区间。每个购买也是和时间商店编号有关。如何让这两个参数联系起来,就需要用到线段树表示时间区间。线段树可以把时间区间分细。对于每一个询问,它都有一个时间区间[cnt1−d+1,cnt1][cnt_1-d+1,cnt_1][cnt1−d+1,cnt1](t为当前询问时间,d为询问中向前延长的时间)都要放到线段树上的节点上的vector...
2019-03-17 17:27:45 303
原创 [NOI2014]魔法森林 LCT维护动态最小生成树
P2387 [NOI2014]魔法森林题意:一个无向图,每个点都有两个权值a和b,要求一条1-n路径上,a和b的路径最大值的和最小此题因为有两个关键字,如果只有一个关键字,那就是最小生成树,对于两个关键字,可以先对a从小到大排序,然后把边看做一个点,在lct上把这条边对应的点和其在原图上所连的两个点link起来,前提是他们不能再一个树中,如果在一棵树中,肯定回成环,这是不允许的,所以要截断这个...
2019-03-15 18:38:38 253
原创 二维矩阵 动态求最小和求和问题 分块+线段树乱搞
对于列,直接分块,用线段树维护纵坐标时间复杂度O(nlog2W+mWlog2W)O(nlog_2W+m\sqrt Wlog_2W)O(nlog2W+mWlog2W)n个查询操作,m个修改单点操作当修改操作十分稀疏时候,我们可以给线段树加上lazy优化,对于一个size只有1的子树,我们可以不用建出来,而是把要建的节点保存在该点。优化可以直接过 [BOI2007]Mokia 摩基亚#...
2019-03-13 21:53:34 332
原创 [AHOI2009]中国象棋 状压dp 状态新颖
看了题后,可以发现一行最多两个炮,一列最多两个炮。做状压dp一般都是枚举行来做,所以一行两炮可以在一次for中枚举出来,但列上炮的数量不好计算。看了dalao的题解,发现状态这样设置dp[i][j][k]dp[i][j][k]dp[i][j][k],iii代表枚举的行数,jjj代表有jjj有1个棋子,kkk表示有kkk列有两个棋子于是状态转移有不放放一个在:无棋子的列上(乘上没有棋子的...
2019-03-13 16:46:29 133
原创 poj 1038 Bugs Integrated, Inc.三进制状压dp
http://poj.org/problem?id=1038这题废了我n长时间先把图片旋转下M为横轴N为纵轴发现题目要求放2x3的方块,所以至少要存三行的状态,考虑三进制状压。讨论状态对于(x,y)(x,y)(x,y)每一个三进制为0:(x,y),(x,y−1)0:(x,y),(x,y-1)0:(x,y),(x,y−1)都没有被占用1:(x,y)1:(x,y)1:(x,y)没有占用...
2019-03-11 19:32:58 200
原创 Mondriaan's Dream 状压dp入门
http://poj.org/problem?id=2411#include <cstdio>#include <cstring>#define LL long longusing namespace std;inline void read(int &x){ x = 0; int f = 1; char ch = getchar(); w...
2019-03-11 08:05:48 161
原创 多重背包二进制写法
for (j = 1; j * a[i] <= m && j <= x; x -= j, j *= 2) b[++tot] = j * a[i];if (x) b[++tot] = x * a[i];x为物品价格为a[i]个数,方法就是把x拆为多个二进制,从而能组成1…n的所有数字例如x=101001101001000101这些分出来的数字和一定...
2019-03-07 20:48:07 219
原创 「雅礼集训 2017 Day7」事情的相似度 SAM+LCT+SEG
https://loj.ac/problem/6041题意:给出一个01串,求出结束点在[l,r][l,r][l,r]的两个前缀的最长公共后缀长度i,ji, ji,j 表示原字符串上位置, pos[]pos[]pos[] 表示在SAM上对应的点求两个点的最长公共后缀长度,就是他们在后缀树上的LCA点的 mxlmxlmxl先把询问离线下来,按右端点排序,从左向右顺着扫一遍,每次把当前点 po...
2019-03-07 17:08:20 273
原创 FFT使用中注意事项
FFT使用中注意事项//FFT核心代码void fft(cp *a, int op){ for (int i = 0; i &amp;amp;amp;lt; lim; i++) if (i &amp;amp;amp;lt; rev[i]) swap(a[i], a[rev[i]]); for (int l = 2; l &amp;amp;amp;lt;= lim; l &amp;amp;amp;lt;&
2019-01-29 00:13:11 695
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人