摘要:
边取反,从汇点跑单源最短路即可。 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 #define MAXN 1111111 7 #defin 阅读全文
摘要:
首先,定义S,表示前k个字符出现的集合,用二进制来压缩。 接下来,推出dp1[S],表示集合为S的子串的最长长度。 然后根据dp1[S]再推出dp2[S],表示集合为S或S的子集的子串的最长长度。 最后答案就是max(dp2[S]*dp2[补(S)]) 1 #include<cstdio> 2 #i 阅读全文
摘要:
一个工人可以变成两个工人,这样可以画出一颗二叉树,那么就是在叶子上建的建筑。 问题的时间花费,可以看作是这颗二叉树中各个叶子的深度*k+叶子对应建筑耗费时间中的最大值。 容易想到,类似哈夫曼树一样,从叶子出发往上合并,直到连通分量数小于等于m,结点的权值设定为w=max(lw,rw)+k。 1 #i 阅读全文
摘要:
比赛时没做出这题太可惜了。 赛后才反应过来这就是个中缀表达式求值,数字栈存的不是数字而是多项式。 而且,中缀表达式求值很水的,几行就可以搞定。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace 阅读全文
摘要:
枚举所有Strong King的状态(最多1024种左右),然后判断是否合法。 判定合法用网络流,源点-比赛-人-汇点,这样连边。 源点向每场比赛连容量为1的边; 如果一场比赛,A和B,A是Strong King且A的胜场小于B那么这场比赛向A连容量1的边,否则这场比赛向A和B都连容量1的边; 每个 阅读全文
摘要:
dp[u][t]表示从起点出发,到达i点且用了t次magic boot时的最短时间, 方程如下: dp[v][t]=min(dp[v][t],dp[u][t]+dis[u][v]); dp[v][t]=min(dp[v][t],dp[u][t-1]) (dis[u][v]<=l) 放进SPFA更新, 阅读全文
摘要:
利用Floyd的DP状态转移方程。 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 #define MAXN 111 7 int n,m; 阅读全文
摘要:
枚举作为magic road的边,然后求出A/B。 A/B得在大概O(1)的时间复杂度求出,关键是B,B是包含magic road的最小生成树。 这么求得: 先在原图求MST,边总和记为s,顺便求出MST上任意两点路径上的最长边d[i][j]。 当(u,v)是magic road时, 如果它在原本的 阅读全文
摘要:
可以依次枚举MST上的各条边并删去再求最小生成树,如果结果和第一次求的一样,那就是最小生成树不唯一。 用prim算法,时间复杂度O(n^3)。 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 #define MAXN 1 阅读全文
摘要:
我把单词当作点,然后这样其实是不对的,这样就要判定是否是哈密顿通路。。 这题应该把单词的首尾单词当作点,而单词本身就是边,那样就是判定欧拉通路了。 有向图包含欧拉通路的充要条件是:首先基图连通,然后是所有点的入度=出度 或者 有且只有一点出度=入度+1(起点)且有且只有一点入度=出度+1(终点)。 阅读全文
摘要:
给一个无向图的度序列判定是否可图化,并求方案: 可图化的判定:d1+d2+……dn=0(mod 2)。关于具体图的构造,我们可以简单地把奇数度的点配对,剩下的全部搞成自环。 可简单图化的判定(Havel定理):把序列排成不增序,即d1>=d2>=……>=dn,则d可简单图化当且仅当d’={d2-1, 阅读全文
摘要:
IDA*是IDS的基础上加上满足A*算法的估值函数来剪枝的搜索算法。 这题代码量挺少的,可以看出整个IDA*的框架: 阅读全文
摘要:
有一种暴力是这样的,枚举一边,确定另一边。 这一题是这么解的,枚举第一行所有翻转情况,然后剩下几行其实是确定的,因为前i行翻转方式确定后只能通过第i+1行的翻转来改变第i行的状态,于是依次模拟求出剩下几行的翻转情况。 另外其实每个点最多只会被翻转一次,因为如果翻转两次和不翻转是一样的。 这题很有意思 阅读全文
摘要:
很容易想到源点向所类型有贴纸连边,容量为Bob一开始有的数量;然后贴纸向汇点连边,容量为1。 接下来就是交换部分的连边了。注意交换一次一次进行,每次只能交换一张。 交换,是对于两种贴纸而言,仅会发生在一种贴纸朋友拥有的数量为0,而另一种朋友拥有的数量大于1。 于是这么建图,对于每一个朋友,如果贴纸数 阅读全文
摘要:
题目:单边修改,树链查询。 这题是边权,不是点权,不过也可以看作是点权。 然后其实就和BZOJ2819一样。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 #define M 阅读全文