- 博客(48)
- 收藏
- 关注
原创 POJ - 2385(DP)
POJ - 2385(DP)思路一开始想法是定义第dp[i][j][k]为第i秒在第j课树,转移k次的最大苹果数,由于只有两棵树,且最开始在第1棵树,则转移偶数次必定在第1棵树,转移奇数次必定在第2棵树,所以j这一维可以去掉。定义dp[i][k]前i秒转移k次的最优方案数。i这一维可以滚动优化一下。所以定义dp[k]为转移k次的最优方案。#include<iostream>#include<cstdio>#include<algorithm>#include&
2021-05-02 14:17:35
182
原创 P5022 旅行(基环树)
思路 m=n−1 或 m = n,说明该图是一棵树或者一棵基环树,处理普通树只需要将序号排序然后dfs搜索就可以了,基环树需要先找到环,暴力枚举删除每个环,然后再当成普通树处理,取最小值,时间复杂度O(n^2)。#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<queue>using namespace std;const
2020-11-30 16:48:08
155
原创 SUM and REPLACE CodeForces - 920F(线段树)
思路 对所有数的约数个数打个表,当n<=2的时候不需要再往下修改,线段树维护。#include<iostream>#include<string>#include<algorithm>#include<cstdio>using namespace std;typedef long long ll;const int MAXN=1000000+100;struct node { int l,r; int maxx; ll sum;
2020-11-29 15:47:54
193
原创 UVA - 10917(最短路+DAG统计路径数)
Walk Through the Forest UVA - 10917题意 Jimmy下班需要穿过一个森林。 劳累-天后在森林中漫步是件非常惬意的事,所以他打算每天沿着一条不同的路径回家,欣赏不同的风景。但他也不想太晚回家,因此他不打算走“回头路”。换句话说,他只沿着满足如下条件的道路(A,B)走:存在一条从 B出发回家的路径,比所有从A出发回家的路径都短。你的任务是计算一共有多少条不同的回家路径。思路 首先求出从每个点u回家的的最短路长度d[u],则题目中的条件“存在条从B出发回家的路径,比所
2020-11-11 19:53:52
484
原创 POJ - 2686 Traveling by Stagecoach (状压dp)
POJ - 2686 Traveling by Stagecoach (状压dp)题意 有一个旅行家计划乘马车旅行,他所在的国家里共有m个城市,在城市之间有若干道路相连,从某个城市沿着某条道路到相邻城市需要乘坐马车。而乘坐马车需要使用车票,每用一张车票只可以通过一条道路。每张车票上都记有马的匹数,从一个城市移动到另一个城市的所需时间等于城市之间的道路的长度除以马的数量的结果。这位旅行家一共有n张车票,第i张车票上的马的匹数是ti,一张车票只能使用一次,并且换乘所需要的时间可以忽略。求从城市a到城市b所
2020-10-23 13:30:58
139
原创 POJ - 3255 Roadblocks(dijkstra求次短路)
POJ - 3255 Roadblocks(次短路)题意 某街区有R条道路,N个路口。道路可以双向通行,问1号路口到n号路口的次短路长度是多少,同一条边可以经过多次。思路 dijkstra的堆优化可以求出最短路。到某个顶点v的次短路要么是到其他某个顶点u的最短路加上u->v的边,要么是到u的次短路加上u->v的边。#include<iostream>#include<cstring>#include<algorithm>#include&l
2020-10-20 21:59:44
169
原创 POJ Face The Right Way (开关问题)
POJ Face The Right Way (开关问题)题意 N头牛站成一排,每头牛要么向前要么向后(F表示向前,B表示向后),为了让所有的牛都面向前方,约翰买了一台自动旋转的机器,每次旋转设定一个固定的k值,机器操作一次就旋转连续的k头牛,求出为了让所有牛都面向前方的的最少操作次数m和对应的k值。思路 用f[i]表示第i头牛旋转与否,f[i]=0表示不旋转,f[i]=1表示旋转,用a[i]表示第i头牛的方向,a[i]=0表示向前,a[i]=1表示向后,可以知道f[i-k+1]+f[i-k+2
2020-10-20 21:47:48
146
原创 HDU - 4081(kruskal)
Qin Shi Huang’s National Road System HDU - 4081思路用到了求次小生成树的数组,代码也跟次小生成树模板差不多,题目要求A/B的最大值,所以求一遍最小生成树之后,暴力枚举每条边作为魔法路径(题目中的magic road)算一遍A/B,取个最大值就好了。#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include
2020-05-15 11:25:14
227
原创 Multiplication Puzzle POJ - 1651(区间dp)
Multiplication Puzzle POJ - 1651(区间dp)题意给定一个序列a,标号从1到n,每次从1-n之间的数选出一个(不能选1和n),假设选了第k个数,那么ak * ak-1 * ak+1,并累加到总和,持续这个过程直到只剩下第1和第n两个数,问总和最小是多少。思路区间dp,网上的大佬们状态方程一下就能想出来,边界初始化问题也都能很完美地解决,但我太弱了,被卡了一段时...
2020-04-28 17:58:41
136
原创 Help Jimmy POJ - 1661
思路把jimmy的位置当做第n+1个平台,地面当做第0个平台。dp[i][0](dp[i][1])表示从第i个平台左边(右边)跳到地面所需要的最短的时间,状态转移方程就是dp[i][0] = H[i] - H[j] + Min (dp[j][0] + X1[i] - X1[j], dp[j][1] + X2[j] - X1[i]),j是左边下面第一个满足条件平台的编号(高度差小于MAX,i平台的...
2020-04-11 18:48:47
100
原创 Power Strings POJ - 2406(kmp最小循环节)
题意给出一个字符串,求字符串的最多能由多少相同的子串组成思路kmp的next数组求循环节最小循环节长度=len-next[len],len是字符串长度,next数组下标从0开始,所以最多能由len/最小循环节长度。next[len]=0输出1。#include<cstdio>#include<iostream>#include<cstring>u...
2020-04-01 01:49:44
115
原创 CARDS POJ - 1721(置换循环节)
题意给出一个已经置换s次的序列,求原序列思路计算循环长度cnt,然后再让输入的序列置换cnt-s%cnt次就可以得到原序列了#include<iostream>#include<algorithm>#include<cstring>#include<queue>#include<cstdio>using namespac...
2020-03-29 20:41:57
190
原创 Permutations POJ - 2369(群置换)
题意问置换几次之后可以变为原来的序列思路做这题需要了解群置换的基本概念,以及一些定理。定理1:若 p=(a1 a2 a2 … an),则p^n=(1)(2)…(n)=e (n阶循环需要置换n次可以变成单位元)定理2:任何一个置换都可以表示成若干循环的乘积证明略。。。,可以找本组合数学的书来仔细学一学。回到题目,这道题需要求变回原来序列的最少置换次数,首先我们求出等价这个置换的若干循环...
2020-03-29 20:01:09
190
原创 Keywords Search HDU - 2222(ac自动机模板)
ac自动机模板题#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int MAXN = 500050;int trie[MAXN][26];int C...
2020-03-26 01:41:48
117
原创 Oulipo HDU - 1686(kmp匹配次数)
题意t组数据,每组先输入匹配串,再输入文本串,输出匹配串在文本串中出现的次数思路kmp优化的板子#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>#include<queue>using namespace std;const ...
2020-03-25 23:43:54
153
原创 主席树模板(luogu P3834
学习后打个卡#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<map>using namespace std;const int MAX_N = 200010;int sum[MAX_N << 5], l...
2020-03-21 01:46:47
79
原创 Tunnel Warfare HDU - 1540(线段树)
题意给出n个村庄编号1-n和m个操作(三种操作),n个村庄在一条线上,相邻的村庄相连。第一种D num,将第num的村庄摧毁。第二种,Q num,查询与第num的村庄直接或间接相连的村庄。第三种,R,重建最后被摧毁的那个村庄。思路线段树维护,节点信息保存左端点开始最大连续村庄数pre,右端点开始最大连续村庄数suf,区间最大连续村庄数量Max,Max=max(左儿子的Max,右儿子的M...
2020-03-20 02:01:36
153
原创 Financial Crisis HDU - 3749(点双连通分量+并查集)
题意:n个点m条边,q个询问,询问两个点是:不相连,只有一条路可达,还是有两条及以上不同的可达路径。思路:并查集判断两个点是否相连,其他情况通过求点双连通分量来判断,值得注意的是,虽然两个点之间连一条边也被定义为点双连通分量,但这种情况下两点只有一条路径,所以两个点在相同的点数大于等于3的点双连通分量中,有两条及以上条路径,并查集不在一个集合里面没有可达路径,其余情况是一条路径。#incl...
2020-03-18 17:46:34
213
1
原创 Road Construction POJ - 3352(双连通分量)
题意n个点r条无向边,求至少要加多少条边能够让这个图变成双连通分量思路tarjan缩点之后,因为无向图存图的时候是建双向边,所以统计出度为1的点的个数ans,则至少需要加(ans+1)/2条边能够使这个图变成双连通分量。#include<iostream>#include<queue>#include<algorithm>#include<c...
2020-03-16 22:31:53
132
原创 Cow Hurdles POJ - 3615(floyd)
题意n个点,m条有向边,q次询问,每次询问输入两个数x,y,求x到y可达路径的最大边权值的最小值。思路floyd松弛的时候改变条件就行了。#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>using namespace std;const in...
2020-03-15 00:52:09
146
原创 P2756 飞行员配对方案问题(网络流入门)
思路网络流入门题,建图,超级源点连向m个外籍飞行员,外籍飞行员连向英国飞行员,英国飞行员连向超级汇点t,边权都为1,然后跑Dinic。在增减流量的地方维护match数组。#include<iostream>#include<queue>#include<algorithm>#include<cstdio>#include<cstri...
2020-03-15 00:44:05
163
原创 Shortest Path HDU - 3631(floyd最短路)
题意有n个点,m条有向边,q个询问,询问有两种操作,0和1,0操作输入一个x,将点x标记,如果x点在之前的操作已经被标记过了就输出 ERROR! At point x,否则标记这个点。1操作要求输入两个点x和y,如果x点没有被标记或者y点没有被标记,输出 ERROR! At path x to y ,否则输出x,y两点间的最短距离(求最短距离的时候只能根据已经被标记的点求),如果两点无法到达,输...
2020-03-14 19:53:42
100
原创 Intelligence System HDU - 3072(tarjan缩点)
思路 缩点成拓扑图,记录每一个联通分量入边的最小cost,最后除了0点的cost不需要累加之外,其他的联通分量的cost都需要累加。#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<stack>using names...
2020-03-13 17:32:29
122
原创 Equivalent Sets HDU - 3836(tarjan缩点)
题意 一张有向图,需要至少连多少条边使得这个图强联通思路 缩点成一张拓扑图,问题就转化成,至少需要加几条边使得这个拓扑图变成一张强联通图。设p为拓扑图入度为0的点的个数,q为出度为0的点的个数,需要加的边数就是max(p,q)。证明略(我不会)。#include<iostream>#include<cstring>#include<algorithm&...
2020-03-13 15:31:32
125
原创 Summer Holiday HDU - 1827(tarjan缩点)
题意:中文题面还是比较好懂的。。思路:强联通分量+缩点,tarjan求强联通分量,缩点成一张拓扑图,查找入读为0的连通分量,如果这个连通分量点数大于1,通讯费用就加上这个连通块中最小费用,如果连通分量点数为1,直接加上联络该同学费用。#include<iostream>#include<algorithm>#include<cstdio>#incl...
2020-03-13 03:17:47
151
原创 Lost Cows POJ - 2182(线段树)
题意有n头不同编号的牛(范围是1-n),已知每头牛前面有多少头牛的编号比它小,求这n头牛的顺序。思路从后往前遍历输入的序列,每个a[i]表示这头牛在剩余的空位中第a[i]+1的空位上,然后删除这个空位,循环结束就能得到答案,线段树结点维护左右区间和剩余的空位sum,具体见代码实现,跟着代码手动模拟一遍就懂了。#include<iostream>#include<algo...
2020-03-12 17:39:21
118
原创 POJ 1679 The Unique MST(暴力判断最小生成树是否唯一)
先求出最小生成树,然后去掉边,加入新的边,再求一次生成树,判断是否相等#include<iostream>#include<algorithm>using namespace std;const int maxx = 15005;int height[maxx+10];int father[maxx+10];...
2020-03-12 00:05:00
97
原创 Buy Tickets POJ - 2828(线段树)
这道题其实也可以用splay做,但是线段树写起来更简单(我太菜了)。如果从后往前来安排这些人的位置,那么每个遇到的都是固定的位置,在第i个人后插队,他的前面一定要留下i个空格。还是不理解的话就按照代码来手动模拟一遍,就懂了。#include<iostream>#include<cstdio>#include<algorithm>#include<...
2020-03-11 23:56:22
97
原创 Billboard HDU - 2795 线段树应用
题意:有一块高为h宽为w的广告牌,有n张高为1宽为wi的小广告,每次都可以在广告牌上贴广告,贴广告尽量往上贴,相同高度尽量往左贴,每次贴广告之后求该广告所在的行数,没有合适的位置就输出-1。 思路:广告牌高度维护一棵线段树,每个节点维护区间左端点l,区间右端点r,区间最大值Max,Max的值表示该区间最多空位哪一行的空位长度,与小广告的的长度进行对比,但是要优先查找左子区间(因为需要尽量往...
2020-03-11 17:46:58
117
原创 树的中心
树的中心 对于顶点无赋权的图,图的中心就是找到一个点,使得该点到图中其他结点的最远距离最近。#include<iostream>#include<queue>#include<algorithm>#include<cstring>#include<cstdio>using namespace std;const int ...
2020-03-10 02:43:33
278
原创 HDU - 1394(线段树求逆序数)
Minimum Inversion Number HDU - 1394 输入一个整数n,接下来随意顺序输入0到n-1之间的数,然后可以将序列的第一个数移到最后一位去,形成新的序列。要求你输出这样的操作得到的不同数字串中逆序数的最小个数。可以用线段树来求逆序对。#include<iostream>#include<cstring>#include<algori...
2020-03-10 02:42:55
169
原创 splay模板
Splay模板#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;const int MAX_N = 1e5 + 10;const int inf = 0x3f3f3f3f;struct node { in...
2020-03-06 23:21:23
108
原创 平衡树模板(Treap)
平衡树模板(Treap)#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<cstdio>using namespace std;const int inf = 0x3f3f3f3f;const int MAX_N = ...
2020-03-03 01:46:09
78
原创 HDU - 2389
传送门:HDU - 2389 题意:花园里有m个人,n把伞,伞和人的位置用坐标表示,每个人有一个行进速度,t时间之后会下雨,现在要知道在怎样分配,使得更多的人拿到伞。 求出每个人到每把伞之间的距离,如果距离小于等于下雨之前时间t与人的速度的乘积,就连一条从人到伞的单向边,通过这种方式就可以把题目转换成求二分图最大匹配的问题,但是由于数据范围太大所以要使用Hopcroft-Karp算法。#...
2020-02-29 19:16:18
292
原创 Is There A Second Way Left? UVA - 10462 次小生成树模板题(kruskal)
采用kruskal求解,次小生成树求法的是建立在最小生成树求法之上的,所以首先要求出一次MST,然后再枚举每条不在MST上的边,将这条边放入MST当中,则必然会形成环,然后从环当中取出最长的边(必须从MST当中取这条最长边),构建新的生成树,枚举的时候维护一下最小值,这个最小值就是SecondMST,公式:SecondMST = min(MST + w(u, v) - Max(u, v))((...
2020-02-26 17:15:58
78
原创 HDU-3974-Assign the task
HDU-3974-Assign the task 题意是给定一棵树,一种操作是指定一个点,这个点及这个点的的子树被染色,另一种操作是指定一个点,问这个点的颜色。可以通过dfs序将这棵树放在线段树上,定义两个数组dfn[n]和Count[n],dfn保存的是每个节点的dfs序,Count[u]保存的是以u为根结点子树的节点总数,所以每次将节点u及u的子树染色就是染色线段树上的区间[dfn[u],...
2020-02-13 16:01:32
165
原创 Just a Hook HDU - 1698(线段树区间修改区间查询)
题意:大小为n的数组,数组元素初始值为1,有q次操作,x,y,z表示从第x到第y所有的元素的值变为z,最后询问数组的总和。#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<queue>using namespace ...
2020-02-07 18:05:22
172
原创 acwing 1252. 搭配购买(01背包+并查集)
acwing 1252. 搭配购买(01背包+并查集) 01背包+并查集。题意就是商品有价值和花费两个属性,但是一些商品需要捆绑购买,用并查集维护捆绑购买的商品,然后跑01背包的模板#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include...
2020-01-15 19:38:46
311
原创 Invitation Cards POJ - 1511(SPFA)
Invitation Cards POJ - 1511(SPFA) 题意就是求1点到所给点的最短路径之和ans1,再求所有点到1点(反向)的最短距离之和ans2,答案就是ans1与ans2的和,正向建边和反向建边,跑两次spfa。#include<iostream>#include<cstring>#include<cstdio>#include&l...
2020-01-14 15:59:13
92
原创 UVA - 10054
UVA - 10054欧拉图的判断和打印路径 根据图论的知识,判断一个图是不是欧拉图有两个条件。对于无向图,图必须是连通的而且所有点的度数为偶数,对于有向图,图必须连通并且每个点的入度和出度必须相同。#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>...
2020-01-10 00:45:11
196
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人