- 博客(19)
- 收藏
- 关注
原创 模意义下的高斯消元
求解线性方程组是一个基础的问题,但如果是在模意义下,事情就没有那么简单了。现在给出一个方程组和模数(是一个质数),如何解出这个方程组呢(保证有唯一一组整数解)?首先,因为我们使用了整形数组来存储数据,计算中就不允许出现小数点,我们可以把两行各乘上一个数后(要保证主元被消去)再进行相减,而且相减的过程要在模意义下进行。注意,设相减的结果为,如果只是令,是存在问题的,因为可能是一个负数。那么令是否可行...
2018-08-26 11:43:45
2095
原创 [NOI2005]聪聪和可可:概率期望
首先观察数据范围,发现,考虑以的时间复杂度预处理出,表示当聪聪在点,可可在点时,聪聪下一步到达的点。我们可以从每个点开始,通过一遍bfs求出。代码如下。for(int i=1;i<=n;i++){ memset(dis,0,sizeof(dis)); head=tail=0,dis[i]=1,go[i][i]=i; for(int j=first[i];j;j=next[j])...
2018-08-25 17:18:10
298
原创 快速幂和矩阵快速幂
一、快速幂快速幂是一种用于快速计算出(因为太大,通常需要对一个数取模)的算法。因为较为基础,在此不多做讲解。主要原理:,,。因为指数在每次运算中都会缩小一半,时间复杂度为。代码如下。int ksm(int a,int k,int p){ if(!k) return 1; int tmp=ksm(a,k/2,p); if(k%2) return tmp*tmp*a%p; retu...
2018-08-21 10:55:08
5565
1
原创 [XXOJ1426]cactus:tarjan算法
题意简述:给定一张有向图,判断是否满足:它是一个强连通图且每条边都属于且仅属于一个环(即仙人掌)。刚看到这道题,以为仙人掌和欧拉回路有什么神奇的关系,于是把判断欧拉回路的代码交上去,WA到40分...那么我们想想靠谱的做法。首先,判断一张图是否是强连通图是很简单的事情,只要跑一遍tarjan,判断强连通分量个数是否为1即可。如何判断每条边是否都属于且仅属于一个环呢?既然我们已经跑过一遍tarj...
2018-08-16 23:19:48
528
原创 [XXOJ2902]导出子图:拓扑排序
题意简述:给定一张无向图和一个数,求一个最大的子图,使得删掉原图中其他点后,子图中每个点的点度都大等。要求输出子图大小和子图中的每个点,若无解输出,若存在多解输出任意一组解。题目让我们求一个子图,最直接的方法自然是构造,但我们一时想不出有效的构造方法。怎么办呢?我们换一种思路。设想整张图中每个点的点度都大等,我们直接把原图输出就可以了,但肯定有些点的点度小于,我们只好把它们删除。是不是删除这些...
2018-08-15 16:24:09
862
原创 floyd算法的简单应用
算法是用于求所有点对之间最短路的经典算法,但它的用途并不限于最短路。例一、无向图的最小环问题:给定一张无向图,求经过至少三个点且长度最短的环的长度(点数)。我做这题时并没有想到用算法,导致了严重的后果。看来,凡是点数很少的最短路题,都不能忘了算法啊!在算法的运行过程中,我们先枚举必经点,再枚举起点和终点,在三个点两两不同的情况下,求出的最短路不就会经过三个点了吗?在枚举到点时,中存储的是从...
2018-08-14 17:18:17
1230
原创 [BZOJ2730]矿场搭建:割点
这道题虽然看着像是道模板题,实际上有很多要注意的特殊情况。我们对坍塌的点进行分类讨论。如果坍塌的点不是割点,显然不会影响图的连通性,也就不会影响其他人的逃生。考虑最简单的情况:一张图没有割点。我们是不是只需要个出口就够了?并非如此,因为可能坍塌的点就是出口...因此,我们需要再设个出口作为备用,个数为,方案数为(为点数)。如果有割点怎么办?先来看一个最简单的例子:——。如果坍塌的点为,我们需要...
2018-08-14 09:31:44
280
原创 寻找欧拉回路的实现细节以及优化
欧拉回路是一个经典的图论问题,它虽然简单,但还是有一些需要注意的细节。由于篇幅限制(手动滑稽),在这里只详细讲一个最重要的问题:把点加入答案的顺序。错误代码如下。void dfs(int x){ ans[++top]=x;//最直接的思路:每dfs到一个点就加入栈中 for(int i=first[x];i;i=next[i]) if(!vis[i]) vis[i]=1,dfs...
2018-08-13 16:24:33
1111
原创 [BZOJ4415]发牌:线段树二分
题目中的销牌操作看起来不太好理解,但其实,这种操作和环形结构有着异曲同工之妙。我们维护一个变量表示当前牌库顶的牌,每次销牌时,令,因为是环形结构,所以我们还要对取模,模数为当前牌数。问题来了,每次销牌过后都要取走牌库顶的牌,因此模拟销牌操作时需要逐一判断当前的牌是否已经被取走(还要开一个数组),这样显然会超时。这时我们就需要转换思路,我们发现,改变的值后,我们要取的牌就是当前牌库(假设我们已经取走...
2018-08-09 16:34:48
176
原创 [BZOJ2212]二叉树:线段树合并
这道题给人的第一感觉像是树形,我们可以按照树形的思路进行递归处理,统计一个结点左右子树贡献的答案时,我们分别算出是否交换左右子树的答案,取较大值并向上更新(这样是符合最优子结构的)。问题来了,我们如何快速把两棵子树合并并把答案贡献到父节点呢?线段树可以做到。为了让线段树支持合并操作,我们不能再用堆式的存储方法,而要使用动态开点的方法。我们以原二叉树中的每一个叶子节点为根建立线段树,注意我们建立的是...
2018-08-08 15:47:01
338
原创 [BZOJ4003]城池攻占:可并堆+lazy tag
首先,这道题有非常简单的暴力写法,只要对每个人暴力一步步往上走即可。如何优化暴力呢?最容易想到的方法是加速转移过程,即倍增,但空间貌似不太够...那么我们从另一个角度考虑:利用重复的信息。同一段路可能被很多人走过,造成了极大的时间浪费,我们可以考虑把要走同一段路的人集中在一起,这样只要走一次,就能同时判断每个人能否走下去了。怎么操作呢?我们以每一个城池为根建立小根堆,堆中的元素是一个个骑士的战斗力...
2018-08-08 12:03:58
228
原创 树形背包例题及实现技巧
一、选课(模板题)在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有门功课,每门课有个学分,每门课只有一门或没有直接先修课(若课程是课程的先修课即只有学完了课程,才能学习课程)。一个学生要从这些课程里选择门课程学习,问他能获得的最大学分是多少?第一行有两个整数,(,)。接下来的行,第行包...
2018-07-31 23:29:17
3872
原创 [FJOI2004]方舟连接:区间dp
方舟集群要进行第一次组合连接,使任意两个方舟之间都有通路连接。如果把现在的海域看作一个坐标系,那么x轴的正方向朝向正东,y轴的正方向朝向正北,在连接计划的开始,你可以选择海上或者方舟上的任意一点作为初始平台。坐标系上的整点都带有连接平台。出于安全性的考虑,一条通路的端点只能由连线平行于坐标轴的两个连接平台组成并且只能由已被初始平台连接的平台向正北和正东方向延伸。幸运的是,方舟排布是有规律的,对于编...
2018-07-30 16:30:20
487
原创 动态规划之滚动数组和枚举顺序
简单题:给定两个字符串,,长度分别为,,求它们的最长公共子串。这是一道经典的水题,设表示以,结尾的最长公共子串的长度,代码如下。int dp[maxn][maxn];for(int i=1;i<=l1;i++) for(int j=1;j<=l2;j++) if(s1[i]==s2[j]) { dp[i][j]=dp[i-1][j-1]+1; if(dp[i]...
2018-07-25 12:34:50
735
原创 AC自动机的优化及经典例题
自动机是一种用于解决多模式串匹配问题的工具。模板题:给定个模式串和个母串(由小写字母组成),将母串中包含模式串的部分变为号。判断一个串是不是另一个串的子串,我们首先会想到算法,但算法需要逐个处理每一个模式串,太大时显然会超时。这时,自动机便派上了用场,它的核心也是熟悉的数组,我们可以把它看做树上的。首先,我们把所有模式串加入一棵树中(注意,我们要把树的根结点设为,原因下面会说),接着,我们...
2018-07-22 20:41:10
3095
原创 序列自动机(一个数组而已...)及经典例题
表示在原串第位后面的第一个出现的位置,设串长为,字符集大小为,预处理时间复杂度为,代码如下。for(int i=n;i;i--){ for(int j=1;j<=a;j++) next[i-1][j]=next[i][j]; next[i-1][s[i]]=i;}求子序列个数代码如下(加上记忆化,以避免同样的状态被计算多次)。int dfs(int x){ if(...
2018-07-21 16:15:28
7732
5
原创 BZOJ3012:trie树+拓扑排序
看到这题,最直接的想法就是枚举字典序(全排列),但个字母就有种全排列,显然会超时。考虑一个串字典序不可能最小的情况,有如下两点:1、不能有另一个串是它的前缀,如的字典序永远大于。2、字母之间的大小关系不能自相矛盾,举个例子:,,三个串中,的字典序不可能最小。因为如果的字典序最小,那么的字典序小于,即的字典序小于,且的字典序小于,即的字典序小于(要使串的字典序小于串,应找到两串第一个不相...
2018-07-21 10:07:57
287
原创 读入优化,减小常数!
读入优化虽好,千万不要写挂!一、保证数据非负写法1int read(){ register char ch=getchar();register int in=0; while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9') in=(in<<3)+(in<&l...
2018-07-20 14:52:36
268
原创 变量的存储与转换
一、变量范围int:,unsigned int:,long long:,unsined long long:,二、变量转换char转int:char a;int b;b=a-'0';int转long long:int a;long long b;b=1ll*a;long long乘(或除以)常数(如2):long long a;a*=2l...
2018-07-19 20:48:37
239
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人