上一页 1 2 3 4 5 6 7 8 ··· 85 下一页
  2012年10月26日
摘要: BZOJ_1781 这个题目如果Xi和Yi的范围都很小的话,那么就是个普通的广搜而已,但是现在Xi和Yi的范围超大,于是就多了各种离散化和二分查找。 其实落脚点也就只有石头周围的4个点,和石头的数量是同级别的,这样每次枚举行走的方向时要快速的找到前面的第一个石头,用二分的话就可以实现比较快速的查找了。 代码写的巨挫……而且因为代码长了之后就会有些恶心的小bug,找错找了很久,眼泪……#include<stdio.h>#include<string.h>#include<algorithm>#include<vector>#include<q 阅读全文
posted @ 2012-10-26 05:34 Staginner 阅读(349) 评论(0) 推荐(0) 编辑
摘要: BZOJ_1782 刚看完一部惊悚片,赶紧A个题缓和一下气氛,要不该做噩梦了…… 这个题目相当于每个节点都有一个标号,然后求从根到当前节点的路径上,小于当前节点的标号一共有多少个,可以在dfs的时候用树状数组来统计。#include<stdio.h>#include<string.h>#define MAXD 100010#define MAXM 200010int N, D, first[MAXD], e, next[MAXM], v[MAXM], sum[MAXD], who[MAXD], res[MAXD];void update(int x, int d){ f 阅读全文
posted @ 2012-10-26 03:56 Staginner 阅读(309) 评论(0) 推荐(0) 编辑
摘要: BZOJ_1783 乍看上去大概就要dp的,细想一下确实dp是可行的,不过中文描述里面漏了句关键的话,一开始让我迷茫了一阵,后来仔细看了英文描述之后才算清楚了。 另外突发奇想用英文写了题解,大概脑子在深夜的时候总会有点诡异的想法吧……(本人六级尚未考过,如果英文太烂的话还望谅解……)/* f[i] means the maximum weights we can get between hay bale i and hay bale N (include i and N). id[i] means which one we should choose firstly if we w... 阅读全文
posted @ 2012-10-26 01:52 Staginner 阅读(452) 评论(0) 推荐(0) 编辑
摘要: BZOJ_1785 一开始没有什么直接的思路,不过由于是棵树,而且K很小,也许是个树形的dp或者背包什么的,不过后来仔细一想,其实可以用贪心解决问题的。 对于一个非叶子节点,假设其若干子树中还有一些未配对的奶牛,那么应该是优先这些子树之间相互配对的,因为如果两个子树之间的两头奶牛可以配对但没有配对,而是有一个奶牛通过父亲甚至祖先和另外的奶牛配对了,这样不仅占有了当前这个节点的交换机的资源,还多占用了其父亲甚至祖先节点的交换机的资源,这样显然是划不来的。所以如果子树的奶牛之间可以相互配对,那么自然就先配好,剩下的奶牛再通过父节点传递出去。 大体的思路形成了,但不难发现还有一个小细节,一棵子树中可 阅读全文
posted @ 2012-10-26 00:38 Staginner 阅读(322) 评论(0) 推荐(0) 编辑
  2012年10月24日
摘要: BZOJ_1914 这个题目N好大,乱蒙的话大概也会想到先参考原点来个极角排序。 接着考虑怎么去计算了,一开始想直接算满足要求的三角形,不过想了几种思路之后还是没法解决。后来突然想到不妨尝试一下计算不满足要求的三角形,这时会发现原点和三个点的连线的跨度小于180度,也就是说两条夹角小于180度的射线中间又夹了一条射线,这样的三角形才会是不符合要求的。这样我们枚举不符合要求的三角形上按极角序出现的第一个点,这时如果我们按极角序找到两射线夹角小于180度的最远的那个点,就可以O(1)计算了。#include<stdio.h>#include<string.h>#includ 阅读全文
posted @ 2012-10-24 18:08 Staginner 阅读(557) 评论(0) 推荐(0) 编辑
  2012年10月17日
摘要: BZOJ_1915 如果我们把一对相邻的来去经过的格子看成一个研究对象的话,那么相邻研究对象之间距离不超过K,而且相邻研究对象之间所有正数的格子都可以在向前跳的过程中经过。抽象成这样的模型之后就可以用单调队列+dp搞定最后一个研究对象在位置i时的最优解。这时由于在向前跳的过程中还可能经过最右边研究对象的右边的一些距离不超过K-1的正数的格子,最后扫一遍dp出的最优解,将这些格子一并加起来即可。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 250010#define inf 阅读全文
posted @ 2012-10-17 15:16 Staginner 阅读(589) 评论(0) 推荐(0) 编辑
摘要: BZOJ_1916 对于这种题目,我向来是很头晕的,不过按dp的套路来的话还是可以解决的。 不妨用dp[i][j]表示在第i个点时,已经失控了j次,至少能得到的开心值。我们不妨只讨论j<K的情况,这时一共有两种选择,要么被失控,要么能主动选择。如果能主动选择的话,肯定会选接下来至少能得到的开心值最大的决策,而被失控的话,就要考虑至少能得到的开心值最小的决策了。最后再综合二者取最小值就是当前状态下至少能得到的开心值,写成状态转移方程就是dp[i][j]=min{max{dp[k][j] + w[i][k]},min{dp[k][j+1] + w[i][k]}},其中w[i][k]表示i到k 阅读全文
posted @ 2012-10-17 14:21 Staginner 阅读(391) 评论(0) 推荐(0) 编辑
  2012年10月14日
摘要: BZOJ_2017 一个思路就是从游戏结束开始向前dp,dp到最初状态时自然就知道最大能得到多少钱了,但是从后向前dp有一个问题就是需要直到前一步对方拿了多少硬币,才能知道当前能拿多少,因此用一维标记一下前一步对方拿了多少即可,于是就用f[i][j]表示还剩i枚硬币时前一步对手拿了j枚硬币的情况下,自己最多能得到多少钱。状态转移方程为f[i][j]=max{sum[i]-f[i-k][k]}(1<=k<=min{2*j,i}),其中sum[i]表示剩下的i枚硬币的价值和。#include<stdio.h>#include<string.h>#include& 阅读全文
posted @ 2012-10-14 19:24 Staginner 阅读(534) 评论(0) 推荐(0) 编辑
  2012年10月11日
摘要: BZOJ_2059 本来打算想想费用流的,但是既然给的是直线,八成就是让dp了,否则完全可以给成图的。 不妨用f[i][j]表示递推到第i个商店时,在前i-1个商店一共买了j的饲料,这样就有状态转移方程f[i][j]=min{f[i-1][k]+(j-k)*C[i-1]}+j*j,其中0<=j-k<=F[i-1]。这样裸着做的话,复杂度是没法承受的,但如果把min{}里的j拿出来的话就会得到f[i][j]=min{f[i-1][k]-k*C[i-1]}+j*C[i-1]+j*j,这样min里面的只和k有关,而且k是要满足一定范围的,这时我们可以用单调队列来维护f[i-1][k]-k 阅读全文
posted @ 2012-10-11 11:48 Staginner 阅读(432) 评论(0) 推荐(0) 编辑
摘要: BZOJ_2097 像这种最大值最小或者最小值最大的问题,二分答案也许是个不错的选择。二分答案之后问题就变成了对于当前这个树,最少需要删掉几条边才能使各个子树最大的半径都小于或等于某个值,如果删掉的边的数量比S小或者和S相等,那么就有可能使各个子树最大的直径小于或等于一个更小的值。 至于最少删几条边才能使各个子树的最大的直径都小于或等于某个值,可以在dfs的时候利用贪心的思想解决。#include<stdio.h>#include<string.h>#include<vector>#include<algorithm>#include<qu 阅读全文
posted @ 2012-10-11 11:01 Staginner 阅读(660) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 ··· 85 下一页