摘要: 题目传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1610 题目意思是区间涂色,求最后能看到的颜色的段数。解法是线段树。 建立一棵线段树,对每一条线段用点表示,比如0-4,就表示成1 2 3 4四个点。其实不这样也行。只是这样表示更直观了。每次插入一个区间和这个区间涂的颜色。如果这个区间正好是一棵树的左右边界,就直接更新这棵树的颜色,不再往下传递。不然的话,就要往下修改,而且这棵树的颜色也要传给它的子树。比如更新区间1 2,当前这棵树的左右边界分别是1 4,而且颜色和更新的颜色不同,那就应该把他的子树全部变.. 阅读全文
posted @ 2011-09-02 12:04 like@neu 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 线段树水题- -囧。。每天做水题。 看了discuss里面有人用树状数组过了这个题,我也试了一下,简单的树状数组tle了,bit的扩展也实在不会,太菜b了--,最后还是放弃了。线段树实现也不是很复杂,无非是一些细节的地方吧。正式比赛绝对碰不上这个层次的水题了吧。话说比赛遇到的线段树都是……哎,泪狂奔啊= =! 虽然贴代码是一个非常掉rp而且招人bs的习惯,我还是把代码贴一下吧>_<#include <iostream>#include <string.h>#include <algorithm>#include <fstream>#i 阅读全文
posted @ 2011-09-01 09:48 like@neu 阅读(259) 评论(1) 推荐(0) 编辑
摘要: 题目说给出最大公约数和最小公倍数,求a,b。如果存在多个解取最小a+b。 思路很简单,a/GCD和b/GCD是互质的,所以a/GCD和b/GCD分解以后产生的因子肯定不同。所以他们的乘积a/GCD*(b/GCD)=a*b/GCD/GCD=LCM/GCD因数分解以后产生的任何一种质因数只能属于a/GCD或b/GCD。很明显种数不会超过15,深搜或者位运算很容易求出所有组合,取其中a+b最小的a,b即可。 质因数分解直接用PollardRho的模板,但是在G++下仍然会re,可能是编译器的原因。/* * File: main.cpp * Author: acmer * * Create... 阅读全文
posted @ 2011-08-29 08:50 like@neu 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 题目传送门:http://poj.org/problem?id=1564 http://acm.hdu.edu.cn/showproblem.php?pid=1258 解法:深搜+判重 n<=12直接深搜也不会超时,而且数据较弱。题目意思说每个加法中的数字可以出现的次数不能多于原来list里面的数字。但是可能出现一样的加法式子。比如样例中的4 6 4 3 2 2 1 1,如果直接深搜就会出现两个3+1和两个2+1+1,所以加一个判断重复就可以了。类似的搜索还可以采用状态压缩的解法,效率更快。#include <iostream>#include <cstdio># 阅读全文
posted @ 2011-08-24 10:47 like@neu 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1565 题目意思就是说给出一个n*n的棋盘,每个位置上有一个非负整数,在上面取不相邻的若干个数,使得和最大。 解法:位运算+dp 因为每行可以取的位置都是一样的,只要两个数不相邻即可。所以可以先对1<<n以内处理,筛除不合法的,优化效率,然后对每行的每一个状态,在上一行合法而且跟本状态不冲突的所有状态中找一个和最大的。本行的本状态的值就是这一行在这个状态下取得的所有数的和+这个最大值。如果是第一行,则上一行的最大值为0; 需要注意的一个地方就是n可能为0,(>_<)我看了d 阅读全文
posted @ 2011-08-24 09:33 like@neu 阅读(274) 评论(0) 推荐(0) 编辑
摘要: 题目出处:http://poj.org/problem?id=3254 解法: 状态压缩dp 对每一层分开处理,首先从[0,1<<N)枚举状态,如果没有两片草地相邻,而且和草地不冲突就是合法状态。判断是不是有两片相邻可以这样:j&(j<<1) || j&(j>>1),判断草地不合法:假设草地的状态是j,比如sample里面两行的状态分别是111 和10,如果现在枚举状态是i,则如果i|j==j就是合法,没有占用没有草得地。这样可以优化到0ms。 然后从上往下递推,如果是第一行,只要状态是合法这个状态下取法就是1,如果是>1行,对上一行每 阅读全文
posted @ 2011-08-23 10:20 like@neu 阅读(175) 评论(0) 推荐(0) 编辑
摘要: 题目出处:http://acm.hdu.edu.cn/showproblem.php?pid=1074 dp状态压缩入门题,大牛无视。解法dp+状态压缩。参考hh大牛的这个图,http://www.cppblog.com/notonlysuccess/archive/2009/02/18/74168.aspx便于理解。题目的数据规模是15,本来采用了枚举和深搜的方法竟然都超时了。按理说不该吧。对状态压缩一无所知,参考了大牛们得解题报告,基本上是一样画葫芦写出来的。 对[1,1<<n)枚举每个值,当成是一个状态,保存到达这个状态也就是完成这个状态的作业被扣掉的最小学分。比如7的二进制 阅读全文
posted @ 2011-08-21 21:41 like@neu 阅读(332) 评论(0) 推荐(0) 编辑
摘要: 题目来源:usaco training 这是一个模拟题。题目较长,不太容易理解意思,尤其对于本人这种四级还没过的菜b。给你5个轮子,每个轮子有一个转动的速度,和不多于5个空隙。每个空隙给出一个起始角度和空隙的大小(用一个角度表示,这里我是拿google翻译extent了这个词才明白的,不然样例都没看懂)。如果明白了题目意思就能简单不少了。因为不管轮子转动的速度是多少,最多转动360s以后肯定也会回到原点了(v*360%360==0)。所以枚举转动时间即可。View Code 1 /* 2 ID: like_091 3 PROG: spin 4 LANG: C++ 5 */ 6 #include 阅读全文
posted @ 2011-08-20 13:14 like@neu 阅读(378) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1002 写的比较疼的一个题。做法是trie+dp,dp很裸,不是难点。主要是对于trie不太会的同学写起来比较费劲。算是trie的入门题吧。解法之一就是先把主串转换成字符串,在把字典按照对应的数字转换,插入到trie中。然后对主串每个位置枚举,如果从i+1开始长j的字串存在于字典中,则d[i+j]=min(d[i+j],d[i]+1),剩下来就很好写了。 有一个需要注意的地方就是题目说可能存在多个解求出人一个均可,如果是test3 wa了就注意下这个地方。#include <io 阅读全文
posted @ 2011-08-19 18:55 like@neu 阅读(302) 评论(0) 推荐(0) 编辑
摘要: 两个题目看起来没什么区别,都是嵌套,唯一的不同就是一个要求l <= l' and w <= w'. 而另一个则要求w1 < w2 and h1 < h2.多了一个等于号。1065在很久以前就被我水过了。搜了一下解题报告都是有关偏序集的。抑或是跟最长上升子序列有关。其实以我自己的想法完全可以模拟accepted掉,当然代价就是时间效率可能没有那么好。最坏情况下是n^2级,在3636大概是花了800ms过了。 首先是1065,想法很简单,就是先二级排序,如果l相等就对w排序,都是升序排列。然后设置一个标记访问变量。从第一个开始遍历,如果这个位置还没有访问,就 阅读全文
posted @ 2011-08-06 20:39 like@neu 阅读(281) 评论(2) 推荐(0) 编辑
摘要: 动态规划中的01背包问题。 题意是给两个数组分别表示每只牛的幽默感和智商,求全体牛的一个子集使得子集中所有牛的幽默感和智商和的总和最大,条件是幽默感总和和智商总和不能为负数。如果把幽默感当成重量,智力值当成价值(或者相反)就变成了普通的01背包问题了。但是有一个问题就是值可能出现小于0的情况— —,肿么办?凉拌……可以像本体的主流做法一样开二倍数组把原点移到100000,或者也可以每次计算都把a[i]加上1000,然后单独开一个数组,记录子集的大小,即多用的1000的个数。 采用第二种方法,则如果01背包中的状态转移方程为f[i] = max(f[i], f[i - w[j]] + v[j]. 阅读全文
posted @ 2011-08-05 17:39 like@neu 阅读(347) 评论(0) 推荐(0) 编辑
摘要: 纯暴力是n^4果断超时。本题得解法可以采用二分搜索。时间复杂度n^2(logn)的样子,空间复杂度n^2。虽然还是非常巨大,但是本题可以险过,时间大概5s。 采用两个数组a[],b[]分别记录前两列所有可能的和与后两列所有可能的和,N^2级。然后对两个数组排序,便于统计每个值出现的次数,每个数组变为了两个数组,一个保存所有可能的值,只保存一个,仍为a[],另设一个数组c[],c[i]==(a[i]的个数)。b,d类似。然后对a中每一个数a[i]在b内二分搜索a[i]*(-1),如果存在b[j] == a[i]*(-1),返回d[j],没有就返回0。如果返回值不为0则总数加上d[j]*c[i]. 阅读全文
posted @ 2011-08-03 20:42 like@neu 阅读(161) 评论(0) 推荐(0) 编辑
摘要: usaco卡了很久的一个题,因为这个题三个月没有碰usaco。开始是用了直接模拟的方法,其实是可以过掉除了最后一个数据外的所有数据的。最后一个数据就是1w*1w的,内存限制。usaco自己给的提示我硬是没看懂。 利用了矩形分割的方法。每次加入一个新矩形都把它和原来的矩形比较,如果没有交集就不处理,直接处理下一个矩形,否则分四种情况: (1) 原来的矩形上部超出了现有矩形,把超出的部分分割为一个新矩形。加入矩形库中。 (2) 原来的矩形下部超出…… (3) 左部…… (4) 右部…… 根据以上四种情况分别处理,再把原来的那个矩形从矩形库中删除。我写的比较挫的代码,还好一遍过了。/*ID: li. 阅读全文
posted @ 2011-08-02 11:24 like@neu 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272这是一个并查集题,看似很水,其实陷阱也有很多,尤其是有了垃圾数据0 0,- -注意几个地方:(1)0 0输出Yes;(2),可能不是连通图,所以要判断是否连通,不连通No;(3),可能不是每个点都出现,比如最大点4,只出现了1 2 4,所以要注意标记。#include <stdio.h>#include <string.h>#include <algorithm>#include <string>#include <iostream> 阅读全文
posted @ 2011-06-26 10:46 like@neu 阅读(261) 评论(0) 推荐(0) 编辑
摘要: 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2059 典型的动态规划,这个题没有想太复杂,直接用最简单的dp过了,分类说是数塔变种,但是没有找到思路。所以还是朴素的dp过了,wa了三次,后面还是ac了。hdu的数据确实没有poj的强。说下我的思路,代码写的很挫,肯定没人能看懂。分为两种情况,1、一次油也不加。2、至少加一次油,设d[i][j]为到第i个加油站加了j次油的最快时间。1<=i<=n, 1<=j<=i;代码如下,可供对拍:#include <iostream>#include <cstdio& 阅读全文
posted @ 2011-06-09 18:46 like@neu 阅读(171) 评论(0) 推荐(0) 编辑