2012年3月17日
摘要: POJ_3013 如果按题目中的计算方法去想的话,是很难想到合适的算法的,而如果换个角度考虑问题的就海阔天空了。 题目中是以边为中心去考虑的,如果我们以点为中心去考虑,最后的结果就是各点的点权和该点到根的边权和相乘之后再求和即可,于是只要根到每个点途径的边权和最小就行了,那么自然就是最短路了。#include<stdio.h>#include<string.h>#define MAXD 50010#define MAXM 100010#define INF 1000000000000000llint N, M, D, a[MAXD], inq[MAXD], q[MAXD 阅读全文
posted @ 2012-03-17 23:39 Staginner 阅读(184) 评论(0) 推荐(0) 编辑
摘要: UVALive_5825 一个可行的思路就是扫描一遍,求出以i为左端点的且长度不超过N的区间和的最小值,如果这个最小值都大于或等于0的话,那么显然以i为左端点就是可行的。 既然是区间求和,那么一般来说用前缀和比较方便,这样实际上对于每个i我们就是去找满足j>i&&j<=i+N的最小的A[j],其中A[]表示前缀和。 我是用后缀和做的,如果用后缀和的话结论类似。#include<stdio.h>#include<string.h>#define MAXD 2000010#define INF 0x7fffffffint N, M, A[MAXD 阅读全文
posted @ 2012-03-17 09:27 Staginner 阅读(195) 评论(0) 推荐(0) 编辑
摘要: URAL_1846 思考之后一个可行的方式就是对于每次插入、删除完毕之后快速的求出剩余数的gcd。 但是直接去求是不行的,不过思考一下之后会发现gcd和求和运算有一些相似的地方,比如gcd(a,b,c,d)=gcd(gcd(a,b)+gcd(c,d))就好比sum(a,b,c,d)=sum(sum(a,b),sum(c,d)),于是就想到可不可以用线段树去查询呢?当然可以,只要线段树上其余的值初始化成0,树顶的元素就是所有值的gcd。 想到这里就还剩一个问题了,每个数怎么和线段树上的位置对应起来,因为我们要完成插入、删除操作就必须快速找到对应元素的位置,我是用哈希表处理的,网上也有离散化去.. 阅读全文
posted @ 2012-03-17 09:07 Staginner 阅读(534) 评论(0) 推荐(0) 编辑