![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
其他算法
文章平均质量分 61
JK Chen
ACM退役选手,战绩4金6银
展开
-
POLICE(LCS转LIS 并查集)
题意:n个书架,每个m个位置,要求变到目标状态。有两种操作:在一个书架内让一本书左右移动;拿起一本书放到任意空白位置。求最少拿起次数。解析:书分两种:不需要拿起和需要拿起。不需要拿起:求出原状态和目标状态的最长公共子序列(LCS)需要拿起:手模后发现只要需要交换的几行内(并查集得到)有空格,那么答案就是∑book−∑∣lcs∣\sum_{book}-\sum_{|lcs|}∑book−∑∣lcs∣。否则需要额外的一步。LCS的时间复杂度是O(N2)O(N^2)O(N2),由于这里标号唯一原创 2020-07-16 16:28:23 · 255 阅读 · 0 评论 -
F. Make Them Similar(位运算 折半 哈希)
http://codeforces.com/problemset/problem/1257/F题意:有一个a数组,长度最大100,现在让所有数都异或k,使得得到的数组中,所有数的二进制上的1的个数相同,求这个k。解析:考虑异或后的影响,列出对应方程:我们要求:a1=an,a2=an...an−1=ana_1=a_n,a_2=a_n...a_{n-1}=a_na1=an,a2=an...原创 2019-11-20 15:34:56 · 357 阅读 · 0 评论 -
E. XOR and Favorite Number(莫队 前缀异或和)
http://codeforces.com/problemset/problem/617/E题意:给出n个数,每次查询一个区间[L,R][L,R][L,R],求内部有多少个子区间,其异或值为KKK。解析:采取莫队的做法,假设当前[L,R][L,R][L,R],变为[L−1,R][L-1,R][L−1,R],那么得到的区间为以L−1L-1L−1为左端点,右端点∈[L−1,R]\in[L-1,...原创 2019-11-18 21:21:23 · 248 阅读 · 0 评论 -
G. Discarding Game(尺取)
http://codeforces.com/problemset/problem/1250/G题意: 给出两个数组a、b,你第i次增加ai分,对面增加bi分。你可以在每次加晚后重置,双方抵消分数([3,7]变为[0,4]),当一个人的分数到达k分时失败。问最少的重置次数使得对方失败,你不失败。解析: 想到枚举最后一次重置的位置,因为前面怎么重置都无所谓,而且后面在哪里到达k分可以知道。这个位置...原创 2019-10-30 18:29:10 · 277 阅读 · 0 评论 -
Lightning(生成树计数)
原题: http://acm.hdu.edu.cn/showproblem.php?pid=4305题意:n个点,任意两个点之间可以连边当且仅当距离不大于R,并且中间没有其他边。求生成树个数。解析:判断中间有没有点可以直接n3for,也可以n2log,枚举每个点为起点,其他的点与之形成的向量用map比较是否存在即可。连完边就用矩阵树进行n3做就行了。#include<bits/s...原创 2019-07-19 10:33:04 · 246 阅读 · 0 评论 -
Welcome Party(并查集 启发式合并)
原题: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6011抛开zoj的问题,如果要百分百过的话(不被数据制裁),需要用到启发式合并。即每次将小的连到大的连通块,这样得出的结构一定是log级别层数。#include<bits/stdc++.h>using namespace std;typedef lon...原创 2019-04-28 14:25:50 · 366 阅读 · 0 评论 -
2300专项:B. Lynyrd Skynyrd(子序列 倍增)
原题: http://codeforces.com/problemset/problem/1142/B题意:给出111到nnn的排序aaa,mmm长度的数组,每次询问:mmm的l−rl-rl−r区间内是否存在一个子序列为aaa的循环同构(123=231=312)解析:首先要想到的是,一个点只会连向之前的最近的那个点,例如223的话,3只需要考虑第二个2即可。我开始用莫队来做,维护的时候...原创 2019-04-17 18:57:23 · 261 阅读 · 0 评论 -
Strah(所有矩形面积和 单调栈)
原题: http://acm.zjnu.edu.cn/CLanguage/showproblem?problem_id=2274题意:给出一个矩阵,有些地方为’#’,求所有不包含’#'的子矩阵的面积。解析:从左往右维护单调栈。用sum_stasum\_stasum_sta表示当前结点为右下角的所有矩形的面积和,sum_fysum\_fysum_fy表示上述图形的面积。观察(j1_j8,...原创 2019-03-23 21:59:56 · 606 阅读 · 0 评论 -
D:NLO(除草 set维护线段)
原题: http://acm.zjnu.edu.cn/CLanguage/contests/1146/problems/1003.html题意:一个n∗mn*mn∗m的矩阵,初始全部为0。k秒钟,每秒一个x,y,rx,y,rx,y,r,将符合(x−X)2+(y−Y)2<=r2(x-X)^2+(y-Y)^2<=r^2(x−X)2+(y−Y)2<=r2的所有点值变...原创 2019-03-24 18:52:12 · 280 阅读 · 0 评论 -
一波水题(两个区间互质对数,选x个不同数的方案数,记忆化搜索)
Coprime Integers题意: x∈[l1,r1],y∈[l2,r2]x\in[l1,r1],y\in[l2,r2]x∈[l1,r1],y∈[l2,r2],求gcd(x,y)=1的对数解析:莫比乌斯函数,定义g(x)表示gcd=x的对数,定义f(x)=∑g(ix)f(x)=\sum g(ix)f(x)=∑g(ix),那么g(x)=∑μ(i)f(ix)g(x)=\sum \mu(i)f...原创 2019-03-17 18:27:52 · 420 阅读 · 0 评论 -
一拨水题(变成各个位平分和,1~n字典序排序,矩阵快速幂,线段树)
超级无敌简单题题意: 鸽子数字由以下过程定义:从任何正整数开始,将数字替换为其各个数位的平方和,并重复该过程,直到该数字等于1。如果不能,则这个数字不是鸽子数。例如7是鸽子数,因为7-&gt;49-&gt;97-&gt;130-&gt;10-&gt;1。(77=49,44+99=97,99+7*7=130…如此类推)解析:打了一遍表,发现在一定次数后要么出现循环,要么变成1。而且一个数变成...原创 2019-03-17 11:02:06 · 418 阅读 · 0 评论 -
2200专项:F2. Same Sum Blocks (Hard)(k个子数组不相交且区间和相同)
原题: http://codeforces.com/contest/1141/problem/F2题意: 给出n长数组,有k个子数组不相交且区间和相同,求k的最大值。解析:假设答案区间和为x,1到3区间和为x,2到5区间和也为x,那么我们当然选择1到3了。所以,可以贪心地做。从小到大枚举区间右端点就可以实现贪心的做法。#include<bits/stdc++.h>using ...原创 2019-03-20 20:50:25 · 425 阅读 · 0 评论 -
Monitor(矩形覆盖 二维差分)
原题: http://acm.hdu.edu.cn/showproblem.php?pid=6514题意:给出n个矩阵,q个查询,问一个矩阵是否被之前的矩阵完全覆盖。解析:对于每个矩阵进行差分:每个矩阵的左上角+1,右下角+1,另外两个-1。那么此时的二维前缀和就表示某个点被覆盖的次数了。(例如:黄色为0,红色为1)然后将每个有被覆盖的点变成1,否则为0,此时再次做二维前缀和,得到的...原创 2019-04-20 10:20:41 · 401 阅读 · 0 评论 -
Color it(CDQ 位或线段树)
原题: http://acm.hdu.edu.cn/showproblem.php?pid=6183题意:多组案例,每一组中:给出两种操作:x  y  cx\; y\;cxyc:在点(x,y)(x,y)(x,y)放一个颜色为c的点。x  y1  y2x\;y1\;y2xy1y2...原创 2019-05-31 18:47:36 · 264 阅读 · 0 评论 -
小米OJ-Rectangle(前缀和 矩形面积交之和)
原题: https://code.mi.com/problem/list/view?id=151题意:给出1000个点,两两组成一个矩形(n*(n-1)/2)。现在任意选择其中两个,计算面积交的期望。解析:其实就是5e5个矩形,求面积交之和而已。这个直接用二维前缀和即可。左下右上+1,另外两个-1,那么得出的前缀和就是某个点被多少个矩形覆盖。我们先进行离散化再做前缀和的话,那么我们就...原创 2019-06-12 19:55:13 · 461 阅读 · 0 评论 -
F:Painting the Barn 2(加两个矩阵,求覆盖k次的面积最大值)
原题: http://10.7.95.2/CLanguage/contests/1150/problems/1005.html题意:有n个矩阵,你现在可以再加最多两个(不能重合),求之后被k个矩阵覆盖的面积最大值。解析:先用二维前缀和处理出每个点被覆盖的次数,加矩阵的话,原来k-1的地方变成k,所以设为1,k的地方减少,所以设为-1。那么就变成了两个子矩阵的最大值。这个就是枚举两个边界...原创 2019-07-15 19:35:48 · 266 阅读 · 0 评论 -
I - Minimum Spanning Tree(带权最小生成树计数)
原题: http://acm.hdu.edu.cn/showproblem.php?pid=4408题意:给出带权边,求最小生成树的方案数,别人的代码,留个底。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath&g...原创 2019-07-17 20:16:41 · 220 阅读 · 0 评论 -
2019牛客暑期多校训练营(第四场)—— xor(线性基的交 线段树)
原题: https://ac.nowcoder.com/acm/contest/884/B题意:给出n个集合,m个查询,每个查询(L,R,val)(L,R,val)(L,R,val),询问区间[L,R][L,R][L,R]中的所有集合是否可以通过集合内异或来表示valvalval。解析:异或表示显然就是线性基了,一个线性基是否可以表示一个数大家都会做,现在要求区间内所有线性基是否可以。先...原创 2019-07-29 19:30:32 · 316 阅读 · 0 评论 -
Nonsense Time(LIS元素集合求解)
原题: http://acm.hdu.edu.cn/showproblem.php?pid=6635题意:给出一个排序,当前所有数字不能使用。给出可以使用的顺序,求每次加入新的可以使用的数字后的最长上升子序列长度。解析:我们考虑从后往前找,把加入改为删除。因为数据随机,所以删除序列内元素的期望为O(logN)O(logN)O(logN)。所以我们可以暴力去做,如果删除的元素在序列里面就重...原创 2019-08-08 18:58:13 · 295 阅读 · 0 评论 -
2019牛客暑期多校训练营(第八场)Explorer(线段树 分治答案)
original link - https://ac.nowcoder.com/acm/contest/888/E题意:给出n个点,m条边,每条边上有个范围,指定范围的数字才能通过。现在点111上有[1,1e9][1,1e9][1,1e9]想要到达点nnn,问最后有多少个点可以到达。解析:直接搜应该是不行地,我们考虑分治答案。分治区间[L,R][L,R][L,R],将所有包含该区间的边都...原创 2019-08-11 21:18:02 · 275 阅读 · 2 评论 -
Vertex Covers(折半 高维前缀和 顶点覆盖)
original link - https://nanti.jisuanke.com/t/A1771题意:给出n≤36n\leq36n≤36个点,mmm条边,点权,一个集合的权值为点权和。求所有完全覆盖所有边的集合权值和。解析:因为nnn卡在363636这个特殊的位置,所以考虑折半做法。枚举两边的点的所有状态,对于左边的状态XXX和右边的YYY,首先要求XXX覆盖左边内部的边,YYY覆盖...原创 2019-08-31 20:21:14 · 399 阅读 · 4 评论 -
Yukino With Subinterval(CDQ分治)
original link - https://nanti.jisuanke.com/t/41356题意:给出一个数组,每次询问区间[L,R][L,R][L,R]内有多少个连续段,其值域在[x,y][x,y][x,y]上。有单点修改。解析:直接带修主席树内存被卡了,这个东西除了模板题我还没有AAA过题,不是内存被卡就是时间被卡……将一段连续值的点,集中在区间左端点上,即只有左端点有值。相...原创 2019-09-11 15:56:45 · 299 阅读 · 0 评论 -
大数GCD
原题: https://www.luogu.org/problemnew/show/P2152java大数有个gcd的函数,但是我想自己套一下stein,于是。。。import java.math.*;import java.util.*;public class Main { public static BigInteger _0=BigInteger.valueOf(0);...原创 2019-03-08 11:19:39 · 860 阅读 · 0 评论 -
Talent Show(01分数规划)
原题: http://acm.zjnu.edu.cn/CLanguage/showproblem?problem_id=2268n个物品,w值与v值,要求∑w&gt;=W\sum_w&gt;=W∑w>=W的前提下∑v/∑w\sum_v/\sum_w∑v/∑w最大比赛的时候感觉没没没问题啊。。。01分数规划白学了。解析:先01分数规划,再dp即可#include...原创 2019-03-12 13:23:12 · 201 阅读 · 0 评论 -
RMQ ST求O(1)区间最值
ST算法用dp[i][j]来表示以i为起点2^j的长度范围内的最值 初始化时,dp[i][0]就是数本身,而递推,显然,dp[i][j]可以用dp[i][j-1]和dp[i+(1&amp;amp;amp;lt;&amp;amp;amp;lt;(j-1))][j-1]来得出 而在查询的时候,因为一个dp表示2^n的范围,所以不管什么区间都可以用至多两个dp来得出 比如1~7就可以用dp[1][2](1~4)和 dp[4][2](4~7)...原创 2018-07-18 20:36:37 · 348 阅读 · 0 评论 -
Group (莫队算法)
原题:Group题意:一个数组,给多个区间,每个位置有个不会重复的编号,编号连续的数可以组队,k个数的队价值为k*k,每个询问给一个区间,求区间的最大价值需要多少个组解析:2*2+1*1肯定是3*3大,所以相当于问在排序后有多少片连续的数对于这种分析数出现不出现,出现几次的问题,且多个询问可以离线的情况,可以用莫队来做首先,离线处理后,进行这个算法最重要的询问排序对...原创 2018-07-18 18:56:14 · 696 阅读 · 0 评论 -
Balanced Lineup(分块)
原题:POJ - 3264题意:给一个数组,每次询问一个区间的最大值和最小值解析:一般来说是用线段树来做这类问题的,不过在数据比较小的时候可以用分块做对于长度为n的数组,我们可以分成多个连续的块,对每个块预处理相应的最小值和最大值。比如一个块长度k为5,求2~17时我们就只需要遍历2~5,16~17,中间的就用预处理出的数据就行而且,k取sqrt(n)的时候,块外的遍历...原创 2018-07-18 18:23:10 · 292 阅读 · 0 评论 -
Careful Thief (区间和最大)
原题:Gym - 101810A题意:有条1——1e9的坐标轴,给出n给区间l,r,v表示l到r范围内的点价值为v 你可以得到连续的一段区间的价值,区间最长为k,求可以得到的最大值解析:相当于在长度固定的情况下移动区间,有以下结论选取区间的端点一定是某个给出的区间的端点,因为如果两端都在某个区间的中间话,往左或往右一定可以做到单调不减所以,我们可以扫一遍所有区间的端点...原创 2018-07-18 13:19:32 · 836 阅读 · 0 评论 -
Largest Submatrix (最大全1子矩阵)
知识点:最大全1子矩阵原题:SPOJ - MINSUB题意:在矩阵中选出大小&gt;=k的子矩阵,使得最小项的值最大解析:二分最小值,l=0,r=max最小值为mid的时候,把所有&gt;=mid的数看成1,其他看成0,求最大全1子矩阵,假设这个面积大于等于k,可能有以下几种情况:最大的矩阵里面有mid这个数,那么其他的都比mid大了,最小的就是mid,符合题意,接下...原创 2018-04-20 13:53:52 · 872 阅读 · 0 评论 -
最大全1子矩阵 单调栈
原题:POJ 3494题意:给出一个矩阵,求全1子矩阵的最大面积解析:开局的处理方式和最大求和子矩阵类似,压缩处理。预处理h[i][j],表示第i行第j列往上(行数递减方向)可以接上的全1串的最长长度,然后处理第一行到第i行的ans时,就可以看成处理h[i]一行了eg:n=3 m=4 M数组 H数组0 1 1 0 0 1 ...原创 2018-04-20 13:18:10 · 1991 阅读 · 0 评论 -
尺取法
尺取法eg: 给一个正数数组,求最短的sum比x大的一个区间假设我们枚举左端点,每次往右加入,直到大于x,那么会有很多重复的计算,这种时候我们可以用尺取法降低时间复杂度把已经计算的区间看成尺子,加入当前尺子sum不够,就把右端点向右延伸,直到大于x为止。当大于后,我们不是重置尺子左端点重新开始右延,而是把左端点往右缩。如果缩了还是满足大于x,当下情况就也可以成为ans。 缩到了...原创 2018-04-19 21:25:56 · 484 阅读 · 0 评论 -
中缀转后缀表达式
原题:表达式的转换——中级题意:中缀转后缀再一步一步计算,要求给出计算过程,即没算一步都要给出结果思路:首先是转换基本公式:遇到数,直接输出; 栈为空时,遇到运算符,入栈;遇到左括号,将其入栈; 遇到右括号,执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出;遇到运算符时,弹出所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈;最终将栈中的...原创 2018-02-24 22:57:29 · 360 阅读 · 0 评论 -
基数排序
基数排序介绍不同于其他基于比较的排序算法,基数排序是一种基于多关键字排序的思想对单逻辑关键字进行排序的方法。讲明白点,基数排序是把一个数看成很多的部分,比如123看成1,2和3叠在一起。实现方法最高位优先(Most Significant Digit first)法,简称MSD法:先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的...原创 2018-02-16 16:46:22 · 963 阅读 · 0 评论 -
滑窗求最大值 (单调栈)
原题 : Problem A. Ascending Rating题意:给n个数的数组,求a和b的和 a:每个m长度的子数列的最大值^子数列第一个位置下标 b:每个m长度的子数列的上升数^子数列第一个位置下标 上升数:从第一个开始,遇到大于前一个上升数的所有数(5 2 1 4 6)-&gt;(5 6)解析:在比赛的时候,我想到了单调栈,但是我是从前往后进栈,这样做的坏处还是很明...原创 2018-07-30 20:04:41 · 994 阅读 · 0 评论 -
康拓展开(排序次序号)
全排序知道吧,1 2 3 4 5 6是第一种,1 2 3 4 6 5是第二种…推导过程以9的全排列举例:842697513是1-9全排列的第几个?首先看第一位为8,那么第一位为1-7的全排列都比它小,共有7*8!个。 在第一位为8的情况下,其次看第二位为4,那么第二位为1-3的全排列都比它小,共有1*3*7!个。 在第一位为8,第二位为4的情况下,那么第三位为1的全排列都比它小...原创 2018-08-03 11:59:15 · 636 阅读 · 0 评论 -
应对卡常:快速读入输出,读入挂,register;扩栈
inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; } return *p1++;}inline void read(int &amp;amp;x){ char c=...原创 2018-09-11 17:06:42 · 375 阅读 · 0 评论 -
01分数规划(Dinkelbach算法、最优比率生成树、最优比率环)
此类题目大意:有n件物品,a值为价值,b值为代价,要求你选择多件物品使得∑a/∑b\sum a/\sum b∑a/∑b达成最值(最大或最小)那有同学就问了,如果求最大,直接选ai/bia_i/b_iai/bi最大的那个不就好了?题目会让你怎么选吗?如果要求选择多个的时候,不一定选ai/bia_i/b_iai/bi大的几个最优。这点可以自行证明。设最大值为vvv,那么得:∑a/...原创 2019-02-18 12:38:20 · 3032 阅读 · 2 评论 -
P2216 [HAOI2007]理想的正方形(框正方形使数值差最小 单调队列)
原题: https://www.luogu.org/problemnew/show/P2216题意:给出n*m的数字矩阵,框出一个c*c正方形使最大值-最小值最小。解析:这题昨晚睡前想了一下,只要能快速处理一个区间的最值就可以暴力了,管他怎么dp。线段树有感觉大材小用了感觉。想到用优先队列可以快速得出1*c那么一条的最值,又想到了一个正方形是c条1*c组成的,那么问题就解决啦。结果想完...原创 2019-02-16 10:41:54 · 318 阅读 · 0 评论 -
P1578 奶牛浴场(悬线 极大值)
原题: https://www.luogu.org/problemnew/show/P1578题意:n*m的矩阵,有几个点(不是格子而是坐标点),问最大的没有覆盖这些点的矩阵。解析:首先搞清楚模型,(1,1)和(4,4)是右边的情况,因为给出的案例下面两种答案都是80。这题虽然不能用悬线法(矩阵太大不可能枚举点)来做,但是可以用类似悬线的思想来做。对答案子矩阵进行分析,四个边,如果没...原创 2019-02-03 14:07:28 · 367 阅读 · 0 评论 -
悬线法:最大矩阵
我们以最大全0矩阵为例。对于每个点,以这个点为起点往上引一条直线,直到矩形边界或遇到障碍为止,称之为这个点的悬线。悬线的长度记作UUU。对于这个01矩形,答案矩形一定是由某条悬线向左右平移得到。U很好维护,如果当前点可以从上面排(Mp[i-1][j])转移,那么U=Ui−1+1U=U_{i-1}+1U=Ui−1+1,否则U=1U=1U=1。还有L和R。首先要保证当前排中的端点,即可以转移...原创 2019-02-02 16:16:50 · 440 阅读 · 0 评论