摘要:
HDU_3338 至于具体怎么建图在其他博客里可以找得到(网络流的题解实在写起来比较费劲,所以这次就偷懒一下了……),不过值得一提的是,不必像大多数博客说的那样每个空白格子既要向管辖行的run连条边又要向管辖列的run连条边,实际上只要把对应的管辖行的run和对应的管辖列的run连条边就可以了,这条边就代表了这个空白格子,流过的流量就是这个格子要填的数。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 20010#define MAXN 110#define MAXM 600 阅读全文
摘要:
HDU_3251 这个题目可以用最小割来做,原图上的边的费用当成容量,另外将每个可以选择的点和T连起来,容量为点权,这样做完最小割之后就会将点分成两个集合,一部分是S出发能到达的,记作S集合,另一部分是能够到达T的点,记作T集合。这样如果可以选择的点属于了S集合,那么就必然要断开和T连的边,表示如果不选这个点那么相对与最大收益来讲就要减去这个点的点权,另外连通S集合和T集合的边也都要断开,表示为了从1出发不能到达T集合中选择的点,所需要付出的代价。 于是最后用理想的最大收益减去最小割就是可能获得的最大收益了。 打印割边的时候,可以先从S出发沿非满流的边走,能够走到的点都视作S集合中的点,... 阅读全文
摘要:
HDU_3068 因为做中欧区域赛的题目时,题解有提到Manacher's ALGORITHM,于是就学了一下并找了两个题练练手,一个是HDU_3068还有一个是URAL_1297。推荐一篇讲这个算法讲的感觉挺清楚的博客:http://www.felix021.com/blog/read.php?2040。View Code // HDU_3068#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 220010int N, p[MAXD];char str[MAXD], 阅读全文
摘要:
UVALive_4977 一个贪心的思路就是我们每次喝水的时间应该尽量靠前,同时时间不能早于之间降水的时间,于是可以用线段树找到区间内第一个满足要求的点即可。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 1000010#define INF 0x3f3f3f3fint N, M, D, min[4 * MAXD], t[MAXD], pre[MAXD];void update(int i){ for(; i ^ 1; i >>= 1) min[i >&g 阅读全文