寒假狂练
jason_star
我要变强!
展开
-
【poj 3056】The Bavarian Beer Party (区间DP+最大匹配不交叉的简单算法)
题目大意:一组数按照顺时针排列,数值相同的两个位置可以连一条线,最终线与线不交叉的最大数量为多少。这道题目是求最大匹配的题目,初学区间DP,脑子一片空白,仅仅记下来,以供之后温习。按照区间的想法可以很容易的得到,dp[i][j]所存的是i到j当中满足条件的最大数值,那么有dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]);这个是解决在i到j区间当中有两原创 2015-01-25 12:08:49 · 831 阅读 · 0 评论 -
【POJ】1151 Atlantis(线段树+扫描线+离散化)
题目大意:给若干个矩形,每次给的是矩形对角两个点的坐标,求所有矩形并起来的面积。 线段树扫描线典型题:#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;#define MAX 220#defin原创 2015-02-22 17:54:07 · 633 阅读 · 0 评论 -
【POJ】1171 求矩形并的周长(线段树+扫描线+离散化)
#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<cmath>using namespace std;#define MAX 10010#define ls rt<<1#define rs ls|1#define原创 2015-02-23 20:07:31 · 764 阅读 · 0 评论 -
【HDU】 2795 Billboard(线段树)
sum表示的是区间的剩余容纳长度#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#include<algorithm>using namespace std;#define MAX 200005#define ls rt<<1#define rs rt<<1|1#define mid (l+r)>>1原创 2015-02-11 21:36:07 · 526 阅读 · 0 评论 -
【POJ】3321 Apple Tree(DFS树的应用)
题目大意:这边给一棵苹果树,每个节点可以生出多个分支,每个分支可以有0或者1个苹果 现在给出每个节点与分支的情况。以及相应的操作。 思路: 一开始确实是看懵了,想不到为什么是线段树或者是树状数组,这边给的是一棵树,而线段树或者树状数组都是一维数组,所以这边就涉及到一个将树转换成一维数组的方法,便是对树进行dfs。详细看代码吧,初学也不知道怎么表达感悟,等以后加深印象再多写一点内容吧。 线段树原创 2015-02-25 17:34:42 · 609 阅读 · 0 评论 -
【POJ】3279 Fliptile(十字变换搜索+二进制枚举)
/*题目大意:有一个最大是15*15的方格,只有黑(1)白(0)构成,当你反转一个的时候,将黑变成白,白变成黑他的四个方向也会跟着反转,现在就是问你怎么反转使得最后的翻转次数最少,假如反转次数相同的话字典序最小。看到这题目瞬间就犯难了,老实说,没有做过。实在不敢花时间深究,那就只能好好学了。好了, 现在解决两个问题:1、怎么搜索,能够保证搜索完的结果是正确的。这种题目我们不应该从点出发,原创 2015-02-12 14:25:22 · 921 阅读 · 0 评论 -
【Fzu】2150 Fire Game(BFS)
先判断连通性,然后选择两个点进行BFS,最终时间比一下大小即可,AC时间是1s刚刚好过了。#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<queue>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;char mz[12][原创 2015-02-12 18:17:47 · 513 阅读 · 0 评论 -
【POJ】1426 Find The Multiple(暴力|同余模定理|BFS)
暴力可以解决,题目要求的数据没有超出long long#include<iostream>using namespace std;long long ans;long long n;bool dfs(long long k){ if (k%n == 0) { ans = k; return true; } if (k >= 1转载 2015-02-12 15:24:15 · 705 阅读 · 0 评论 -
【CODEVS 1154】能量项链(区间DP)
题意:是中文题我就不讲题意了。思路:第一道自己想自己做的区间DP题,好好说一下自己前后的思路,希望看了对你没有害处。自己对于区间DP也没有一个清楚的认识,这边就仅仅说一下自己的想法。言归正传,dp[i][j]表示的依然是i到j之间满足的最优解,这边插一句话,我觉得区间DP的一个思路在于从已知的小区间推出大区间的值。所以,这边,很容易可以想到dp[i][j]中存在原创 2015-01-25 23:50:28 · 1162 阅读 · 2 评论 -
【POJ】3468 (线段树,区间成段按需更新)
#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define MAX 100100#define ls rt<<1#define rs ls|1#define m (r+l)>>1long long sum[MAX << 2]原创 2015-02-14 16:49:23 · 438 阅读 · 0 评论 -
【POJ 3186 】Treats for the Cows (区间DP)
题目大意: 一序列的数,你只能一次取一个,你可以从头取也可以从尾取,假设你的次数为k,该位置的值为a[i],则取完之后总价值为增加k*a[i];求出最大的价值。思路: dp[i][j]表示i到j中的最佳结果,长度为len=j-i+1;则,这一次所要取的数是a[i]或者a[j],转移方程为:dp[i][j]=max(dp[i+1][原创 2015-01-25 16:32:49 · 831 阅读 · 0 评论 -
【CodeForces】343D Water tree (线段树好题!还未弄懂)
/*此题的方法除了用线段树求子树,通过标记父亲,更新儿子的方法,来更新祖先,学习了。对于建树的方法由于并没有说明父亲与儿子的顺序,所以需要通过两次添加。并且pre变量可以获得父亲的位置,还未弄懂!*/#define _CRT_SECURE_NO_WARNINGS#include<cstring>#include<cstdio>#include<iostream>#include<al原创 2015-02-26 22:24:18 · 1163 阅读 · 0 评论 -
【Code Forces】221D - Little Elephant and Array(线段树,思维做法)
/*确实,这道题需要明白的一点是在于条件的严格,所以,虽然有十万个数,但满足的数最多就450个,在一组数据当中。所以才采用的方法便是先将数离散化,为了存入结构体数组,这样是为了将个数对应起来,所采用的是map判重以及存储结构体的数组下标。接下来是遍历结构体数组,找出符合条件的数,条件是该数小于他的个数,这样才有机会满足。之后只需要遍历这些数在数组中从1开始到某个位置出现的个数即可。最后做原创 2015-03-01 14:35:32 · 548 阅读 · 0 评论 -
【poj】2828 Buy Tickets、2182 Lost Cow(线段树-单点更新)
题目大意:人们一个一个的来排队并插队,按人到来的顺序给出每个人插队的位置(插在第几个人后面),并告知每个人的id号,输出最终队伍的情况。 思路:这道题假如你正向去处理的话,会发现,当你确定一个位置的时候,会面临之后还需要将这个位置以及这个位置后面的所有位置下调一个位置,这样在插入上,会有很大的复杂度。 所以遇到这种情况不如从后面开始向前遍历。而且这个时候他所要插入的位置便是他最终的位置,假如这个原创 2015-02-11 15:26:48 · 582 阅读 · 0 评论 -
【HDU】1394 Minimum Inversion Number(线段树求逆序数)
题目大意:给一个长度为n的序列(n<=5000),由0~n-1的数字组成。每次把最左边的数挪到最右边形成一个新的序列。那么一共可以形成n个序列。求这n个序列里面最小的逆序数是多少。 AC代码:/*线段树求逆序数思路:线段树求逆序数的方法并没有想象的那么神奇,对于求单个a的逆序数的方法则是在a到max当中寻找已经出现过的数,出现的个数便是该数的逆序数只是这边将个数通过线段树优化了,使得求解更为原创 2015-02-11 19:26:22 · 547 阅读 · 0 评论 -
【Coder Force】264C - Choosing Balls (DP高难度思维转换)
卡了2天,说多了都是泪。/*该点的最大值的可以由前面某个点加上相应的值得到。而前面的点可以分析为以下的条件1、前面的这个点与该点颜色相同。2、这个点与这个点颜色不同。3、前面没有点。现在分析:由于1、3两个条件已经是o(1)的时间,所以不需要优化。主要的时间出在于2的时间,2需要遍历。假设2里面有n个条件需要判断,其实归结起来,我们只需要判断两个情况1、这个点的颜色与该点相同2原创 2015-02-09 11:13:50 · 736 阅读 · 0 评论 -
【POj】1651 2955(区间dp)
这两道区间DP都是自己想的,值得写一下题解,区间DP养成ing!2955题目大意:字符串只有(、)、[、]组成,完整的括号之间不能包含不完整的括号,最后让你算出有多少个合法的括号数。dp[i][j]表示的是i到j中最多的括号数,容易知道如果i位置和j位置的符号匹配的话,那么dp[i][j]=dp[i+1][j-1]+2;但是考虑到这种情况"()()“这种情况是指两个合法的部分,并且没有原创 2015-01-26 19:08:35 · 771 阅读 · 3 评论 -
【HDU】5151 Sit Sit Sit(区间DP+排列组合)
题目大意:可以查阅网站的中文翻译,就不说了,是第24场Best Coder思路:这道这道区间DP,我也开始觉得其实区间DP是一种应用型的思想,做这类题目一个重要的点是在于题目情景的把握,这道题的一个情景就是数学的排列组合问题.首先应用根据小区间推出大区间的思路,我们可以先固定一个位置k,k位置是最后做的位置,那么我们要算出在这种情况下符合的方法数,假如k是头或者尾,那不用说,此时的原创 2015-01-27 13:36:43 · 1247 阅读 · 0 评论 -
【POJ】3744 Scout YYF I (概率DP+矩阵优化)
题目大意:走一步概率为p,走两步为1-p,x[i]代表第i个地雷的位置,求走出的概率为多少。思路:设p[i]为走到i格的概率,那么走出去的概率为(1-p[x[i]])累乘假如把整个路程分成若干段的话,以地雷为节点,可以发现p(x[i-1]~x[i])累乘,也是答案。可能说的不是很清楚,代码中可以看的比较清楚。这边要说的是由于数据量比较大,并且数据之间又是乘法,所以会造成超时的情况。原创 2015-01-29 22:27:31 · 923 阅读 · 0 评论 -
【HDU 2476】String Painter(区间DP)
题目大意:有两个长度不超过100的字符串,A,B,要把A变成B,现在可以连续将N个变成相同的字母,问你至少要变多少次。(N为无限)题目思路:只要该位置不与B的该位置相同,那么就等同于空白,假如相同就可以不画。所以一开始先做一次区间DP,算出从空白画出B的最少次数关键代码为:for (int l = 1; l for (int i = 1; i + l {原创 2015-01-29 17:04:51 · 641 阅读 · 1 评论 -
【sdut】1309 不老的传说问题(简单环形区间DP)
题目大意:中文题就不赘述了。题目链接题目思路:大致的处理是与HDU 2476 一个道理,只是加入环形的处理方式。环形处理方法:将数组延长一倍。AC代码:#define _CRT_SECURE_NO_WARNINGS#include#include#include#includeusing namespace std;int a[440];int dp[440][440原创 2015-01-29 17:30:25 · 785 阅读 · 0 评论 -
【ZOJ】3604 Help Me Escape(概率DP)
题目大意:有n条路可以选择,随机选择,选择了这条路时有一条规则,假如攻击力f大于了这条路的ci,那么可以从这条路逃出去,花费ti(有对应公式计算)假如小于等于该值,则花费一天,并且攻击力增加ci,重复刚才的操作。问最终的期望是多少。思路:dp[i]表示的是攻击力为i的情况下,出去的期望。根据期望的概念可以得状态方程:dp[i]+=(1+dp[i+c[i])/n (当攻击力小于等原创 2015-02-02 14:08:54 · 908 阅读 · 0 评论 -
【URAL】1091 Tmutarakan Exams (简单容斥原理)
题目大意:从不大于s的非负数中选择k个,并且k个数的最大公约数大于1,问有多少组。思路:这边我们可以枚举最小公约数,那么最小公约数的个数中选择k个即为一种方案,因为最大数不超过50.所以枚举的最小公约数即为小于30的所有质数。{2,3,5,7,11,13,17,19,23,29}现在可以假设选择了以最小公约数为2的序列,已经最小公约数为3的序列,可以知道,最小公约为6的序列被多原创 2015-02-03 16:14:49 · 821 阅读 · 1 评论 -
【CodeForce】509F Progress Monitoring(树形情景区间DP)
题目大意:有一段深搜的代码,是遍历一个邻接矩阵,然后输出一个序列,这个邻接矩阵的原形是一棵树,那么现在就是要你根据序列,求出最多有多少个不同的树遍历之后可以得到相同的序列。思路:这道题属于简单的区间DP,仔细点想就可以了。第一种方法也是最直接的思路。令dp[i][j]表示的是以i这个点为根,其余点为它的子树时,符合条件的最大个数。从样例可以想到1 2 3由于3和2交换之后,依然原创 2015-02-04 16:29:30 · 884 阅读 · 0 评论 -
【HDU】4135 Co-prime(容斥原理简单应用 质因子的分解)
题目大意:有A到B的数,给定一个N,求在A,B之间的数与N互质的个数。 思路:首先将N质因子分解,然后在A,B之前为其质因子倍数的均与N互质。其中需要考虑交集的情况。奇数个加上,偶数个减去。 AC代码:#include<iostream>using namespace std;int pr_chi[1100];long long cnt,n,ans;long long a, b;void原创 2015-02-06 21:54:38 · 600 阅读 · 0 评论 -
【BestCoder】#29 C GTY's gay friends(区间和 随机数判重)
题目大意:可以到相应的场次查看中文翻译。 思路:其实这道题很简单,对于一个等差数列,我们要判断他是否每个数都出现,只需要判断区间和或者是最大值是否符合即可,但这边需要注意的便是中间的重复部分。最大值的判重必要性我就不知道了,而且我也不会做,目测做也超时。 这边就写一下偷别人的区间和 随机数判重的做法 其实这边判重的方法是给一个数加上一个超过1000007的权,然后在计算和的时候,便是唯一的。原创 2015-02-07 21:46:29 · 897 阅读 · 0 评论 -
【Best Coder】#29 B GTY's birthday gift(快速幂|mod的时候记得负!)
题目大意:查看相关场次即可看到。 思路:推公式的题目,可以用快速幂加公式快速解决,也可以用二进制拆分运算的方法加快速度。 需要注意的一点在于:今后在mod之后有涉及到运算的都要加上一个mod之后再mod,或者统一都加一个mod 顺便复习一下二进制拆分的方法!! 二进制拆分的做法AC代码:#define _CRT_SECURE_NO_WARNINGS#include<iostream>#i原创 2015-02-07 22:55:53 · 931 阅读 · 0 评论 -
【Coder Force】#360B - Levko and Array(DP 二分枚举)
题目大题:CF上的题目还是比较容易读懂的。这道题的意思嘛,他是说,有一个不超过2000个数的数组,每一个数与后面的数的绝对值称为value,那么所有当中最大的value就是整个数组的value,现在你有k次变换,每一次可以将其中的一个数变为任何一个使得数组价值最小的数。 假如题目的价值是所有的之和,也可以用这道题的方法。 思路: dp[i]表示的是到i这个位置,使得数组符合条件的最少变换次数。原创 2015-02-08 21:00:53 · 641 阅读 · 0 评论 -
【HDU】5175 Misaki's Kiss again(反异或|搜索匹配因子做法)
思路:求出n的所有因数 然后设m=n^p[i],p[i]是n的因子,就会得到原来的数,反异或即可。 AC代码:#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#include<algorithm>using namespace std;long long p[10000];long long mid[1原创 2015-02-14 21:36:58 · 597 阅读 · 0 评论