上一页 1 2 3 4 5 6 7 8 9 ··· 18 下一页
摘要: 矩阵。 一个图的邻接矩阵的m次幂相当于 长度恰好为m的路径数。这要求边权为1。 因为边权小于等于9,所以可以把一个点拆成9的点。 拆成的第(i+1)个点向第i个点连边。 如果存在边(u,v,w) 就由u点向v拆成的第w个点连边,这样表明w次以后就可以到达v点。 这个拆点很牛啊,不过第一眼连邻接矩阵都没看出来。。 #include #include #include using na... 阅读全文
posted @ 2016-07-02 10:38 invoid 阅读(343) 评论(0) 推荐(0) 编辑
摘要: dp. 用f[i][j]表示长度为i,开头数为[1,j]的第一位下降的序列个数。 f[i][j]=f[i][j-1]+f[i-1][i-j]。 f[i-1][i-j]可以表示长度为i-1,开头数为[1,j-1]的第一位上升的序列个数。(各位取反以后,俩者一一对应,所以值相同) 要使用滚动数组。 好像%2和&1性能上没差别。 #include #include #include u... 阅读全文
posted @ 2016-07-02 01:01 invoid 阅读(90) 评论(0) 推荐(0) 编辑
摘要: 仙人掌。 仙人掌入门题。。不过入门都好难。。。 题解好复杂。。 总体来说,没有环的话,就是一棵树,很好求。 如果有环的话,就找出这个环,用一个单调队列用环上俩个点对更新答案。(如果不用单调队列就O(n^2)超时) #include #include #include using namespace std; const int maxn = 3000000 + 10; in... 阅读全文
posted @ 2016-07-01 18:18 invoid 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 线段树。 真还就是个线段树。。 除去操作1,2的话,线段树很容易就处理了,问题在于如何处理操作1和2。(这点没想到)。。 我们用一个delta维护操作1,如果没有旋转就+k,不然就-k。 每次读入i和j的时候用trans处理一下,就成功在O(1)的时间解决了操作1和2。 细节很重要。 #include #include #include using namespace std; ... 阅读全文
posted @ 2016-07-01 16:45 invoid 阅读(135) 评论(0) 推荐(0) 编辑
摘要: spfa+dp。 首先用一个类似spfa的过程求出a[s][t],聪聪在s,可可在t时,聪聪第一步怎么走。 然后dp求出f[s][t],表示聪聪在s,可可在t的期望步数。 #include #include #include using namespace std; const int maxn = 1000 + 10; const int maxm = 2000 + 10; int... 阅读全文
posted @ 2016-07-01 13:52 invoid 阅读(161) 评论(0) 推荐(0) 编辑
摘要: AC自动机. 统计每个字符串在自己和其他字符串中出现的次数。 ac自动机的概念,首先有个trie树保存了所有的字符串。 fail指针指向该字符串的后缀在整个trie树中可以做最长的前缀的位置。 每个字符串都可以由fail指针转移到是该字符串字串的位置。 所以很多统计就可以进行辣。 字符串的题好难。。 #include #include #include using namesp... 阅读全文
posted @ 2016-07-01 01:06 invoid 阅读(123) 评论(0) 推荐(0) 编辑
摘要: kmp。 字符串的题都好难啊。 进行一次kmp,用一个dp[i]数组记录前缀中前缀匹配后缀的数量(算本身) 同时进行一个类似kmp的过程,用变量k表示满足长度限制后,最长的匹配前缀和后缀。 则num[i]=dp[k]。为什么呢? 首先变量k满足了长度限制,dp数组记录了匹配串的数量。dp多的1正好可以充当目前的前缀和后缀。 字符串的题都好难啊。。 #include #... 阅读全文
posted @ 2016-06-30 23:43 invoid 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 树链剖分。 这道题就写个dfs序,乱搞一下就过了。 简单型的树剖 #include #include #include using namespace std; const int maxn = 200000 + 10; const int maxm = 400000 + 10; int g[maxn],v[maxm],next[maxm],eid; int size[maxn],so... 阅读全文
posted @ 2016-06-30 18:13 invoid 阅读(392) 评论(0) 推荐(0) 编辑
摘要: 树链剖分。 除去换根的俩个操作,在树链剖分后很容易实现。 换根以后只需操作的时候进行分类讨论即可。 操作2不会受到换根的影响。 操作3:如果询问点就是根,输出整个线段树最小值。 如果询问点在根到1的路径上,查询(1,st[p])和(ed[p]+1,n)的最小值,st和ed分别为出入栈的编号,p为路径上最靠近询问点的点。 其他情况下,输出范围(st[... 阅读全文
posted @ 2016-06-29 17:33 invoid 阅读(194) 评论(0) 推荐(0) 编辑
摘要: dfs序+线段树. 首先生成树的出栈入栈序。 然后入栈设为a[u],出栈设为-a[u]。 子树在线段树上是一个连续的范围,所以三个操作都可以在线段树上实现了。 ps:val设成int,wa了无数发。。 #include #include #include #include using namespace std; typedef long long LL; const int... 阅读全文
posted @ 2016-06-29 10:29 invoid 阅读(128) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 9 ··· 18 下一页