- 博客(81)
- 收藏
- 关注
转载 程序员装B指南
一.准备工作“工欲善其事必先利其器。”1.电脑不一定要配置高,但是双屏是必须的,越大越好,能一个横屏一个竖屏更好。一个用来查资料,一个用来写代码。总之要显得信息量很大,效率很高。2.椅子不一定要舒服,但是一定要可以半躺着。3.大量的便签,各种的颜色的,用来记录每天要完成的事务,多多益善。沿着电脑屏幕的边框,尽量贴满,显出有很多事情的样子。4.工具书,
2013-11-12 11:24:08 654
转载 编程天才“楼教主”
编程天才“楼教主”专访两届“黑客杯”世界编程大赛季军、清华大学博士生楼天城图为2011年楼天城参加世界知名程序设计网站Topcoder算法公开赛。 天才什么模样?一位采访过楼天城的记者思量再三后说:“很难形容,但就像所有人高中班级里几乎总有的那么一位,永远的第一名。” 楼天城,杭州人,今年26岁,博士三年级,人称编程“楼教主”,保送清
2013-10-06 12:03:20 3982
原创 POJ 3074 Sudoku
DLX解数独。行:81格(每格9种选择)。列:每行每列9格(各9种选择),81格(有或没有)。把已知的先加进去,并把它们标记,之后不再添加。然后把剩下的所有可能都加进去,再dfs求解,应该是唯一解。输出的时候注意一下,先求出真实位置,再求真实数值,最后直接输出字符串。#pragma comment(linker, "/STACK:1024000000,1024000000")#inclu
2013-10-06 11:53:29 639
原创 ZOJ 3209 Treasure Map
DLX。用尽量少的矩形,覆盖一个大矩形,不重不漏,求使用个数。#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include#include#include#include#include///LOOP#define REP(i, n) for(int i =
2013-10-02 14:41:03 604
原创 HUST 1017 Exact cover
DLX.最近开始学习dancing links了。据说这道题是测试模板正确性的题。这个http://blog.csdn.net/fp_hzq/article/details/6800113挺好的,以前也经常逛他的博客。DLX也用了他的模板,等过一阵有了新的理解,也许会改成我自己的风格,不过预计改动不大(就是换个变量名什么的^_^)。#pragma comment(linker, "/STA
2013-10-02 09:59:37 546
原创 UVA 12299 RMQ with Shifts
线段树。单点更新,区间查询。就是说每次更新时,就按照题意,一个一个去修改。一开始我认为这样做会超时,跟队友商量了一下,也都认为会超时,但又想不到别的方法。。。。百度了一下,别人都说是水题,简单模板题,也都是这样做的。可能字符串长度不超过30使得更新的量不会太大,所以也不会TLE吧。#pragma comment(linker, "/STACK:1024000000,1024000000")
2013-09-30 18:22:44 600
原创 UVALive 5902 Movie collection
树状数组。一些电影盘摞成一摞,抽出第x个,输出它上边有多少个,再把x放到顶部。求x上面的盘的个数就是前缀和,就往树状数组上想。每次取出再放到顶上,我们不可能往0,-1,-2...上放,数组要反过来,下表从小到大表式光盘从最下边的到最上边的值(该盘上面的盘数,用总数减一下就可得到)。话句话说,每个点存的是它下面的盘数。取的时候,下面的值不变,上面的加一。#pragma comment(lin
2013-09-30 16:47:33 605
原创 UVA 11992 Fast Matrix Operations
线段树。初始为零的矩阵,有三种操作,选出子矩阵来修改,增加,和查询总和,最小值,最大值。可以二维线段树,但仁慈的出题人说:There will be at most twenty rows in the matrix(最多20行)。就可以用一维来解了。注意add标记和set标记的先后逻辑顺序即可。#pragma comment(linker, "/STACK:1024000000,1024
2013-09-27 08:52:53 942
原创 POJ 1470 Closest Common Ancestors
LCA入门题。给一颗树,若干询问,对每个询问输出它们的LCA。离线算法(Tarjan)模板。#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include#include#include#include#include///LOOP#define REP(i,
2013-09-26 18:12:33 583
原创 POJ 1330 Nearest Common Ancestors
LCA入门题,虽然这样说,但是没有用到LCA,因为询问只有一组。就用最最直白的方法。所谓最近公共祖先,就是两个点分别向上走,直到根,两条路径第一个相遇的点就是两个点的LCA。#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include#include#include
2013-09-26 18:06:59 586
原创 HDU 2888 Check Corners
二维线段树。求区间最大值,并判断最大值是不是在四角。#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include#include#include#include#include///LOOP#define REP(i, n) for(int i = 0; i
2013-09-26 12:40:05 592
原创 POJ 2019 Cornfields
二维线段树。本想练练二维RMQ的,结果就线段树水过了。求区间内最大值减最小值的差。#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include#include#include#include#include///LOOP#define REP(i, n) f
2013-09-26 12:09:30 619
原创 HDU 3183 A Magic Lamp
RMQ.感觉找规律也可以做,但我只想到了一个很麻烦的规律,不好实现。从n位数中删去m位,使剩下的数最小,求这个数。答案一定是n-m位,那么它的第一位应该尽量小,不然的话后边再小也没用,比如19999和20000,所以首位要最小。那么首位可选的区间是什么呢?假设答案是个k位数,第一位从输入数字的第零位开始,只要给剩下k-1位各留一个就行,所以右端点就是n-k+1,而k=n-m,所以就剩下m+1了
2013-09-26 08:48:35 592
原创 UVA 11235/HDU 1806/POJ 3368 Frequent values
RMQ.按非降序给出一列数,对于每个询问,回答区间内出现最多的数出现的次数。先把数据压缩一下,记录每个数字出现的次数,开始以及结束位置。那么询问的区间L,R可以分为三部分:L所在区域,R所在区域,和中间。L所在区域:L到该区间右端点的距离。R所在区域:该区间左端点到R的距离。中间部分就是一个RMQ,求区间最值。当LR在同一区域时,直接算就行。#pragma comment(linker
2013-09-25 11:33:05 805
原创 HDU 3911 Black And White
区间合并。简化版的HDU 3397 Sequence operation。区间异或,求最长连续区间的长度。
2013-09-23 13:52:50 714
原创 HDU 3397 Sequence operation
区间合并。5种操作,区间置1,置0,取反,询问区间1的个数和最长连续1的个数。分别记录区间连续1,连续0,1的总个数,及0的总个数。标记3种操作时要注意顺序和逻辑。比如置1置0都能取消取反标志。把出现过一遍以上的代码块拿出去写成函数,会使代码更简短,易维护。#pragma comment(linker, "/STACK:1024000000,1024000000")#includ
2013-09-23 13:07:52 890
原创 HDU 3642 Get The Treasury
体积交。给出若干长方体,求相交超过2次(3次及以上)的部分的总体积。对x,z分别离散化,注意pushup的处理,其他都是老生常谈了(最近队友总是爱用这个词)。用sum[3][M]来表示的前区间的覆盖情况,sum[0]指覆盖一次,sum[1]指覆盖两次,sum[2]指覆盖多次。cnt[M]来记录当前区间的覆盖次数。如果当前区间被覆盖了三次及以上,那么sum[0], sum[1]都为0,sum
2013-09-23 09:06:19 643
原创 HDU 3255 Farming
体积并。在某些矩形内撒种子,重复的地方取价值最高的那个,每个点只能存活一个,求总价值。最先想到的是二维线段树,区间修改,然后统计各种植物的个数,再乘以价值,得到答案,感觉挺麻烦的。然后发现,把价值当高度,就变成体积并了。先求一层的面积,再乘以两层之间的高度差,如此累加。每层的初始面积都是0,上一层的不要了。对于一个长方体,能到哪层,就在那层留下它的足迹。用vector来记录每层的线段。注意会超in
2013-09-22 14:24:33 627
原创 HDU 1828 Picture
矩形周长并。就是数竖着的区间里,竖边的条数,再加上横边即可。#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include#include#include#include#include#include///LOOP#define REP(i, n) for
2013-09-22 12:02:32 621
原创 HDU 1542 Atlantis
矩形面积并。模板题,给出一堆矩形,求最后的总面积。相交部分只算一次。所谓扫描线,就是指由小到大按y扫一遍,累加相邻的两条横线之间的面积。#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include#include#include#include#include
2013-09-22 11:23:51 654
原创 HDU 1255 覆盖的面积
矩形面积交。跟面积并差不多,只不过要记录两种信息,就是覆盖的次数,每次求出覆盖超过两次的线段的长度,乘以高,累加即可。pushup里面需要注意一下,当覆盖次数超过1和等于0时都正常处理,但当覆盖次数等于1时,是指当前区间的覆盖次数,考虑到他的子区间可能也会有覆盖过,所以所有之前覆盖过的子区间,现在都是又多被覆盖了1次。即sum[rt][1] = sum[rt #pragma comment
2013-09-22 11:20:05 672
原创 HDU 4099 Revenge of Fibonacci
字典树。刚开始用java乱搞了一发,TLE。然后考虑怎样才能在一堆字符串中找到某个串,使得目标串为它的前缀(或者找不到)。也只能想到字典树了。先把每次的数列求出来,多保留几位来保证精度。#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include#include#i
2013-09-18 18:56:30 1099
原创 POJ 2155 Matrix
二维入门题。树状数组和线段树都可以,看过论文的话二维树状数组就应该能懂,而二维线段树就要麻烦一些,时刻想着树套树。二维树状数组#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include#include#include#include#include#in
2013-09-18 12:06:15 622
原创 HDU 3265 Posters
矩形面积并。给出一些矩形,这些矩形有的被挖了一个矩形,求最后的面积。可以把每个矩形框拆为四个矩形(也许不够四个,需要判断一下,我一开始没判断,就MLE了),怎么拆都行,就算有重叠也不在乎。中间会超int,其他就是模板了。#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#
2013-09-17 18:34:41 1171
原创 HDU 4090 GemAnd Prince
dfs.消宝石,每次可以把同色并且相连的宝石消掉,所谓相连,该格子周围的8个格子都算是相连。消完之后,要下落,并且把空的列向右移,也就是说,保证前几列不空,后边都空。每次找到一群可消除的宝石(相连且大于3个),消掉,移动,记录当前值及最大值,深搜,还原。找的过程bfs,dfs都行吧,搜的同时就把相应的宝石消掉并记录个数。如果剩下的最大值加当前值不大于已得到的最优值,就可以剪掉了。#
2013-09-17 16:18:20 1332
原创 HDU 4031 Attack
树状数组。每个点都有护盾,每次攻击一片,被攻击的点就破盾,需要T秒充能,在充能期间被击中就会受伤,询问单点受伤次数。用树状数组来维护每个点被击中的次数,并保存下来攻击的区间。询问时先求出该点被击中次数,再减去成功防御的次数,就是受伤的次数。#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include
2013-09-13 12:44:51 827
原创 HDU 4046 Panda
树状数组。给出一个由b,w组成的字符串,两种操作,一个是询问区间[a,b]内wbw的个数,另一个是更改a点的字符。当连续三个字符符合wbw时在第二个w的下标处(树状数组中)加1。每次更新时,分三种情况讨论。每次询问时,注意区间,注意每个坐标的含义。#pragma comment(linker, "/STACK:1024000000,1024000000")#include#incl
2013-09-12 15:48:30 973
原创 HDU 4043 FXTZ II
排列组合求概率。大概是说:有n个小球,第i个(从0开始)小球权值为2^i,AB两人等概率取球,也就是说轮到谁不一定,但概率为50%。要保证A得到的球的总权值比B的小。输入n时,输出概率。用分子分母形式表示。分子就是成功的总数,分母就是所有的排列呗。n个球,就有n!种排法,每个球不是给A就是给B,所以再乘以2^n就是分母。而分子不会求,dfs打了个小表(10以内)得1,3,15,105......可
2013-09-12 15:39:09 782
原创 HDU 3308 LCIS
区间合并。给出一些数,记为a[i],两种操作。U x y表示把a[x] 的值改为 y。Q x y表示求xy间的最长连续上升序列(LCIS)。这里的x y都是从0开始的。其实吧,就是比较当前区间的左右子区间能否相连,也就是说要看a[k] 与 a[k + 1]的大小关系(k表示区间中点)。其他操作跟“正常”题一样。
2013-09-11 16:15:58 571
原创 HDU 4068 SanguoSHA
很暴力的一道题。问我方是否有一种排列能赢对方的所有排列。枚举呗。dfs按字典序求出我方的一个排列,再用这个排列跟敌方的所有排列比,看赢了多少局。#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include#include#include#include#incl
2013-09-11 14:47:42 736
原创 HDU 4101 Ali and Baba
长着一张博弈脸的搜索题。给出n*m的地图,有石头空地若干,还有一个宝藏。正整数表示石头的hp,0表示空地,-1表示宝藏,而且保证只有一个。AB轮流敲,每次从边界开始,选一个可达的石头,敲一下,石头的hp-1,hp为零就变成空地了。谁先敲到宝藏,谁赢。
2013-09-11 07:17:34 946
原创 HDU 4267 A Simple Problem with Integers
树状数组。2种操作,1 a b k c :表示把a到b区间内所有下标为i且满足(i - a) % k == 0的值加c,也就是说,下标从a开始,每次加k,直到超过b。2 a:表示询问a点的值。当k等于1时,就是成段更新,单点查询。想到这里不妨把数字分组,对k取余相同的数进一组,那么对每组来说,都是成段更新。单点查询时只需把a在10个组内的值都加起来,再加上原来的值,就是当前a点的值了。然而
2013-09-10 18:31:05 583
原创 HDU 3533 Escape
bfs.在地图上又若干炮塔(随便翻译啦),给出地图大小和炮塔个数以及限定时间,问是否能在限定时间内从左上角跑到右下角。每个炮塔都会开炮的,给出他们开炮的方向,时间间隔,炮弹速度,以及坐标。首先,怎么判断能不能进入下一个点呢?换句话说就是怎么判断下一时刻,那个点是否有停留的炮弹。假如枚举每个炮塔,再计算是否可行,这样不仅不好写代码,也会浪费时间。不妨用3维数组,表示在t时刻,x,y点是否可以进入
2013-09-09 19:39:23 683
原创 HDU 4294 Multiple
dfs。给定n,求n的倍数在m进制下所用的数字种类最少,有多个就输出最小的那个。就是把HDU 1664 Different Digits 的代码中的10换成m就过了。#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include#include#include#
2013-09-06 15:30:10 510
原创 HDU 4288 Coder
线段树。数据不算多(1e5),但是有点大(1e9),就要离散化一下,又是动态插入删除,所以必须先离线才能离散化。换句话说就是先把所有可能出现的数字都存起来,然后再把它们映射到0到num,就叫做离线+离散化。利用sum数组记录当前节点有多少子节点,ans分别记录当前节点的5种余数的和。每次询问时输出ans[2][1],就是根节点余2(第三个)的数的和,会超过int。然后pushup操作中,每个a
2013-09-06 15:22:33 462
原创 HDU 2821 Pusher
dfs.枚举每个点作为起点,然后四个方向移动就行。先把字符串数组转化为整数,方便判断,每次dfs前后,注意修改与恢复。#include#include#include#include#include#include#include#include///LOOP#define REP(i, n) for(int i = 0; i < n; i++)#define FF(i,
2013-09-06 07:24:34 632
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人