自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(74)
  • 收藏
  • 关注

原创 二分总结

二分分为二分查找和二分答案。设数组下标为1~n二分查找。实际上就是一个有序数列中有一个解,然后搜一遍求这个解。而直接for循环暴搜一遍的话时间复杂度是O(n),而用二分查找可以降低时间复杂度,为O(logn);而数组形象化出来的话就是0000010000000(0为无解,1为有解),二分就是要找中间的1,即为唯一解。所以开始l和r设为一定是无解的部分,代码如下。int mid, l ...

2018-09-25 16:51:21 142

原创 poj 3420 Quad Tiling (状压dp+多米诺骨牌问题+矩阵快速幂)

还有这种操作??????直接用pre到now转移的方式构造一个矩阵就好了。二进制长度为m,就构造一个长度为1 << m的矩阵最后输出ans[(1 << m) - 1][(1 << m) - 1]就好了牛逼!#include<cstdio>#include<cstring>#include<algorithm...

2018-09-24 17:02:59 278

原创 poj 2663 Tri Tiling (状压dp+多米诺骨牌问题+滚动数组反思)

本来直接一波状压dpAC的#include<cstdio>#include<cstring>#include<algorithm>#define REP(i, a, b) for(int i = (a); i < (b); i++)#define _for(i, a, b) for(int i = (a); i <= (b); i++)...

2018-09-24 16:43:34 233

原创 poj2411 Mondriaan's Dream (状压dp+多米诺骨牌问题)

这道题的解析这个博客写得很好https://blog.csdn.net/shiwei408/article/details/8821853大致意思就是我们可以只处理两行之间的关系,然后通过这两个关系推出所有行(有点像矩阵快速幂的思想)几个要注意的地方(1)第0行为全1(2)发现自己的思维习惯还是先行在状态,我自己写得时候老是写反。(3)path的个数可能有很多,不只是1&l...

2018-09-24 16:12:06 247

原创 zoj 3471 Most Powerful(状压dp+Tsp问题+连续性问题)

上来直接一波敲键盘,直接套Tsp问题的代码然后WA发现貌似这道题没有连续性。Tsp问题是一条路径,一个点到另一个点,多了一个限制,所以就需要加多一维而这道题没有限制,也就是说那一维不需要加,我加了还WA然后要搞清楚状态,在纸上可以写,写清楚了再敲代码这道题一开始都是存在,初始状态是0000……所以就用0表示存在,1表示不存在#include<cstdio>...

2018-09-24 14:54:28 117

原创 poj 2288 Islands and Bridges (状压dp+Tsp问题)

这道题千辛万苦啊!这道题要涉及到当前点和前面两个点,那就设dp[state][i][j]为当前状态为state,当前点为i,前一个点为j这个状态表示和之前做炮兵那题很像,就是涉及到三个点时,就多设一维表示前一个点(炮兵那题把点换成行)这道题有很多细节需要注意(1)计算路径长度。这道题一开始怎么不重复又方便的计算长度难住了我。后来看到题解直接在初始化的时候算上路径,非常牛逼然...

2018-09-24 12:23:33 192

原创 HDU3001 Traveling (状压dp+三进制+Tsp问题总结)

(1)这道题最多可以走两次,所以有0, 1, 2三种状态,所以我们要用三进制如果要用三进制,就要自己初始化两个数组, 一个是3的n次方,一个是三进制数的第几位的数字是什么void init(){ three[0] = 1; REP(i, 1, 11) three[i] = three[i-1] * 3; REP(i, 0, three[10]) { int t = i;...

2018-09-24 10:44:02 168

原创 下标中的加1减1问题

在平时写程序中,那些下标加1减1问题我总是纠结很久,现在总结一下(1)对称问题下标从0开始,是#include<cstdio>#define REP(i, a, b) for(int i = (a); i < (b); i++) #define _for(i, a, b) for(int i = (a); i <= (b); i++) using nam...

2018-09-24 09:19:21 780

原创 poj 3311 Hie with the Pie (状压dp) (Tsp问题)

这道题就是Tsp问题,稍微加了些改变注意以下问题(1)每个点可以经过多次,这里就可以用弗洛伊德初始化最短距离(2)在循环中集合可以用S表示更清晰一些(3)第一维为状态,第二维为在哪个点,不要写混。(4)在dp过程中0这个点是不用的,只用到1到n这个点而实际上dp过程中用的是0到n-1,所以就枚举1到n,然后涉及到集合的地方就写i-1其他地方如dp的第二维,距离这些都不变...

2018-09-23 23:26:21 94

转载 状态压缩DP总结(转)

https://blog.csdn.net/accry/article/details/6607703

2018-09-23 22:39:38 138

原创 POJ 1185 炮兵阵地 (状压dp)(棋盘dp)

这题和poj 3254很像,但是更复杂了一些都属于棋盘里放东西,然后又各种各样的限制,然后求方案或者最大值(1)上一道题距离要大于1,这道题是大于2。所以判断的时候变成!(x & (x << 1) || (x & x << 2))然后关于有效状态数,可以自己输入最大的数据,例如这道题就是n=10,然后输出状态数,就可以得到等于60(2)...

2018-09-23 22:37:44 293

原创 poj 3254 Corn Fields (状压dp)(棋盘dp)

状压dp入门题因为当前行的状态只和上一行有关所以可以一行一行来做因为m <= 12所以可以用二进制来表示放了或者没有放0表示没放,1表示放f[i][state]表示第i行状态为state的方案数f[i][state] = sum(f[i-1][state'])枚举行,然后枚举这一行和上一行的状态最后把最后一行所有状态的和加起来就行了 状态是这么定义,但...

2018-09-23 17:20:28 90

原创 Hdu 1429 胜利大逃亡(续) (bfs+状态压缩)

这道题的钥匙只有10个,可以压成二进制这里有有句非常关键的话(k & door[x][y]) == door[x][y]一开始以为只要(k & door[x][y]) ==1就可以了后来发现如果door[x][y]为0的话,这句话就不对了。所以要包含这里没有门的情况所以要这么写#include<cstdio>#include<cs...

2018-09-23 14:48:46 122

原创 Vijos 1456 最小总代价 (状压dp)

看到这道题n只有16,就可以想到状压dp每个人只有经过或者没经过,那就用1表示经过,0表示没经过但是不是当前在谁那里,所以再加一维来记录所以f[state][i]表示在物品在i,当前的状态是state情况下的最小总代价有几个细节要注意 (1)刷表法。要提前初始化为-1,然后然后每个起点为0.。做的时候要判断当前状态存不存在。(2)之前状态存在,当前这个人不存在才可以去做...

2018-09-23 13:58:11 162

原创 洛谷 P1306 斐波那契公约数 (神奇结论+矩阵快速幂)

有这个迷之结论如果是比赛的话可能就打表找规律了然后就是用矩阵快速幂了矩阵为1 11 0很好推。然后注意矩阵快速幂的题范围小于等于矩阵长度的时候要特判一下同时保留后8位是模1e8, 不是1e9#include<cstdio>#include<cstring>#define REP(i, a, b) for(int i = (a);...

2018-09-22 16:34:58 159

原创 洛谷 P1939 【模板】矩阵加速(数列)

 感觉矩阵乘法真的牛逼关于怎么构造矩阵,可以看这篇博客,自己先不看答案构造一遍看自己哪里不一样,做一遍就差不多会构造了矩阵构造这种矩阵快速可以优化一些比较简单的递推式构造出一个中间矩阵,然后先做中间矩阵的快速幂然后乘上初始矩阵就好了#include<cstdio>#include<cstring>#define REP(i, a, b) for(...

2018-09-22 16:19:21 131

原创 洛谷 P3390 【模板】矩阵快速幂

矩阵乘法百度上已经讲得很清楚了https://baike.baidu.com/item/%E7%9F%A9%E9%98%B5%E4%B9%98%E6%B3%95/5446029?fr=aladdin这个模板题记得全部都要开long long#include<cstdio>#include<cstring>#define REP(i, a, b) for(i...

2018-09-22 15:13:43 229

原创 洛谷 P1313 计算系数 (二项式定理)

这道题正好复习了二项式定理所以答案就是a^n * b^m * c(n, k)然后注意一些细节我一开始写组合数只写一行的组合数即c[0] = 1; c[i] = c[i-1] * (n - i + 1) / i但是因为要去模,同时式子里面有除法,所以不能用这种方式必须从头来推然后注意组合数推要从0开始#include<cstdio>#include<cma...

2018-09-22 14:19:16 196

原创 洛谷 P1134 阶乘问题

一开始只保留最后一位,交上去29#include<cstdio>#include<cmath>#include<algorithm>#define REP(i, a, b) for(int i = (a); i < (b); i++)#define _for(i, a, b) for(int i = (a); i <= (b); i++...

2018-09-22 10:25:46 122

原创 洛谷 P1414 又是毕业季II (多个数的最大公因数)

这道题其实不难,但是我想复杂了我想的是把每个数质因数分解,然后每次就枚举每个质因数来求最小公倍数。然后想了想这样复杂度将会非常的大,肯定超时然后看了题解发现不需要质因数分解,直接存因数的个数就好了c[i]表示i这个因数出现的次数。然后因为当k越小的时候答案越大(严格来说是大于等于),这是显而易见的,当数少了之后对最大公因数的限制就越少。所以我们可以把因数从大到小枚举,来求答案...

2018-09-22 09:51:34 158

原创 洛谷 P2152 [SDOI2009]SuperGCD (高精度)

这道题直接写了我两个多小时……主要是写高精度的时候还存在着一些小毛病,调了很久在输入这一块卡了很久。然后注意这里用while的形式写,不然会炸最后即使我已经是用的万进制了,但是交上去还是有两个点超时然后就开始漫长的改进,一直过不了那两个点。然后突然发现,貌似这道题没有涉及到乘法。那不就可以直接开10的九次方为一位了(10的9次方是int的最大数量级)我交上去之后就A...

2018-09-21 23:31:30 252

原创 树状数组总结

非常棒的总结 模板题洛谷 P3374 【模板】树状数组 1单点修改+区间查询#include<cstdio>#include<algorithm>#define REP(i, a, b) for(register int i = (a); i < (b); i++)#define _for(i, a, b) for(register int...

2018-09-21 21:27:47 225

原创 洛谷 P1582 倒水 (二进制)

这道题实际上是考二进制很容易看出杯子水量一定是2的i次方所以n杯水最后剩下的水一定是n用二进制表示中1的个数所以就枚举n来求什么时候1的个数小于k那么这里有个优化,不然会超时因为每次加的目的是要让1的个数变少,也就是要进位所以每次加上的是lowbit(n)#include<cstdio>#define REP(i, a, b) for(int i = (a...

2018-09-20 18:52:03 135

原创 二进制总结(算法竞赛进阶指南)

常用操作最右一位为第0位,从右到左依次为 0, 1, 2, 3…… 取出n的第k位                              (n >> k) & 1取出n的第0~k-1位                       n & ((1 << k) - 1)n的第k位取反                              n ^...

2018-09-20 17:20:53 1211

原创 洛谷 P1338 末日的传说 (字典序 + 逆序对)

这道题需要对排列有深刻的理解和认识给出逆序对的个数,求改逆序对个数的字典序最小的排列那么既然是最小,那么一开始一段肯定是升序,一直到某个数后才开始改变即1 2 3…… n-1 n a b c d……类似这样那么我们要求出这个n在哪里要字典序最小,就需要1到n这一段最长也就是说在a, b, c, d后面有尽量多的逆序对当数列为n n-1 n-2 ……1时逆序对最多逆序对个数就是n ...

2018-09-18 18:35:21 245

原创 洛谷 P1372 又是毕业季I

设答案为d则这k个数是d, 2d, 3d, 4d……kd有 kd <= n即d <= n / k要d最大,输出n / k就好了。这种设答案然后推关系的方法很常见#include<cstdio>#define REP(i, a, b) for(int i = (a); i < (b); i++)#define _for(i, a, b) f...

2018-09-18 16:50:56 116

原创 洛谷 P1865 A % B Problem

水题水题#include<cstdio>#include<vector>#include<cstring>#define _for(i, a, b) for(int i = (a); i <= (b); i++)#define REP(i, a, b) for(int i = (a); i < (b); i++)using names...

2018-09-17 16:39:11 128

原创 洛谷 P1029 最大公约数和最小公倍数问题

有两种做法一种是gcd与lcm相乘后就是两个数的乘积,枚举第一个数,算出第二数,看最大公约数是不是题目给的。第二种就lcm/gcd的答案为两个互质的数相乘。然后就枚举有多少组互质的数相乘等于lcm / gcd就ok了然后又小优化,可以只枚举到根号,然后结果乘以2就行了。#include<cstdio>#define _for(i, a, b) for(int i =...

2018-09-17 16:29:46 276

原创 洛谷 P1147 连续自然数和 (滑动窗口)

维护一个滑动窗口即可注意不能有m到m的区间,因为区间长度要大于1#include<cstdio>#define _for(i, a, b) for(int i = (a); i <= (b); i++)using namespace std;int main(){ int m, sum = 0, st = 1; scanf("%d", &m); ...

2018-09-17 16:15:43 140

原创 P1017 进制转换 (负进制转换)

和平常的转化差不多加多一步如果余数 < 0, 那么余数减去除数(此时除数是负),商数加1 #include<cstdio>#define _for(i, a, b) for(int i = (a); i <= (b); i++)using namespace std;void cal(int n, int m){ if(n == 0) return...

2018-09-17 15:53:47 376

原创 洛谷 P1403 [AHOI2005]约数研究

怎么会有这么水的省选题一定是个签到题。好歹它也是个省选题,独立做出要纪念一下很容易发现在1~n中,i的因子数是n / i那就枚举每一个i然后加起来就OK了#include<cstdio>#define _for(i, a, b) for(int i = (a); i <= (b); i++)using namespace std;int main()...

2018-09-17 15:09:01 97

原创 洛谷 P1045 麦森数 (快速幂+高精度+算位数骚操作)

这道题太精彩了!我一开始想直接一波暴力算,然后叫上去只有50分,50分超时然后我改成万位制提高运算效率,还是只有50分然后我丧心病狂开long long用10的10次方作为一位,也就是100亿进制去做,然后交上去多过了一个点,60分 附上丧心病狂的代码#include<cstdio>#include<cctype>#include<a...

2018-09-17 14:50:56 161

原创 洛谷 P1088 火星人 (全排列)

直接调用next_permutation即可,向前的话可以调用prev_permutation#include<cstdio>#include<cctype>#include<algorithm>#define REP(i, a, b) for(int i = (a); i < (b); i++)#define _for(i, a, b) f...

2018-09-17 11:23:22 302

原创 51nod 1079 中国剩余定理模板

中国剩余定理就是同余方程组除数为质数的特殊情况我直接用同余方程组解了。记得exgcd后x要更新还有先更新b1再更新m1,顺序不能错!!(不然会影响到b1的更新)#include<cstdio>#include<cctype>#define REP(i, a, b) for(int i = (a); i < (b); i++)#define _f...

2018-09-17 10:42:59 125

原创 caioj 1204 Catalan数(模板)

题目中对卡特兰数的总结很不错以下copy自题目 Catalan数列:1,1,2,5,14,42,(前面几个要背)即 h(0)=1,h(1)=1,h(2)=2,h(3)=5...公式:h(n)=C(n,2n)/(n+1)    注:C(3,5)表示组合数5个数选3个的方案数递推公式:h(n)=h(n-1)*(4*n-2)/(n+1);是不是很简单呀?下面的题也是Catalan数...

2018-09-17 10:08:21 114

原创 caioj 1161 欧拉函数3:可见点数

(x, y)被看到仅当x与y互质由此联想到欧拉函数x=y是1个点,然后把正方形分成两半,一边是φ(n)所以答案是2*∑φ(n)+1#include<cstdio>#include<cctype>#define REP(i, a, b) for(int i = (a); i < (b); i++) #define _for(i, a, b) fo...

2018-09-16 15:13:02 153

原创 poj1284 && caioj 1159 欧拉函数1:原根

这道题不知道这个定理很难做出来。除非暴力找规律。我原本找的时候出了问题暴力找出的从13及以上的答案就有问题了因为13的12次方会溢出那么该怎么做?快速幂派上用场。把前几个素数的答案找出来。然后因为原根的一个条件是与p互质,所以可以把欧拉函数的值求出来尝试一下打印出来,就可以发现规律答案就是phi(p-1) 暴力找答案代码#include&l...

2018-09-16 12:15:26 127

原创 caioj 1158 欧拉函数

直接套模板,这道题貌似单独求还快一些解法一#include<cstdio>#include<cctype>#define REP(i, a, b) for(int i = (a); i < (b); i++) #define _for(i, a, b) for(int i = (a); i <= (b); i++) using namespac...

2018-09-16 11:16:19 104

原创 caioj 1155 同余方程组(模版)

第一步,和同余方程一样,转化一下 两式相减得这就转化为了求不定方程,用exgcd求出x,要化成最小正整数解,避免溢出然后可以求出P出来。这个时候要把前两个式子转化成一个式子设求出来的是P’则有 这个就转化成了新的m1和b1然后就一直求下去即可最终b1就是答案#include<bits/stdc++.h>#define REP(...

2018-09-16 10:50:38 545

原创 caioj 1154 同余方程(模版)

求x的最小正整数解,使得ax=b(mod m)那么显然ax - b = m * yax - my = b那么就套入Ax+By = K的不定方程中,然后用exgcd求解即可但这道题求最大正整数解,对于一组解,有这样一个推论x = x0 +k*(b/gcd(a,b)) y = y0-k*(a/gcd(a,b)) k为任意正整数 可以带入方程中算一下,依然满足方程。那么也...

2018-09-16 10:12:46 191

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除