上一页 1 ··· 38 39 40 41 42 43 44 45 46 ··· 85 下一页
  2012年2月22日
摘要: POJ_1061 根据题意可以得到(x+k*m)%L==(y+k*n)%L,所以有x+k*m==y+k*n+t*L,移项得L*t-(n-m)*k==x-y,这时未知数有两个,t和k,而我们的目的得到k的一个最小整数解。 首先我们可以先用拓展欧几里得得到L*t-(n-m)*k=d的一组解,其中d为abs(n-m)和L的最大公约数。接下来,不妨设求得的一个解为k1,如果x-y不能整除d,那么等式L*t-(n-m)*k==x-y是没有整数解的,如果x-y能够整除d,那么L*t-(n-m)*k==x-y的一组整数解中的k就是k1*(x-y)/d。而k的解是以L/d为单位变化的,这样利用k的一个解以及k 阅读全文
posted @ 2012-02-22 09:12 Staginner 阅读(239) 评论(0) 推荐(0) 编辑
  2012年2月21日
摘要: POJ_3695 一个直观的思路就是对每次Query求一次这些矩形面积的并,具体的思路可以参考我的POJ_1151的题解,那个题也是求矩形面积的并的。但这样耗时会比较长,我暂时还没想到太好的思路。 http://www.cnblogs.com/staginner/archive/2012/02/20/2359396.html#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 50struct rec{ int x1, y1, x2, y2;}p[MAXD], res[MAXD]; 阅读全文
posted @ 2012-02-21 22:24 Staginner 阅读(485) 评论(0) 推荐(0) 编辑
摘要: POJ_1434 一开始的思路是把w*d看成一个量,这样长方体就变成了长方形,体积也就可以用面积表示了,然后将b离散化,用线段树计算出每个高度区间内有多大面积,然后沿高度由小到大计算一下如果水淹到当前区间需要多少体积,就可以算出最后的水位。 但实际上有更直接的算法,直接二分水位的高度然后判断水装入容器后是否恰好到这个高度即可。#include<stdio.h>#include<string.h>#define MAXD 50010#define zero 1e-8#define INF 2000000struct cistern{ int b, h, s;}c[MAXD 阅读全文
posted @ 2012-02-21 11:25 Staginner 阅读(372) 评论(0) 推荐(0) 编辑
摘要: POJ_2002 首先一个很直观的思路就是枚举4个顶点,然后判断是否能构成正方形,但是这样的复杂度十分高。 但实际上对于确定一个正方形来说,只要有对角线上的两个点就可以了,或者一条边上的两个点也可以,只不过这时就有两种可能罢了。于是我们不妨只枚举两个顶点,然后去查找另外两个顶点是否存在。 对于查找顶点当然可以排序后二分,但也有更直接一点方法,用哈希表存即可。#include<stdio.h>#include<string.h>#define MAXD 1010#define HASH 100003struct point{ int x, y;}p[MAXD];int N 阅读全文
posted @ 2012-02-21 10:10 Staginner 阅读(177) 评论(0) 推荐(0) 编辑
  2012年2月20日
摘要: POJ_1177 这个题目和POJ_1151基本思路是一样的,一些具体的思路可以参考我的那篇题解:http://www.cnblogs.com/staginner/archive/2012/02/20/2359396.html。 相比算面积不同的是,每次计算面积的操作需要改为计算周长的操作,同时周长可以分成平行于x轴的部分和平行y轴的部分分开来求。#include<stdio.h>#include<string.h>#include<stdlib.h>#define zero 1e-8#define MAXD 10010#define INF 10010in 阅读全文
posted @ 2012-02-20 23:53 Staginner 阅读(372) 评论(0) 推荐(0) 编辑
摘要: POJ_1389 这个题目和POJ_1151基本是一样的,一些具体的思路可以参考我的那篇题解:http://www.cnblogs.com/staginner/archive/2012/02/20/2359396.html。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 2010#define zero 1e-8struct square{ double x1, y1, x2, y2;}s[MAXD];int N, M, X;double tx[MAXD], left[MAX 阅读全文
posted @ 2012-02-20 21:24 Staginner 阅读(219) 评论(0) 推荐(0) 编辑
摘要: POJ_1151 这个题目是我第一次接触离散化的东西,看了黑书相关的部分后便按自己的理解设计了一个算法: 首先将x-y平面看成被矩形的四个边所在的直线切成了若干块,然后把每一块看成1个点,之后扫描一遍所有矩形,把这些矩形覆盖的点标记一下,最后再计算一下所有标记的点的面积即可。 这样做排序x坐标是O(nlogn)的复杂度,排序y坐标是O(nlogn),由于x和y轴最多被切2*n刀,所以最后得到的点的数量是n^2数量级的,这样标记矩形覆盖的点就是O(n^3)的复杂度,最后扫描的时候是O(n^2)的复杂度,提交之后TLE了。 之所以TLE是因为O(n^3)的复杂度过高了,我们必须降低这一部分的... 阅读全文
posted @ 2012-02-20 14:10 Staginner 阅读(698) 评论(0) 推荐(0) 编辑
摘要: POJ_2540 不妨设上一个点为p,现在走到的点为c,显然到p的距离和到c的距离相等的点就在线段pc的中垂线上,而这条直线把平面分成了两个半平面,如果是Hotter就说明object在更靠近c的这个半平面内,如果是Colder就说明object在更靠近p的这个半平面,于是,我们就把这个问题转化成半平面交的问题了。#include<stdio.h>#include<string.h>#define MAXD 210#define INF 10#define zero 1e-8struct point{ double x, y;}wa[MAXD], wb[MAXD], * 阅读全文
posted @ 2012-02-20 09:33 Staginner 阅读(339) 评论(0) 推荐(0) 编辑
摘要: POJ_1755 一开始以为要枚举3个路程的,但细想之后只需枚举两个,因为可以将总路程看成定值,不妨设成INF。 这样对于选手i,如果在x长度的第一项和y长度的第二项能够比任意的选手j跑得快,那么就有x/v[i]+y/u[i]+(INF-x-y)/w[i]<x/v[j]+y/u[j]+(INF-x-y)/w[j],进一步就能化成a1*x+a2*y+a3<0的形式,于是就可以用半平面交去看最后是否解了。 但有几个问题需要细想一下: 第一个就是a1和a2是否为0的问题,因为这个涉及到后面求向量的方式,如果a1和a2不全为0,那么我们不用特殊讨论,因为这样后面的操作没有什么影响,而如果a 阅读全文
posted @ 2012-02-20 00:19 Staginner 阅读(655) 评论(0) 推荐(0) 编辑
  2012年2月19日
摘要: POJ_3384 题目的意思是说在多边形内安排两个圆,使得两个圆覆盖的区域尽可能大(重合的部分只算一次),求两个圆的圆心坐标。 首先,受POJ_3525这个题目的启发,我们先将凸多边形的边都向内收缩R,这样得到了一个新的凸多边形(新凸多边形的各个顶点可以通过求半平面交得到),那么两个圆的圆心必定在这个新凸多边形中,否则就会和原来的凸多边形的某条边相交。 现在圆心的可行域找到了,那么在什么情况下两个圆覆盖的区域最大呢?我们可以直观的看到两个圆离的越近,重合的部分就越大,那么也就是说两个圆离得越远越好,而怎么衡量远近呢?圆心距!于是我们就得到了进一步的算法,枚举新凸多边形的任意两个顶点,找到距离最 阅读全文
posted @ 2012-02-19 21:41 Staginner 阅读(769) 评论(0) 推荐(0) 编辑
上一页 1 ··· 38 39 40 41 42 43 44 45 46 ··· 85 下一页