摘要:用vector进行插入和删除操作! 总是有些地方处理不好,对拍了才知道错在哪里,,
阅读全文
摘要:/* 古代猪文:Lucas定理+中国剩余定理 999911658=2*3*4679*35617 Lucas定理:(m,n)=(sp,tp)(r,q) %p 中国剩余定理:x=sum{si*Mi*ti}+km 先求出sum{C(d,n)}%p[i]=a[i] */ #include using namespace std; #define ll long long #define mod ...
阅读全文
摘要:https://www.luogu.org/problemnew/solution/P4778 非常好的题目,囊括了乘法加法原理和多重集合排列,虽然最后使用一个结论解出来的。。 给定一个n的排列,用最少的次数将排列变成单调递增请问这样的操作有多少种 套路:位置i向位置p[i]连单向边,最后会形成l个
阅读全文
摘要:#include using namespace std; #define mod 10007 int inv[10008]; int f[3005],invf[3005];//阶乘,阶乘逆元 void init(){ inv[0]=inv[1]=1;//线性逆元打表 for(int i=2;i>=1;a=(long long)a*a%mod; } retu...
阅读全文
摘要:进阶指南上的做法是分块的。。 但是线段树搞起来也挺快,将磁石按照距离排序,建立线段树,结点维护区间质量最小值的下标 进行拓扑,每次在可行的范围内在线段树中找到质量最小的下标取出,取出后再将线段树对应的点设置成0 查询时找区间不为0最小值的下标即可
阅读全文
摘要:/* 查询区间众数,要求强制在线 设有T个块 1.众数只可能在大块[L,R]里或者两端[l,L) (R,r]里出现 2.大块的众数只要预处理打表一下即可,复杂度n*T(这样的区间有T*T个) 3.两端的众数需要枚举每个元素,然后查询这个元素在区间[l,r]里出现的次数 用一个vector记录每个值出现的位置,然后用二分找其在区间[l,r]出现的次数即可 这部分每次查...
阅读全文
摘要:1.区间更新单点查询 2.区间求小于c的数的个数:先预处理,即把每块的元素sort一下,整块修改用add标记,查询用lower_bound,两端修改后用sort维护,查询暴力统计即可 注意要把add当做块的属性,而不要下放到块中的元素里去 3.区间更新+找区间内小于c的最大的数(c的前驱) 块设为s
阅读全文
摘要:是个以前没见过的模板题。。 我用比较复杂度方式过掉了。。 构造一个十叉树(有点trie的味道)来存数字,然后字典序就是先序遍历的结果
阅读全文
摘要:比较复杂的一题。。 不管是二分答案还是直接做,都需要压缩树链
阅读全文
摘要:e没学过做不出来。。 处理合法的区间很麻烦,但是处理非合法的区间很容易 答案就是所有的取法-不合法的区间 这题一定要双边界推进处理!!!! 一开始用单边界向右推进,结果后来发现错了,拿样例1就可以证明 所以先预处理出左边界和右边界
阅读全文
摘要://组合数打表模板,适用于N<=3000 //c[i][j]表示从i个中选j个的选法。 long long C[N][N]; void get_C(int maxn) { C[0][0] = 1; for(int i=1;i<=maxn;i++) { C[i][0] = 1; for(int j=1;j<=i;j++) ...
阅读全文
摘要:/* 构造转移矩阵: 先推公式: 首先是第0行:A[0][j+1]=A[0][j]*10+3 1-n行: A[i][j+1]=A[i][j]+A[i-1][j+1]=... =A[i][j]+A[i-1][j]+...+A[1][j]+A[0][j+1] 所以第j+1行状态可以由第j行通过乘上一个转移矩阵得到 那么就是转移矩阵的构...
阅读全文
摘要:给定n个整数,将数分解成01序列,由这n个01序列构成矩阵,这n个数构成线性空间,这就是异或空间 将这个矩阵高斯消元,求出t个主元,那么由着t个主元构成的线性空间里总共有2^t个数 设这t个数分别是a1,a2,a3,a4,...at,每个数代表的主元为二进制上的一位1,显然选a1的情况组成的数,必定
阅读全文
摘要:线性空间:是由一组基底构成的所有可以组成的向量空间 对于一个n*m的矩阵,高斯消元后的i个主元可以构成i维的线性空间,i就是矩阵的秩 并且这i个主元线性无关 网上找到一中贼快的高斯消元写法。。以后就用它了 思路是枚举矩阵上的每个元素,对于每个非0的A[i][j],如果A[i][j]可以作为主元,那么
阅读全文
摘要:高斯消元结束后,若存在系数为0,常数不为0的行,则方程无解 若系数不为0的行有k个,则说明主元有k个,自由元有n-k个,方程多解
阅读全文
摘要:那么下面就是高斯消元的模板,其中C是系数矩阵,B是常数矩阵 标准板子
阅读全文
摘要:/* 构造单位矩阵(转移矩阵) 给定n*m网格,每个格子独立按照长度不超过6的操作串循环操作 对应的操作有 0-9:拿x个石头到这个格子 nwse:把这个格子的石头推移到相邻格子 d:清空该格石子 开始时网格是空的,问t秒后石头最多的格子里有多少个石子 t很大,并且每次操作后格子里的石头是线性变化的,所以用矩阵来加速递推 将n*m网格表示成为(i-1)*m+j的一维数...
阅读全文
摘要:第一题会卡一下同时用set和cin。。 其他的注意下矩阵对角线下标的应用即可 e也太难了。。留个坑吧 补坑。。区间覆盖线段树调了半天,最后发现有个地方没写long long ...气死我了. 所以总结一下,,区间覆盖和区间更新的pushdown还是有点差距的,,还有本题的lazy初始值要设为INF
阅读全文
摘要:#include #include #include #include #include #define Maxn 300010 #define maxn 300005 using namespace std; #define ll long long struct edge{ int to,w,nxt; }edge[Maxn]; int head[Maxn/3],tot; void a...
阅读全文
摘要:/* 给定一棵树,树上会出现宝物,也会有宝物消失 规定如果要收集树上所有宝物,就要选择一个点开始,到每个宝物点都跑一次,然后再回到那个点 现在给定m次修改,每次修改后树上就有一个宝物消失,或者一个宝物出现 请问在这次操作后,按规则跑一次找到所有宝物的最短路径长度 显然按规则跑一次找宝物经过的路径长度,就是从根节点开始dfs一次这些点再回到根节点的路径长度 那么需要将这条路径分解: ...
阅读全文
摘要:/* 给定n个点的树,在其中加入m条新边(称为非树边) 现在可以割断一条树边,一条非树边,使图分裂成两个联通块,请问有几种切割方式 对树边进行分情况讨论 如果树边不处在环中,则割断这条树边后可以割断任意条非树边 如果树边仅仅被一个环包含,则割断这条树边后只能割断一条非树边,即环中的那条非树边 如果树边被两个及以上环包含,就不可能有合法的切割方式 那么考虑如何计算树边被...
阅读全文
摘要:/* 给定n个点的树,在其中加入m条新边(称为非树边) 现在可以割断一条树边,一条非树边,使图分裂成两个联通块,请问有几种切割方式 对树边进行分情况讨论 如果树边不处在环中,则割断这条树边后可以割断任意条非树边 如果树边仅仅被一个环包含,则割断这条树边后只能割断一条非树边,即环中的那条非树边 如果树边被两个及以上环包含,就不可能有合法的切割方式 那么考虑如何计算树边被...
阅读全文
摘要:直径上的乱搞一般要求出这条直径上的点集或者边集 bzoj1999:对直径上的点集进行操作 bzoj1912 负权树求直径(只能用树形dp),然后记录直径上的边来回溯到两端点,同时将直径上的边权变负
阅读全文
摘要:第一种:树上倍增 f[x,k]表示x的2^k辈祖先,即x向根结点走2^k步达到的结点。 初始条件:f[x][0]=fa[x] 递推式:f[x][k]=f[ f[x][k-1] ][k-1] 一次bfs预处理f数组(nlogn),然后每次询问都可以在(logn)时间内求出x,y的lca 求lca的步骤
阅读全文
摘要:通过回溯法可以求出直径的两个端点,同时注意有负权边的树求直径不可以用两次dfs来求,而必须用dp做
阅读全文
摘要:树中最远的两个节点之间的距离被称为树的直径,链接这两个点的链为最长链(也称直径) 树形dp求树的直径 考虑求经过结点x的最长链的长度f[x],那么直径就是max{f[x]} 求f[x]数组:经过x结点的最长链的长度由四个部分组成:儿子yi的最大深度,(x,yi),儿子yj的最大深度,(x,yj) 显
阅读全文
摘要:尼玛的哪里错了。。 下面这样的就没问题了。。
阅读全文
摘要:/* 先将a数组从小到大排序 dp[i][j][k]表示到以第i个数为结尾的,且第i个数改了j次,第i个数改动值为k-1的集合最大值 ans是dp过程中的最大集合大小 状态转移: 首先是到i改动为0次的情况: 如果a[i]-a[i-1]2 k:0->2 先给定初始状态值 dp[i][j][k]=1 然后是枚举i-1的所...
阅读全文
摘要:/* 给定n城市,m条道路,每条路耗油w,每个点有油a[i],从任意点出发,求最大可以剩下的油 dp[i]表示从i开始往下走的最大收益,ans表示最大结果 因为走过的路不能走,所以可以想到最优解肯定经过某个点u,其余点都是其子节点 并且即使有分叉,也一定在这个点u上 那么在dp时先处理好子节点,获得所有的dp[son],然后再更新dp[u]和ans即可 */ #include using ...
阅读全文
摘要:b所有数模k,记录出现次数即可 c尺取 d,用map<pair<ll,ll>,int>来统计二元组<a[i]/gcd,b[i]/gcd>的最大出现次数即可,注意特判 e,线性dp f1找最大点度数最大的生成树 f2
阅读全文
摘要:给定整数序列a,b,求出下式的最大值 sum{ai*xi}/sum{bi*xi},xi=0|1 通俗来说,就是选出一些整数对(ai,bi),使得选出的a之和与选出的b之和商最大化 二分答案L,即选出的a之和与b之和的商是L 判断L是否成立,只要判断是否存在sum{ai-L*bi}>0即可 poj27
阅读全文
摘要:/* 给定n个数的数列,要求枚举长为k的区间,求出每个区间的最长上升子序列长度 首先考虑给定n个数的数列的LIS求法:从左往右枚举第i点作为最大点的贡献, 那么往左找到第一个比a[i]大的数,设这个数下标l,那么[l+1,i-1]的后继显然是i 那么[l+1,i-1]区间,和包括第i个数的LIS都可以+1,处理完所有点后求[1,n]区间的最大值即可 区间更新显然用线段树解决,线段树叶子结点维...
阅读全文
摘要:#include using namespace std; #define maxn 150005 int f[maxn],n; vectorans[maxn]; int find(int x){ return f[x]==-1?x:f[x]=find(f[x]); } void bing(int u,int v){//把v联通块并到u中去 for(int i=0;i>n; ...
阅读全文
摘要:Floyd算法: 状态:d[k,i,j]表示经过若干个编号不超过k的结点从i到j的最短路, 转移:可以由经过不超过k-1的点从i到j的最短路,或者从i到k,再从k到j两种状态转移得到, 那么d[k,i,j]=min(d[k-1,i,j],d[k-1,i,k]+d[k-1,k,j]) 初始状态:d[0
阅读全文
摘要:自己写的不知道哪里wa了,明明和网上的代码差不多。,。 网上的
阅读全文
摘要:/* 给定r个红块,g个绿块,按要求堆放 问当堆放成最大高度时,有多少种可能的堆放方式 排列要求:1.第i行放i块 2.每行同色 首先当然要确定能够放置几行 设红块有r个,绿块有g个,那么放置h行需要(h+1)h/2个 那么r+g>=(h+1)h/2 => 2(r+g)>=(h+1)h => 2(r+g)>h*h 那么有 h=sqrt(2r+2g),然后再找符合条件的h...
阅读全文
摘要:/* 给定一张有向图,图上每个结点都有一个字符,现在要求出一条路径,要使路径上某字符出现的次数最多 如果有环,输出-1即可 拓扑排序+dp dp[i][26]表示排序到结点i时26个字符出现的次数 在每次访问到i时都进行dp */ #include using namespace std; #define maxn 300005 struct Edge{int to,nxt;}edge[m...
阅读全文
摘要:好久没做rmq的题了,今天写了一遍,感觉打表有点像区间dp
阅读全文
摘要:最小标示法:给定一个字符串,不断将其最后一个字符放到开头,最终会得到n个字符串,称这n个字符串循环同构,这些字符串中字典序最小的一个,就是最小表示法 下面是进阶指南的模板
阅读全文
摘要:尺取,写起来有点麻烦 枚举左端点,然后找到右端点,,使得区间[l,r]里各种颜色花朵的数量满足b数组中各种花朵的数量,然后再judge区间[l,r]截取出后能否可以供剩下的n-1个人做花环
阅读全文
摘要:恶心场恶心题,,round千万不能用库函数的。。
阅读全文
摘要:/* 给定一张无向图,要求找到1-n的路径,该路径上第k+1大的边是所有路径上最小的 如果没有1-n的路,那么输出-1 二分答案mid,遍历一次所有边,如果边权小于mid,则设为0,大于mid,则设为1 再求一次1-n的最短路,如果最短路大于k,则不成立,反之成立 */ #include<iostr
阅读全文
摘要:单源最短路 dijkstra算法:只适用于没有负边权的图 算法流程: 1.初始化dist[st]=0,其余dist的值设置为INF 2.找出一个未被标记的,dist[x]最小的结点x,然后标记x 3.扫描x的所有边,进行松弛 4.2.3步骤重复n-1次 以上算法复杂度n^2。主要在于每次重复第2步,
阅读全文
摘要:/* 给定n个数据中心,m份资料,每份资料在其中的两个中心备份,一天可供下载的时间是h小时 中心i在第hi小时需要维护,无法下载 现在要将一些中心的维护时间往后推1小时,使得任意时刻每份资料都可以被下载,请问最少选择多少个数据中心, 某个中心维护时,在其中资料无法下载,必须到其他点下载, 如果该点对应的点也在维护,那么这个对应点的维护必须往后推 对应点往后推时继续和其余点矛盾,那么其余点也要往...
阅读全文
摘要:细节题:1.如果图不连通,则输出0 2.如果图没有桥,本身是双联通图,则输出-1 3.如果最小的桥权值为0,任然要输出1
阅读全文
摘要:/* 给定无向图,求加入一条边后最少剩下多少桥 */ #include using namespace std; #define maxn 200005 #define maxm 1000005 struct Edge{int to,nxt,cut;}edge[maxm>n>>m,n){ init(); for(int i=1;i<=m;i++){ ...
阅读全文
摘要:/* 强连通分量内的点可以互相传送,可以直接缩点 缩点后得到一棵树 第一问的答案是零入度点数量, 第二问: 加多少边后变成强连通图 树上入度为0的点有p个,出度为0的点为q,那么答案就是max(p,q) 如果缩点后是一个点,答案就是0 */ #include #include #include #include using namespace std; #define maxn 105 ...
阅读全文
摘要:流图:存在点r,从r出发可以达到有向图中的每一个点,则该图成为流图 一些基本概念: 1.树枝边(x,y):指搜索树中的边,即x是y的父亲 2.前向边(x,y):指搜索树中x是y的祖先结点 3.后向边(x,y):指搜索树中y是x的祖先结点 4.横叉边(x,y):除以上三种情况外的边,可以证明dfn[y
阅读全文
摘要:/* 给定一张无向图,求有多少点不被任何奇环包含 推论1:如果两个点属于两个不同的v-DCC,则他们不可能在同一个奇环内 推论2:某个v-DCC中有奇环,则这个v-DCC中所有点必定被属于某个奇环 只要求出补图中的所有v-DCC,判定每个v-DCC中是否存在奇环即可 如果某个v-DCC中包含奇环,则该联通块的所有点都被标记位1 最后只要求未被标记的点数量即可 */ #include #inc...
阅读全文
摘要:/* 给定一个无向图,往里面加边,问加第i条边时图中的桥数 首先肯定要求初始状态下的桥,染色缩点 每次给定的边为(u,v), 那么u->lca(u,v)->v路上的所有边都不再是桥 求LCA时可以直接暴力,一个一个点往上找即可,网上好多题解都是用并查集做的。。 */ #include using namespace std; #define maxn 200005 struct Edge{int...
阅读全文
摘要:删掉无向图上任意一点,请求出将会增加的不连通的点对数 将无向图联通性的问题转化到搜索树方向上考虑 如果一个点不是割点,那么删掉该点的答案很简单,就是2*(n-1) 如果点u是割点,同时u在搜索树上有t个子节点,那么删掉u点后就会出现t+2个联通分量 1.t个包含不同子节点的联通分量:每个子节点联通分
阅读全文
摘要:无向图:桥和割点 桥的概念:无向图删去边e后分裂成两个不相连的子图 割点概念:无向图删去点v以及和v相连的所有边后分裂成两个及以上的子图 一些概念: 搜索树:在无向图中任意选择一点作为起点进行dfs,每个点访问一次,每次发生递归的边(x,y),即访问到之前没有访问到的点所经过的边,组成的搜索树 时间
阅读全文