自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Solutions to an Equation LightOJ - 1306

题面题意 Ax + By + C = 0,给出A,B,C和x1,x2,y1,y2,其中x1<=x<=x2且y1<=y<=y2,那么该方程一共有几组整数解方法欧扩 一开始先特判a,b中有0的情况 难点之一在于a,b可以为负数,故在进行一系列操作之前先将符号存起来,因为符号不影响数值的绝对值大小,为了更加方便,可以先算出一组解的绝对值,再枚举4种符号匹配方式,找到使等式成立的哪一种情况.

2017-10-31 18:00:23 337

原创 LightOJ 1128 Greatest Parent

题面题意 给出一棵树,每个点都有一个权,每次查询一个点的祖先中比某个数大的最大深度. 已知父节点的权绝对严格小于其子节点方法 建树之后,利用倍增进行与二分类似的思想进行查找,fa[i][j]记录点i向上(1 << j)代的父亲. 每次查找都找不超过当前范围的最大祖宗.代码#include<bits/stdc++.h>#define N 500100using namesp

2017-10-30 19:17:54 242

原创 Social Net ZOJ - 3649

题意给出一幅有n个点的连通图,求出它的最大生成树,之后对于m个询问,每个询问包括两个数ab,求出a到b的路径上的极差最大值(必须用后面的数来减前面的)方法首先求出最大生成树,之后找到LCA,即可由它得到路径,但是发现暴力扫整一条路径肯定会TLE,因而可以用倍增的方法来预处理 dad[i][j]表示i节点的第(1 &amp;lt;&amp;lt; j)的父节点(即父节点的父节点的父节点,重复(1&amp;lt...

2017-10-30 12:56:53 317

原创 欧几里得算法

辗转相减法 用于求两数的最大公约数。 a和b两数不断地用大数减小数,再用差和较小数重复以上操作直至两数相等。 例如48和56的最大公约数: 56 48->8 48->8 40->8 32->8 24->8 16->8 8. 故答案为8. 为了优化计算常常将减法改为取余。代码int gcd(int a,int b){

2017-10-29 23:30:55 683

原创 容斥原理

解释 用于解决在知道多个元素的交集时,求它们的并集,例如求多个相重叠的圆的总面积。方法 以求多个圆的总面积为例: 在求上图面积时,不难发现方法为三个圆面积相加减去重叠两次的,再加上重叠了三次的。 在求n个圆的时候,面积为A,B……等,AB表示A和B的交集,可以这么想: 先求仅被一个圆覆盖的部分,为A+B+C……。 而AB等两个圆的重叠部分被计算了2次。

2017-10-29 23:02:20 1384 1

原创 欧拉序

解释 指在dfs过程中各个点扫过的顺序例子 上图的欧拉序为:1 2 4 2 5 6 5 2 1 3 1代码struct Bn{ int to,next,quan;}bn[N*2];int ou[N],oo=0;void dfs(int now,int last){ int p; p=first[now]; oo++; ou[oo]=now

2017-10-29 15:43:18 588

原创 DNA Sequence LightOJ - 1073(状压dp)

题面题意 给出n个字符串,找到一个字符串使它包含以上所有字符串.方法 因为n&amp;lt;=15,所以用状压dp,首先预处理: 1.去掉包含字符串 2.排序,可以根据字符串的序号直接得到字典序的先后 3.求出任意两个字符串衔接在一起所重叠的字符个数. 之后进行dp,若更新的长度较小则直接更新,反之比较字典序 因为从头开始遍历时,比较字典序十分麻烦(要全部展开),故从后

2017-10-28 16:26:07 264

原创 IDA*

解释 一种剪枝方法,用于优化dfs,在进行dfs时,每次都预估一下至少还要几步才可以得到答案,若此时的深度加上估价已经大于当前的最小值,则直接剪枝代码int gj(){ 据题意而定;}void dfs(int now){ if(now+gj()>=mn) return;}

2017-10-28 15:22:47 245

原创 How far away ? HDU - 2586

题面题意 给出一棵树,并询问任意两点间的距离.方法 首先找到最小公共祖先,然后两端距离之和即为答案 第一步求出欧拉序(dfs搜索顺序),然后两点的公共祖先就是两点在欧拉序中之间深度最小的点,也就是区间最小值. 因此,首先求出欧拉序,然后求出各个点的深度以及它们到根节点的距离,并在欧拉序中用st表维护区间最小深度,两点间距离即为它们到根节点距离之和减去2*公共祖先到根节点的距离.

2017-10-28 08:12:56 188

转载 C语言字符串操作总结大全

1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度字符串 strlen(p) 取字符串长度 strcmp(p, p1) 比较字符串 strcasecmp忽略大小写比较字符串 strncmp(p, p1, n) 比较指定长度

2017-10-27 14:51:08 250

原创 LightOJ 1061(n皇后)

题面题意 给出一个图,图中有8个皇后,问至少移动几步才能使它满足八皇后.方法 首先枚举八皇后问题的92种解法,算出给出图与正确图间的最小移动步数并以此更新答案 计算步数的方法:用状态dp进行两两匹配,算出两点间的最少移动次数(皇后要移动几步,移动时可无视其他皇后). 若在移动时遇到其他皇后,则可通过交换移动次序来避免此情况.代码#include<bits/stdc++.h>

2017-10-25 21:02:06 345

原创 hdu4374 One hundred layer(单调队列维护dp)

题面题意 给出宽n,长m的矩阵,你一开始在第一行第k个,在每行你最多向左或向右移动t步(在底层和顶层皆可移动),移动后进入下一层,问到达底层后的最大分数是多少.方法 用dp思想可知,只需要知道到达每一点的最大得分是多少,若穷举每行的起点和终点进行状态转移,复杂度为O(n*m^2)必然TLE. 其实在第i行若终点为j,则起点必然在max(1,j-t)与min(m,j+t)之间,对于此类

2017-10-25 19:26:41 251

原创 LightOJ 1060 - nth Permutation

题面题意 给出一个字符串,和整数n,输出这个字符串的第n个全排列.方法 考虑到由小写字母组成,共26个,可求出每一种字符的个数 一个字符一个字符来求,枚举当前位,用组合数求出此时后面排列的种类数,若比n大,再找下一位,反之,枚举下一位,若枚举完了仍没有符合条件的,则不可能代码#include<bits/stdc++.h>#define ll long longusing nam

2017-10-25 09:53:29 258

原创 Lightoj1068——Investigation(数位dp)

题面题意 给出n,m,k,求出n到m间有几个数的数字和与整个数都是k的倍数方法 虽然k<10000,然而因为n,m小于2^31,数字和最大也就八十几,故大于85的直接输出0. 要求n到m,只需要求0~m - 0~n-1 即可. dp时只需记录当前长度,数字和对k取模的结果和数对k取模的结果.代码#include<bits/stdc++.h>#define ll long l

2017-10-25 09:14:29 256

原创 lightoj 1424 - New Land

题面题意 在一个01矩阵中找出最大的全为0的子矩阵。方法 首先预处理出每一个点从左到右连续0的个数,然后一列一列比较,找出以每一列为子矩形最后一列的最优结果(每一列的处理方法详见Histogram LightOJ - 1083),之后不断更新答案即可。 关键在于将此二维问题转化为一维的。代码#include<bits/stdc++.h>#define N 2010using

2017-10-24 22:38:17 336

原创 HDU 3530 Subsequence

题面题意 多组数据 给n,k,m和n个数,问这n个数中最长满足其中最大值与最小值之差在m与k之间的子串的长度. n<=100000方法 因为n的范围和多组数据,必须用O(n)算法. 用单调队列来维护最大值和最小值,并据此dp 该单调队列使用时,将加入元素与队尾比较,根据维护的极值来判断比较规则,使队首表示的是该队列上一个pop的元素的位置右端到目前推入的元素的极

2017-10-24 20:20:30 237

原创 lightoj 1071 - Baker Vai

题面题意 有一矩阵,每一个点上都有一个数,先从左上角出发到右下角再回来(只能向下或向右,回来时只能向上或向左),出两个除了两个角之外,每一个点只能经过一次,问最后的路径上数之和最大为多少.分析 此难于无法记录状态 因为数据范围为100,故不可能用状压,继续深入发现只需知道他达到某一个点的最大值为多少,而无需直到他怎么走.方法 将过去回来两次当作两个人同时走,且两人不能相遇,故两

2017-10-24 18:04:59 296

原创 动态规划(dp)

解释 用于处理较复杂问题,可以将一个问题分成多个子问题,再将子问题继续拆分成更小的问题,直到能够解决. 因而找到状态转移方程很重要 处理时,一般会加上记忆化,因为这么多个子问题,很可能有相同的. 但dp无法解决有环(相互依赖)的问题,一般用于解决拓扑图这样,可以由上向下递推的问题. 如果有环,可以用枚举的方法来破环,枚举环中一个点的状态,以此状态递推即可.示例(01

2017-10-24 10:40:20 204

原创 单调队列

解释 队首为一段区间的极值,可以通过不断地push来更新以push进去的数为末尾长度为k的最小值.实现方法 加入元素时,区间也在不断地向右移动,故若队首的位置小于区间的左端点,去掉队首. 或者当加入元素小于等于队首时(取区间最小值时),去掉队首,因为加入元素比队首小,且位置更靠后,后面还会有利用的机会,而队首左边的区间极值已经处理完毕,剩下的利用机会都和加入元素在一起,故去掉它毫无影

2017-10-24 10:22:43 198

原创 LightOJ - 1044 Palindrome Partitioning

题面题意 将一个字符串拆成多个,使每一个都是回文串。方法 因为长度小于等于1000,故n^3的算法会超时,应该用n^2的做法来做,若枚举在哪一个点将其拆成两半,必然超时。 dp[i]表示从首字符开始到i的次数,首先用n^2的做法枚举出回文串,并用这些回文串来更新dp:dp[j]=min(dp[j],dp[i-1]+1).代码#include&lt;bits/stdc++.h&gt;#defi

2017-10-23 22:59:53 220

原创 笛卡尔树

性质二叉树,其中的每一个点是整棵树的极值,且每一棵树的中序遍历是原数组的一段。 详见下图: 建树方法每次加入到树的最右节点,若不符合其规范,沿着右边那一条链向上找,将它插入到恰好符合的那一个点的左节点,并且将那一段不符合的点加入到新加入点的右子树,并且更新右边那一条链。 例题代码scanf(&quot;%d&quot;,&amp;amp;n); for(i=1;i&amp;lt;=n;i...

2017-10-23 20:35:38 494

原创 lightoj 1018 - Brush (IV) 【状压dp】

题面题意 给一些点,问最少可以用几条直线将他们全部覆盖.方法 因为n&amp;lt;=16,故方法为状压dp 首先预处理出任意两条直线所能覆盖的点,之后枚举来更新状态枚举方法 首先枚举状态(基本规律,这样效率更高),然后添加直线的一个端点为该状态下第一个未覆盖的点,枚举另外一个,并用这两点组成的直线来更新状态,这样复杂度仅为O(n*2^n) 若不先枚举状态,先枚举其中一个点,则无法利用

2017-10-23 17:23:20 291

原创 lightoj 1025 The Specials Menu (dp)

题面题意 给出一个,可以去掉若干个字符,使它变为回文串的方法有几种.方法 可以发现,任何一种操作都可以通过不断进行以下三种得到: 1.去掉第一个.dp[i][j]+=dp[i+1][j] 2.去掉最后一个.dp[i][j]+=dp[i][j-1] 3.两边都不去掉(在两端相同的情况下)dp[i][j]+=dp[i+1][j-1] 注意,一二操作同时进行时有重叠部分(

2017-10-23 15:59:32 200

原创 lightoj 1033 - Generating Palindromes

题面题意 给一个字符串,问最少加入多少个字符可以使它变为回文串.方法 可以从最左端和最右端开始比较,从两端入手(两端相同),dp[i][j]表示i到j这一段的最少次数,dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1,若两端相等则可以将结果与dp[i+1][j-i]比较. 主要是通过缩小范围来一步一步地推出答案代码#include&amp;lt;bits/stdc++.

2017-10-23 15:17:53 198

原创 light oj 1017 - Brush (III) (dp)

题面题意 有n个点,每一次用刷子刷的时候,可以将w行与x轴平行的点清除,问在k次内最多可以清除几个点.方法 方法此题的难点就在于如何转移状态,若用纵坐标来,则爆数组,故应该抓住只有n<=100个点,因为一定存在一个最优解中没有两次刷有相交部分,且每次刷的最下面一个点至少有一个点. 因此以最下面的其中一个点来表示怎么刷,并以dp[i][j]表示当前考虑到的最上面的一刷是i,还剩下j次.

2017-10-22 19:32:32 140

原创 乘法逆元

解释在两个数1/a,b modE的情况下,若两数同余.则b为a的逆元性质若a,b互为逆元,则k/a与k*b同余 并且当mod的数p为质数时,a与a^(p-2)互为逆元(费马定理),下为示例: 要求:(3/2)%5 2^(5-2)=8,8%5=3,故2和3互为逆元 (3/2)%5=(3*3)%5=4. 验证:4%5=4 -&amp;gt; (8/2)%5=4 -&amp;gt;(3/2)%5=...

2017-10-21 15:36:26 419

原创 三分法

解释 三分法,顾名思义,通过不断将一串数分为三段后精确范围. 相比于二分法,三分法还能实现对只有一个峰顶的函数的查找,如二次函数.而二分法只能查找单调递增的函数实现方法 设左右端点为l和r,则找两个点(m1=(l+r)/2,m2=(l+r)/4+m1),根据m1,m2的大小来判断峰顶可能的范围,并从而起到精确的作用. 一般情况下,可以确定一个三分法次数,例如50,因为一般这样三

2017-10-21 13:40:45 538

原创 Histogram LightOJ - 1083(RMQ)

题面题意 有一串由矩形组成的图,先要求出这幅图中所能容纳的最大矩形的面积总体思路 求出以各个小矩形高度为宽所能达到的最大面积,此时我们称这个最大矩形被这个小矩形统治,我们只需求出每一个小矩形统治的最大矩形的左端点和右端点.法1(单调栈)方法解释 让矩形依次入栈,当入栈矩形小于栈顶时,说明此时的栈顶不能统治该矩形,其右端点即为入栈矩形的位置-1.最后将让元素全部出栈,它们的右端点均为这

2017-10-21 13:20:46 267

原创 单调栈

解释 单调栈就是一个栈中的所有元素都依次递增(或递减),若入栈元素不符合,则不断出栈(根据题目记录下需要信息),直到它符合条件,并根据题意记录需要信息,最后让元素全部出栈并记录信息. 可以先向栈加入一个为0或为无限大的元素(据增减性而定),使当栈为其他元素时,任意元素都可以进栈,而省去了对栈顶是否为空的判断. 最后让所有元素出栈时,也可采用相同方法,加入一个极端元素来实现.

2017-10-21 13:07:28 226

原创 快读(快速读入)

解释因为getchar()比scanf要快,故为了加快读入,可以用getchar()代替scanf.思路利用getchar()将数字读入,若为” “或”\n”结束,第一个字符判断一下数字的正负,然后每读入一个数字就将当前数*10并加上它代码1.inline int read() { char ch = getchar(); int x = 0, f = 1; ...

2017-10-20 18:48:14 18870 1

原创 二维前缀和

解释 二维前缀和用于计算在矩阵中的任意一个矩形中数字之和,若仅用两个for将其中的所有元素相加,处理所有矩形必然超时,正确做法的复杂度为O(m*n).方法 首先预处理处以所有点为右下角,(1,1)为左上角的矩阵中的元素和. 接着(x1,y1)为右下角,(x2,y2)为左上角的矩形中的元素和为f[x1][y1]+f[x2-1][y2-1]-f[x1][y2-1]-f[x2-1][y1]

2017-10-20 18:35:51 9147

原创 SGU - 199(最长不下降子序列)

题面题意 输入n对数,选择尽可能多对,使任意两对中其中一对的两数比另外一对.思路 按第一个数的大小排列,找出另外一个数的最长不下降子序列错误方法(TLE) 用dp思想,仅讨论当前数选择或不选择,选择结果,之前比它小的数的结果+1. 复杂度为O(nlogn)代码#include<bits/stdc++.h>#define N 100100using namespace st

2017-10-19 19:27:18 525

转载 vector的用法

介绍 vector是C++标准模板库,是一个容器,可以理解为动态数组。 命名空间为std,所属头文件为 注意:不是 < vector.h > vector存储数据时,会分配一个存储空间,如果继续存储,该分配的空间已满,就会 分配一块更大的内存,把原来的数据复制过来,继续存储,这些性能也会一定程度上会>有损耗。vector常用方法1.容量 a.vector大小:vecto

2017-10-18 20:59:54 295

原创 Tian Ji -- The Horse Racing HDU - 1052 (贪心,dp)

题面题意 给出长度为n的两串序列,两两匹配,第一串中的大得200分,小扣200分,平局,不得分,输出最大分数方法 如果仅用单一的贪心: 平局时,出最大的数: 反例如下 2 1 3 2 3 答案是0,但用贪心将输出-200 平局时出最小的数: 反例如下 3 1 2 3 1 2 3 正确答案是200,但却会输出0

2017-10-18 18:17:01 229

原创 八数码 HDU - 1043(状态压缩,宽搜)

题面题意 3*3的方格中有一个x,可以将x与它相邻的方块交换,使最终结果为 1 2 3 4 5 6 7 8 x方法 用康拓展开式的方法,状压(也可以采用哈希表),然后通过不断的转换实现用1~362880(9!)来记录3*3中数字的状态 记录时,用9来代替x 再进行宽搜(从最终状态开始),用一个数组来记录达到各个状态之前的状态,并用另一个数组记录这次的移动代码

2017-10-18 18:01:58 505

原创 POJ - 2411 (状压dp)

题面题意 输出用1*2的矩形填满m *n的矩形的方法数方法 状态压缩,用二进制数表示每一层,枚举当这一层上面全部被填满后该状态的种类数,并且预先处理好上一层为哪些状态时,可以转化为这一层,其中限定每一层只有横着放和竖着(穿过这一层和上一层)两种方法,故若两层对比时,两边的同一格都未放则无法转化,若两层的同一个都放了的这些位置的长度为奇数时,也不行. 最后每行枚举上一行可以的状态,并相

2017-10-16 19:04:55 352

原创 初赛复习7

错题 下面那个操作系统不属于多用户操作系统(A)? A.Windows ME B.Windows 10 C.Unix D.Linux 单用户、多用户。根据在同一时间使用计算机用户的多少,操作系统可分为单用户操作系统和多用户操作系统。单用户操作系统是指一台计算机在同一时间只能由一个用户使用,一个用户独自享用系统的全部硬件和软件资源,而如果在同一时间允许多

2017-10-14 12:42:53 214

原创 初赛复习6

图的相关概念二叉树树的根节点的深度一般为0; 1.满二叉树:除最后一层外,每一层上的所有结点都有两个子结点。 大意为:如果一棵二叉树的结点要么是叶子,要么这个结点有两个孩子结点,这样的树就是满二叉树。 在满二叉树中,每一层上的结点数都达到最大值,即在满二叉树的第k层上有2^k个结点,且深度为m的满二叉树有2^(m+1)-1个结点。 2.完全二叉树:若设二叉树的深度为h,除第

2017-10-14 11:36:55 212

转载 初赛复习5

二分图的相关概念1.点覆盖、最小点覆盖 点覆盖集:一个点集,使得所有边至少有一个端点在集合里,或者说是“点” 覆盖了所有“边”. “极小点覆盖:本身为点覆盖,其真子集都不是。 最小点覆盖:点最少的点覆盖。 点覆盖数:最小点覆盖的点数。2.边覆盖、极小边覆盖 边覆盖集:一个边集,使得所有点都与集合里的边邻接,或者说是“边” 覆盖了所有“点”。

2017-10-14 11:15:21 219

原创 初赛复习4

错题及资料1.新一代互联网使用的IPv6标准是IPv4标准的升级与补充。2.TCP/IP是互联网的基础协议簇,包含有TCP和IP等网络与传输层的通讯协议。3.不同厂家生产的CPU所能处理的指令集是相同的。4.奇偶校验只能判断数据在传输中是否出错,不能精确到某一位5.一个平面的法线是指与该平面垂直的直线。过点(1,1,1)、(0,3,0)、(2,0,0)的平面的法线是( )。 A.过点(1,1,

2017-10-13 18:19:15 590

空空如也

空空如也

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

TA关注的人

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