11 2013 档案
摘要:一个排队问题,f代表女,m代表男,f和m出现的几率相等。问一个长为L的队伍不能出现 fmf 和 fff这样的串总共有多少种。这个题目的公式递推略难啊。。。我看了别人博客才想明白原来是这么递推出来的。首先把前几项写出来。L=0 ,ans=0;L=1,ans=2;L=2,ans=4;L=3,ans=6;L=4,ans=9;规律有点难找,直接递推出来,假设 长度为n的串,n>4,ans[n] 无非就是在 ans[n-1]的基础上加一个 f或者m,如果在ans[n-1]的基础上在队列最后加一个m,则绝对合法,因为不论前面n-1个是怎么排列,最后加一个m,绝对不会构成fmf或者fff,所以 ans
阅读全文
摘要:这道题目是刘汝佳白书上的例题,没有LRJ在白书上提到的划归为搜索问题,还真是一时难以想到好的解法。即三个瓶子,任意的一个状态都是一个节点,最后就划归为一个搜索问题。由于题目数据量不大,三个杯子容量都不超过200,所以用个vis三维数组保存下访问过得状态以达到剪枝的目的,不过我在想数据量稍微大一点,这个数组就开不下了,同时搜索时间将大大增加。。。所以面对大数据的时候有没有更好的方法,我暂时还没想到。代码写得超级挫,每个状态的转化都是手动敲的,好像可以用一个函数统一解决,当时写的时候就比较急,就直接手敲了。#include #include #include #include #include #
阅读全文
摘要:这道题目昨晚比赛没做出来,昨晚隐约觉得就是个动态规划,但是没想到怎么DP,今天想了一下,突然有个点子,即局部最优子结构为 1-j,j#include #include #include #define N 100000#define INF -900000using namespace std;int dp[105][N=N*2) continue; if (dp[i][j]==INF) continue; dp[i+1][j+temp]=max(dp[i+1][j+temp],dp[i][j]+a[i+1]); ...
阅读全文
摘要:这个题目确实是很简单的一个矩阵快速幂,但是我在求和的时候,用的是标准的求和,即,一共计算logN次Ak,但是这样会超时。后来就发现原来本身和Sn=Sn-1+Fn;即Sn本身可以写在矩阵当中,所以直接求一次 Ak就能得出结果。#include #include #include #include #include using namespace std;struct Mat{ int mat[4][4];};Mat it,E,E0;void init(){ memset(it.mat,0,sizeof (Mat)); memset(E.mat,0,sizeof (Mat)); ...
阅读全文
摘要:最近开始由线段树转移新的内容,线段树学到扫描线这里有点迷迷糊糊的,有时候放一放可能会好一些。最近突然对各种数学问题很感兴趣。好好钻研了一下矩阵快速幂。发现矩阵真是个计算神器,累乘类的运算原本要O(N)的复杂度一下子给降到Log(N),非常大的进步了。这个题目算是矩阵快速幂的比较难推的一个题目。题目要求 (sqrt(2)+sqrt(3))的 2^n并%1024,要求出值来并不难,构造矩阵即可,但是要mod1024就有问题了,小数不能直接mod,但是如果你取整之后再mod,结果绝逼出问题,因为浮点数的精度问题。所以从斌牛的博客上看到如此推算,推算第一块不难,而且很容易求出Xn 和 Yn,但是问题又
阅读全文
摘要:又几天没写博客了,大二的生活实在好忙碌啊,开了五门专业课,每周都是实验啊实验啊实验啊。。。。我说要本月刷够60题,但好像完不成了,也就每天1题的样子。如今写动规还是挺有条理的,包括这道需要打印轨迹,其实就是在POJ 2955的基础上进行下修改,记录下动规的方向,再用递归逆向输出即可!是个区间DP,如果 括号i和括号k匹配了,则 dp[i][j]=max(dp[i][j],dp[i][k]+1+dp[k+1][j])这个转移方程挺重要的,我一开始就是这个方程没写好。。弄得思路混乱了还有就是一开始不知道为什么总是OLE,说我输出太多,我看了下POJ的discuss,说这道题的数据里面有一些空行或者
阅读全文
摘要:本来是个很简单的题目,难住我的主要是这么几点1.它所有的点都是坐标,不是实际的砖块,1,3指的是1-2 2-3的砖块。。。后来就是用1 代表1-2 ,2代表2-3.。。。。,这样的话,每次读入的数据,都把r--就行,然后在实际的砖块数就是 x[r+1]-x[l]。2.我动手太快,没想清楚它是叠层型,即每次读入砖块坐标,都是往原有砖块的基础上++,这样的话,懒惰标记,就也一定是每次++,这里我WA了好久,一开始没想清楚,没按叠层来更新懒惰标记。。3.有个地方超级难以想到,就是在最后query木板能承载多少砖块的时候,用个flag标记好已经完全清空的node,因为询问有多次,下次再遇到这个node
阅读全文
摘要:给这个题目跪了两天了,想吐简直发现自己离散化没学好包括前一个离散化的题目,实际上是错了,我看了sha崽的博客后才知道,POJ那题简直数据弱爆了,本来随便一组就能让我WA掉的,原因在于离散化的时候,缩小数据规模的同时,没有考虑到误差,比如 1 4 6 8,离散化之后是1 2 3 4,我如果覆盖了1 2和3 4,表面上好像全部覆盖了,实际数据并没有覆盖。。所以我只能说那道题目我其实错了,并没有真正做出离散化出来。。。现在用这道题来弥补。color the ball,ball的编号可以从1 到2^31,不可能开这么大线段树,但是其实测试数据只有N=2000*2组,所以必然是离散化,初始的时候,所有球
阅读全文
摘要:给一块最大为10^8单位宽的墙面,贴poster,每个poster都会给出数据 a,b,表示该poster将从第a单位占据到b单位,新贴的poster会覆盖旧的,最多有10^4张poster,求最后贴完,会看到几张poster (哪怕只露出一个单位,也算该poster可见);我一看这么大数据,又看了下时间限制只有1s,不科学啊,如果真的按10^8建树不可能过时间啊,而且根据它的空间限制,大概只能建10^7这么大的数组。后来搜博客发现大家的标题都写着离散化,原来用离散化做这个题目,但是我不会离散化,我想找一篇纯讲离散化的博文来好好研究下,。。。没找到,所以原谅我,这个题目是仔仔细细的分析了别人的
阅读全文
摘要:题目大意:给定一个n个节点的树,1是信号发射塔,1到n-m是中继发射塔,n-m+1 到n是用户,每个用户都会交钱,任意两个节点传输信号都是需要钱的,每个用户最多上交的钱已给定,问在不亏本的情况下,最多有多少用户。初看题目,研究了下样例,发现每个用户上交的钱在满足自身需求同时还有可能用到其他线路上。所以我一开始的DP方法是这样打算的,记录下所有用户上交的总钱数 sum,用dp[rt][j]表示以rt为根的树,在分配了j这么多钱之后,最多能有几个用户,写着写着发现不对劲,这样是初始就认为有sum的钱,然后把sum的钱统一分配,明显错了,因为能收到用户的钱,前提是一定要接通它这条线路,。。又试想了改
阅读全文
摘要:题意:输入N,P,求一棵N个节点的树最多砍多少次边,能得到一个节点数为P的树。这个题目还真是一时间考住我了,我怎么都没想通怎么DP,甚至后来没办法去找博客看了一下,还是觉得无法理解。今天上午,翘着水课来刷题,总算是弄懂了。用dp[rt][j]表示在以rt为根节点的树上,要保留j个节点,(每次j从p递减到1)需要的最小割边数,首先我们来考虑边界,如果是叶子,则dp[rt][1]=0是显而易见的,除此外,它无法构成任何其他数目节点的树,所以dp[rt][i](i为除1外的数)全部置为INF,以此来表示不存在。dp[rt][j]=min(dp[rt][j]+1,dp[rt][j-k]+dp[nx][
阅读全文
摘要:题意:给一棵树,每个节点都有一个权值,权值只能拿一次,只让走K步,问最多能拿到多少权值这个题目一开始没料到原来可以往回走,分析了样例才知道。之后我用DFS搜索,超时后来一直想树形DP的状态转移,一直没想出来。后来还是看别人博客上的状态转移方程。dp[0][rt][j+2]=max(本身,dp[0][rt][w]+dp[0][nx][j-w])//w为枚举的需要多少步,由于要从nx子节点返回,故需要比j多两步dp[1][rt][j+2]=max(本身,dp[1][rt][w]+dp[0][nx][j-w])//走向子树后回来再一去不回,因为从子树回来需要多走两步dp[1][rt][j+1]=ma
阅读全文
摘要:题意:就是相当于动规里面的求最大连续子串,不同的是,这里需要读入一个区间x,y,输出的区间 a,b 且x#include #include #define Lson x=s[tree[x=s[r]-s[tree[x=v2){ tree[x].vx=tree[xs[tree[x].vy]-s[tree[x].vx-1]){ tree[x].vx=tree[xmid){ return query(st,e,Rson); } if (e=s[b.vy]-s[b.vx-1]){ c.vx=a.vx; c.vy=a.vy;...
阅读全文

浙公网安备 33010602011771号