摘要: 一道线段树的典型应用,标记真强大,没事怕错就多下放几次标记,反正没什么错。View Code 1 program tree_line(input,output); 2 type 3 node = record 4 sum,mark : int64; 5 left,right,x,y : longint; 6 end; 7 var 8 tree : array[0..1000000] of node; 9 n,m,tot ... 阅读全文
posted @ 2012-03-09 16:42 Codinginging 阅读(158) 评论(0) 推荐(0) 编辑
摘要: 给定N个数,每两个数有一个最大公约数,求最大的最大公约数。N<=10^5,每个数<=10^6枚举求是N^2*logN的,必定超时换一个思考的角度,如果我们假设最大公约数是多少,用多少时间可以判定是否成立呢?假设判定x,那么给变量每次加x,看有没有这个值,有的话就计数器加一,计数器一旦大于1,就成立,跳出即可。这样,我们开一个10^6的数组,v[i]记录值为i的数的个数,判定有没有值时就是O(1)的了,总体时间在max_number*logN左右View Code 1 program sgu499(input,output); 2 var 3 v : array[0..11000.. 阅读全文
posted @ 2012-03-09 16:03 Codinginging 阅读(595) 评论(1) 推荐(0) 编辑
摘要: 一道看起来算法很明确的题目:给定N条平面上的线段,问最早在哪条线段处出现封闭图形,保证线段不相交。对平面上的点进行离散,之后用并查集维护,一旦出现两个端点在同一集合中,终止算法,输出即可。离散化的地方有必要说一下,很多人用HASH,很慢的,有人用平衡树,C++调库,psacal就吃了亏——说一下本人离散方法,三棵平衡树,第一棵存x坐标,第二棵存y坐标,第三棵存{(x在一中的排位)*一中的x个数+(y在二中的排位)}这样可以确定每个坐标都对应三中的一个值,不会有重复。AC的感觉不错!还要墨迹几句,SGU交pascal不能用exit(x),真不爽啊View Code 1 program sgu.. 阅读全文
posted @ 2012-03-07 18:18 Codinginging 阅读(350) 评论(0) 推荐(0) 编辑
摘要: 最小覆盖问题,跟3041差不多,只不过有了不能覆盖点的限制,首先横竖染色,那么每个水坑要么没横着的覆盖,要么被竖着的覆盖,用染出色的该点木板颜色连边,求最大匹配即可。View Code 1 program pku2226(input,output); 2 var 3 map : array[0..51,0..51] of char; 4 x,y : array[0..51,0..51] of longint; 5 f : array[0..2500,0..2500] of boolean; 6 v : array[0..25... 阅读全文
posted @ 2012-03-04 18:19 Codinginging 阅读(172) 评论(0) 推荐(0) 编辑
摘要: 给一个n*n的矩阵,其中有一些坏东西需要消灭,用激光炮每次消灭一行或一列中的所有坏东西,问最少次数。总结一下,对于每个坏东西,我们有两种方案消灭它,横着打或者竖着打,满足最小覆盖的定义,用方案做点(即每个坏东西的x坐标和y坐标),连边求最大匹配OKView Code 1 program pku3041(input,output); 2 var 3 f : array[0..1100,0..1100] of boolean; 4 v : array[0..1100] of boolean; 5 lk : array[0..1100] of longint; 6 ... 阅读全文
posted @ 2012-03-04 17:47 Codinginging 阅读(231) 评论(0) 推荐(0) 编辑