- 博客(15)
- 收藏
- 关注
原创 POJ 1655 Balancing Act 树形dp
题意:一棵树,定义每个节点的balance值:去掉这点节点后的森林里所有树的最大节点数。求出最小的balance值和其所对应的节点编号。 对于删除的每一个点,计算下它的每颗子树的节点数与剩余的子树的节点数,做一下比较。 dp[x][0] 以x节点为根的子树的最大节点数 dp[x][1] 包含x祖先的子树的节点数 注意边界的处理 #include #include #include
2016-05-28 08:47:05 430
原创 POJ 3140 树形dp
题意:一棵n个结点的带权无根树,从中删去一条边,使得剩下来的两棵子树的节点权值之和的绝对值最小,并求出得到的最小绝对值。 水题,首先把每棵子树的权值之和处理出来,在dfs一次做一下比较就好 #include #include #include #include #include #include #include #include #define LL long long us
2016-05-28 08:41:48 424
原创 HDU 4276 树形dp+spfa+分组背包
题意:给你n个点,n-1条边构成树,每条边有边树,每个点有点权(表示走每条边的时间),问在时间T从点1走到点n,能够得到最多的点权有多少。 首先我们至少要保证1到n的最短路在时间内,此时用spfa,其次,在最优的情况下,最短路径上的边只会经过一次,而其他边会经过两次,对于最短路上的边,spfa走的时候记录权值,然后赋值为0就可以了。对于其他边就可以跑树形dp了。 #include #incl
2016-05-23 10:32:34 498
原创 HDU 4003 树形dp+分组背包
求K个机器人从同一点出发,遍历所有点所需的最小花费 注意到,对于某个节点为根节点的子树,如果需要遍历完再回来,一个机器人遍历的花费 #include #define INF 0x3f3f3f3f using namespace std; const int maxn = 1e4+6; int dp[maxn][12],head[maxn],n,kk,s,num; struct list {i
2016-05-23 10:22:08 620
原创 POJ 1155 经典树形dp+分组背包 + 模板
题意:电视台发送信号给很多用户,每个用户有愿意出的钱,电视台经过的路线都有一定费用,求电视台不损失的情况下最多给多少用户发送信号。 dp[i][j]代表i节点为根节点的子树j个用户的时候最大剩余费用。 dp[i][j] = max(dp[i][j], dp[i][k]+dp[son][j-k]-w[i][son]); #include #include #include using n
2016-05-23 10:15:54 784
原创 POJ 2486 树形dp
题意:一颗树,n个点(1-n),n-1条边,每个点上有一个权值,求从1出发,走V步,最多能遍历到的权值 dp[root][k]表示以root为根的子树中最多走k时所能获得的最多苹果数 在经典树形dp的套路上,注意到有时候走完一条路需要返回,此时需要考虑走完某个节点需不需要回来 dp[root][j][0] = MAX (dp[root][j][0] , dp[root][j-k][0]
2016-05-23 10:10:03 425
原创 HDU 4417 主席树
区间查询 查询[l,r]区间只需要将第r棵线段树[0,H]区间的总数减去第l-1棵的就行了。 需要注意的是边界的处理 #include using namespace std; const int maxn = 1e5+6; struct node {int l,r,sum;}T[maxn*20]; int root[maxn],a[maxn],cnt; vector q; int ge
2016-05-14 13:48:38 470
原创 主席树水题 HDU2665
和POJ 2104一模一样,不多说 #include using namespace std; const int maxn = 1e5+6; struct node {int l,r,sum;}T[maxn*20]; int root[maxn],a[maxn],cnt; vector q; int getid(int x){return lower_bound(q.begin(),q.e
2016-05-14 10:28:07 662
原创 主席树入门+模板 POJ 2104
查询区间第K大,而且没有修改。 主席树的原理就是在现有的一颗线段树上不断加入新的节点,而加入的对于现有线段树的影响另开一条链记录下来,这样我们就可以保存线段树的历史版本,在查询时只需要把区间减一下就可以了。 #include #include #include using namespace std; const int maxn = 1e5+7; vectorq; int a[maxn
2016-05-14 00:07:18 541
原创 莫队算法入门 + 模板 Codeforces 617E
题意已知一个长度为n的数列 (0 ≤ ai ≤ 1 000 000) ,给m个区间,问每个区间有多少个子区间xor和为k (1 ≤ n, m ≤ 100 000, 0 ≤ k ≤ 1 000 000) 莫队算法 如果你知道了[L,R]的答案。你可以在O(1)的时间下得到[L,R-1]和[L,R+1]和[L-1,R]和[L+1,R]的答案的话。就可以使用莫队算法。 先对序列分块。然后
2016-05-13 20:07:58 2377 1
原创 AC自动机+矩阵快速幂 HDU 2243
做这个题之前最好做一下POJ 2278(题解) 在POJ2278的基础上, 最终的答案就是26^1+26^2+......+26^L减去A^1+A^2+....+A^L 我们构造这么一个矩阵 |A , 1| |0 , 1| 它 的n次方等于 |A^n , 1+A^1+A^2+....+A^(n-1)
2016-05-13 13:00:59 1027
原创 AC自动机+矩阵快速幂 POJ 2778
题意:有m种DNA序列是有疾病的,问有多少种长度为n的DNA序列不包含任何一种有疾病的DNA序列。(仅含A,T,C,G四个字符) 首先我们需要知道 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值 把给定的图转为邻接矩阵,即A(i,j)=1当且仅当存在一条边i->j。令C=A*A,那么C(i,j)=ΣA(i,k)*A(k,j),实际上就等于从点i
2016-05-12 21:03:43 1054 1
原创 AC 自动机 HDU 2896
自动机水题,注意输出的是web的编号不一定连续以及别忘了输出冒号 #include using namespace std; int ans[505],n,m,sum; char buf[10010],str[505][205]; struct Trie { int next[505*205][128],fail[505*205],end[505*205]; int root,
2016-05-11 13:38:57 418
原创 AC自动机 HDU3065
自动机水题 注意多组输入!!!! #include using namespace std; int ans[1001],n; char buf[2000010],str[1001][55]; struct Trie { int next[50001][128],fail[50010],end[50001]; int root,L; int newnode()
2016-05-11 12:12:33 522
原创 AC自动机入门+模板 (HDU 2222)
Aho-Corasick算法是多模式匹配中的经典算法 多模式匹配就是有多个模式串P1,P2,P3…,Pm,求出所有这些模式串在连续文本T1….n中的所有可能出现的位置。 步骤 1.建立模式的Trie 2.给Trie添加失败路径 3.根据AC自动机,搜索待处理的文本 重难点 构造失败指针 设这个节点上的
2016-05-10 23:17:33 436
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人