10 2015 档案
摘要:分析:三个01组合只有八种情况:000 s001 s010 0011 s100 s101 1110 s111 s可以看出只有010,101是不稳定的。其他都是稳定的,且连续地出现了1或0,标记为s。考虑连续的不稳定串的,例子:11010100 s s 110100 s ...
阅读全文
摘要:O(1)变换映射,最后一次性替换。#includeusing namespace std;typedef long long ll;const int LEN = 2e5+5;char s[LEN];char mp[26];int pos[26];//#define LOCALint main(){...
阅读全文
摘要:简单的物理问题,x = pt, y = l - qt。令x == y解出t,然后得出相遇位置。#includeusing namespace std;typedef long long ll;//#define LOCALint main(){#ifdef LOCAL freopen("in....
阅读全文
摘要:在 C++中,库的地位是非常高的。C++之父 Bjarne Stroustrup先生多次表示了设计库来扩充功能要好过设计更多的语法的言论。现实中,C++的库门类繁多,解决的问题也是极其广泛,库从轻量级到重量级的都有。不少都是让人眼界大开,亦或是望而生叹的思维杰作。由于库的数量非常庞大,而且限于笔者水...
阅读全文
摘要:今天学习一下矩阵的基本算法高斯消元是解线性方程组的有力工具。基本思想是通过将增广矩阵经过行初等变化变成简化阶梯形矩阵。下面采用的是列主元高斯消元法,复杂度为O(n^3)。很容易根据高斯消元法的过程得出行列式和秩的算法。代码:/*************************************...
阅读全文
摘要:x = lcm/gcd,假设答案为a,b,那么a*b = x且gcd(a,b) = 1,因为均值不等式所以当a越接近sqrt(x),a+b越小。x的范围是int64的,所以要用Pollard_rho算法去分解因子。因为a,b互质,所以我们把相同因子一起处理。最多16个不同的因子:2,3,5,7,11...
阅读全文
摘要:这条链依次乘一个因子。因为n#include#include#include#include#include#include#include#include#include#include#include//#includeusing namespace std;typedef long long ...
阅读全文
摘要:题意:一个4位的素数每次变动一个数位,中间过程也要上素数,问变成另一个的最小步数。线性筛一遍以后bfs就好。我写的双向,其实没有必要。#include#include#include#include#include#include#include#include#include#include#in...
阅读全文
摘要:今天学习一下Miller-Rabbin素性测试 和Pollard_rho整数分解。两者都是概率算法。Miller_Rabbin素性测试是对简单伪素数pseudoprime测试的改进。(pseudoprime测试, POJ 3641pseudoprime numbers简单伪素数pseudoprime...
阅读全文
摘要:今天开始学习一下算导上的数论算法,做一点笔记。一些符号约定:d|a 表示d整除a,模n的等价类 [a]n= {a+kn: k属于Z}, 模n的完全剩余系则是这些等价类的集合 Zn ={[a]n:0≤a≤n-1},每个等价类都用最小的非负元素来表示则有 Zn={0,1,..,n-1}公约数和最大公约数...
阅读全文
摘要:
二项分布,期望,快速幂
阅读全文

摘要:
挑战程序设计竞赛 2.1 搜索。
生成排列,最优性剪枝
阅读全文

摘要:
挑战程序设计竞赛 2.1 搜索。 杨辉三角,组合数
阅读全文

摘要:
挑战程序设计竞赛 2.1 搜索。
dfs,stl,unique
阅读全文

摘要:
bfs,康托展开,逆康托展开
X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[2]*1!+a[1]*0!
阅读全文

摘要:
挑战程序设计竞赛 2.1 搜索。bfs
阅读全文

摘要:
挑战程序设计竞赛 2.1 搜索。 dfs,最优性剪枝,也可迭代加深
阅读全文

摘要:
挑战程序设计竞赛 2.1 搜索。
dfs,剪枝
阅读全文

摘要:
挑战程序设计竞赛 2.4 数据结构。
DisjointSet并查集变形,离线,逆序思考
阅读全文

摘要:
挑战程序设计竞赛 2.4 数据结构。
DisjointSet并查集,等价关系
阅读全文

摘要:
并查集,两个优化效果测试,预处理
阅读全文

摘要:
贪心,二叉堆BinaryHEAP,二分,用堆维护前k大数
阅读全文

摘要:
有关区间的贪心,堆(优先队列)
阅读全文

摘要:
背包,滚动数组,数组负下标的处理,贪心
阅读全文

摘要:
LIS的等价表述,单调匹配,O(nlogn)
阅读全文

摘要:
dp的和号优化,10^36范围整数的处理
阅读全文

摘要:
dp和号优化,多种不可区分物品方案统计
阅读全文

摘要:
挑战程序设计竞赛 2.3 动态规划。需要稍加思考
序列dp,贪心,离散,递推min优化,滚动数组。
阅读全文

摘要:
挑战程序设计竞赛 2.3 动态规划。需要稍加思考的题目。
dp转移顺序,定义优化,多重背包判断存在性
阅读全文

摘要:
挑战程序设计竞赛 2.3 动态规划 需要稍加思考的题目。
Dilworth定理,偏序,LIS
阅读全文

摘要:
挑战程序设计竞赛 2.3 动态规划 优化递推关系。
多重背包,倍增,优化定义,单调队列,同余划分,迷之小优化
阅读全文

摘要:在所有避难所都有至少一只队伍的情况,总移动距离最小。把队伍的位置和人都排序。会发现,对于最后一个队伍i和最后一个避难所j,Case 1:pos[j]>=pos[i],那么i是距离j最近的一只队伍,Case 2:pos[j]<pos[i],那么j是距离i最近的一个避难所。dp[i][j]表示第i个人,...
阅读全文
摘要:A Cdgamebrute force...BDrbalance贪心,每次选最前面的-变成+,相当于后面所有的负值+2。CTreestrat考虑集中去抓一个Red Token,以这个Token为根把树提起来,以B的Token为的根的子树是走不到,(树形很重要)而且走不到的结点只会越来越多。求出B中结...
阅读全文
摘要:区间dp,两个str一起考虑很难转移。看了别人题解以后才知道是做两次dp。dp1。str1最坏情况下和str2完全不相同,相当于从空白串开始刷。对于一个区间,有两种刷法,一起刷,或者分开来刷。规定[i][i-1]为空串,这样一起刷可以归结为第二种情况。合并的时候,大的区间的次数using names...
阅读全文
摘要:动态区间询问kth,单点修改。区间用线段树分解,线段树上每条线段存一颗平衡树。不能直接得到kth,但是利用val和比val小的个数之间的单调性,二分值。log^3N。修改则是一次logN*logN。总体是Nlog^2N+Mlog^3N。一个值可以对应多个名次。每次查询严格小于val的个数。把之前的T...
阅读全文
摘要:题目要求可转化为查询一个区间内有多少数比val大(或者小)。区间用线段树分解(logN),每个区间维护一rank树。rank可用BIT查询,往BIT里面插值,为了保证不同区间的BIT互不影响要先离散。首先进行分治,分治的同时归并排序完成离散并计算保存出每个元素和其他元素构成的逆序对iv[i]。(据说...
阅读全文
摘要:A,水题不多说。#includeusing namespace std;//#define LOCALint main(){#ifdef LOCAL freopen("in.txt","r",stdin);#endif int n,t; scanf("%d%d",&n,&t); i...
阅读全文
摘要:题意:求树上的一条费用不超过m的路径,使得总长度尽量大。人参第一发树分治,紫书上思路讲得比较清晰,这里不再赘述。实现的时候,用一个类似时间戟的东西,记录结点首次访问的时间,并保存结点序列。合并的时候用map组织有序表。和Defense Lines类似复杂度O(nlog^2n)#includeusin...
阅读全文
摘要:当两个城市之间有安全的道路的时候,他们是互相可到达的,这种关系满足自反、对称和传递性,因此是一个等价关系,在图论中就对应一个连通块。在一个连通块中,当前点是那个并不影响往其他连通块的点连边,因此只要记录当前连通块内有哪些点。nusing namespace std;const int maxn = ...
阅读全文
摘要:难点在于状态设计,从左向右一本书一本书的考虑,每本书的决策有两种拿走或者留下,对于拿走后的书,之后要放回,但是决策过程中不知道到往哪里放,虽然前面的书的种类确定,可能是往后面放更优,而后面的书的类型还不确定。对于所有拿出来的书,最后会增加多少段只和书的种类有关。所以我们用s记录留下书的种类,等到所有...
阅读全文
摘要:和Heroes Of Might And Magic 相似,题目的询问是dp的一个副产物。距离是不好表示成状态的,但是可以换一个角度想,如果知道了从一个点向子树走k个结点的最短距离,那么就可以回答走x距离能访问到的最大结点数量。当访问了一棵子树,想要访问子树外的结点时,一定要先从子树的根结点出来。状...
阅读全文
摘要:容易想到dp[i][j]表示在第i行j个路口的开始走最大高兴值。每次可以向左走,或者向右边走,然后向北走。(或者直接往北)向左走到,状态转移为dp[i][j] = dp[i][k] + happy[i][k][j](为了方便处理,i从1开始编号,0行dp值存0)处理出前缀和,happy[i][k][...
阅读全文
摘要:题意即求一个最小顶点覆盖。对于没有孤立点的图G=(V,E),最大独立集+最小顶点覆盖= V。(往最大独立集加点)问题可以变成求树上的最大独立集合。每个结点的选择和其父节点选不选有关,dp(u,1)表示父节点选,这时u不可选,dp(u,0)表示父节点不选,这时u可选可不选。#includeusing ...
阅读全文
摘要:为了方便打印路径,考虑从下往上转移。dp[i][j][S]表示在i行j列总和为S的方案,dp[i][j][S] = dp[i+1][left][S-x]+dp[i+1][right][S-x]方案O(2^2*n-1),结果要用long long保存。#includeusing namespace s...
阅读全文
摘要:A[i][j]表示在循环节下标i开头j结尾的最长不减子序列,这个序列的长度为p,另外一个长度为q的序列对应的矩阵为B[i][j],将两序列合并,新的序列对应矩阵C[i][j] = max(A[i][k]+B[k][j])。非法的情况标记为-INF,用倍增加速。#includeusing namesp...
阅读全文
摘要:对角线上的元素就是a[i],而且在所在行和列中最大,首先可以确定的是最大的元素一定是a[i]之一,这让人想到到了排序。经过排序后,每次选最大的数字,如果不是之前更大数字的gcd,那么只能是a[i]之一。div2路漫漫。。。#includeusing namespace std;typedef int...
阅读全文
摘要:分析:对于网格grid[i][j]如果放向上的管道,那么grid[i][k], k>j 就只能放向上的管道了。那么定义dp[i][j]表示第i行,最后一个放向左的管道是j的最大总矿量。j = 0表示全放向上,j = m表示全放向左。如果grid[i][j]要往放向上的管道的话,前提是grid[i-1...
阅读全文
摘要:分析:如果问题是要求最后一个删除的数,重新编号为0到n-1,f[n]表示答案,那么f[n] = (f[n-1]+k)%n。因为删掉下标k-1以后可以从下标k重新编号为0。在这个问题只需要推出最后三个数,然后三个数一起转移即可。单个case的复杂度O(n)#includeusing namespace...
阅读全文
摘要:分析:状态是一些有序的集合,这些集合互不相交,并集为所有区域。显然枚举集合元素是哪些是无法承受的,写出期望的计算式,会发现,当每个集合的大小确定了以后,概率大的优先访问是最优的。因此先对u从大到小排序。定义状态f[i][j]表示从j开始往后分i组的最小期望。转移是枚举划分k,则有f[i][j] = ...
阅读全文
摘要:把消灭了那些机器人作为状态S,预处理出状态S下可以消灭的机器人,转移统计方案。方案数最多16!,要用64bit保存方案。#includeusing namespace std;const int Mx = 16, maxs = 1>i&1) continue; if(canAtk[S]...
阅读全文
摘要:贪心,对于一个修饰关系可以连一条有向边,在合并的时候,子节点的序列一定是连续安排的,因为如果有交叉,交换以后一定更优。然后一个序列一个序列的考虑,长度短的应该在前面,否则同样交换以后更优。因此排序以后统计就行了。数据理论最多递归1e6层,dfs爆栈了,手写栈模拟递归。。。#includeusing ...
阅读全文
摘要:最长回文子序列可以用求解原串s和反转串rv的LCS来得到,因为要求回文串分奇偶,dp[i][j]保存长度,要求字典序最小,dp[i][j]应该表示回文子序列的端点,所以边界为单个字符,即i+j=len+1。这题最麻烦的地方在于字典序,我是写了个比较函数,有点暴力(常数大)。也可以反着定义,这时结点就...
阅读全文
摘要:把有向图修改成无向图,并保证每条边的流量守恒并满足有向容量(即abs(flow(u,v) - flow(v,u)) using namespace std;const int N = 301,M = N*(N-1);int n,m;int hd[N],nx[M],to[M],cap[M],ect;i...
阅读全文
摘要:状压以后,直接暴力枚举,2^20约等于1e6,而且满足bitcount = m的状态很少。#includeusing namespace std;const int maxn = 20+1;double x[maxn],y[maxn],z[maxn];double d[maxn][maxn];dou...
阅读全文
摘要:根据概率公式dfs即可,判断和区间[T-E,T+E]是否有交,控制层数。#includeusing namespace std;int K,R,L;double P,E,T;double Lt,Rt;double dfs(double L,double R,int k = 0){ if(RRt...
阅读全文
摘要:因为第i个人休息j次服从二项分布,算一下组合数。数据范围小。求出第i个人休息j次的概率和对应的时间之后,全概率公式暴力统计。#includeusing namespace std;const int maxn = 101,maxm = 51;int P[maxn],T[maxn],V[maxn];l...
阅读全文