摘要:
题意非常难理解……#include#define REP(i, a, b) for(int i = (a); i k : g[a].w; int vb = b k : g[b].w; g[i].w = !(va && vb); } return g[m].w;... 阅读全文
摘要:
这道题发现一个性质就解决了如果以i为起点, 然后一直加油耗油, 到p这个地方要去p+1的时候没油了, 那么i, i+1, ……一直到p, 如果以这些点为起点, 肯定也走不完。为什么呢?用反证法, 假设以q(i #define REP(i, a, b) for(int... 阅读全文
摘要:
紫书上有很明显的笔误, 公式写错了。g(k, i)的那个公式应该加上c(k-1)而不是c(k)。如果加上c(k-1)那就是这一次所有的红气球的数目, 肯定大于最下面i行的红气球数我用的是f的公式, 我觉得这个稍微比f好理解一点。f(k, i) 表示k小时之后最上面i行... 阅读全文
摘要:
解法和合并果子是一样的, 每次取最小的两个, 更新答案, 加入队列#include#include#define REP(i, a, b) for(int i = (a); i , greater > q; REP(i, 0, n) scanf("%d", &x),... 阅读全文
摘要:
这道题让最大值最小, 显然是二分答案当题目求的是最大值最小, 最小值最大, 这个时候就要想到二分答案为什么可以二分答案呢, 因为这个时候解是单调性的, 如果简单粗暴一点就全部枚举一遍, 验证答案。但是因为答案满足单调性, 可以用二分的方法来”枚举“, 复杂度可以从n降... 阅读全文
摘要:
这道题用了数形结合, 真的牛逼, 完全想到不到还可以这么做因为题目求的是平均值, 是总数除以个数, 这个时候就可以联系到斜率, 也就是说转化为给你一堆点, 让你求两点之间的最大斜率要做两个处理(1)去掉上凸点, 因为上凸点是无论如何都不会为最优解的(2)去掉之后每两个... 阅读全文