题目链接:https://ac.nowcoder.com/acm/contest/883/B 题目大意   给定一个长度为 N 的 01 字符串,输出最长子串和子序列的长度,满足其中 0 和 1 的个数相等. 分析1(DP) 子序列就不说了,谁都会求. 这个 DP 是我自己想的,严格来说复杂度是 O(n2),然而数据比较松,就过了,速度居然很快,主要注释都写代码里了. 代码如下 #include <bits/stdc++.h> using namespace std; #define INIT…
Crazy Binary String 思维 题意 给出01串,给出定义:一个串里面0和1的个数相同,求 满足定义的最长子序列和子串 分析 子序列好求,就是0 1个数,字串需要思考一下.实在没有思路可以看看数组范围(n<=1e5),很像nlogn或者n的算法,这个时候就要考虑一下二分和前缀和优化,二分感觉⑧太行,这个时候研究一下前缀和的性质,发现0 为-1,1为1的时候,前缀和相同的两个位置中间恰好可以构成一个满足定义的串,所以这题就解决了.没有思路的时候多发散一下思维,从多角度思考一下问题.…
题目链接 题目链接 题解 题面上面很明显的提示了需要严格\(O(n^3)\)的算法. 先考虑一个过不了的做法,枚举右下角的\((x,y)\),然后二分矩形面积,枚举其中一边,则复杂度是\(O(n^3 \log n^2)\)的. 考虑另外一个做法,同样是枚举右下角\((x,y)\),然后枚举一边长度,显然现在只需要知道左边最远能延伸到哪,这个玩意显然是有单调性的,那么尺取一下,套个单调队列判断即可. 注意细节. #include <bits/stdc++.h> using namespace s…
题意: 用  $A(n)$ 表示第 $n$ 个只由1组成分整数,现给定一个素数 $p$,求满足 $1 \leq i\leq n, 1 \leq j \leq m, A(i^j) \equiv 0(mod \ p)$ 的 $(i, j)$ 对数. 分析: $11...11 = \frac{10^n-1}{9} \equiv 0(mod \ p)$ 等价于 $10^n \equiv 1(mod \ 9p)$,当 $p \neq 2,5$ 时,有 $gcd(10, 9p)=1$,因此 $10^{\ph…
题目链接:https://ac.nowcoder.com/acm/contest/883/G 题目大意:有\(n\)堆石头,每堆有\(a_i\)个,每次可以选其中两堆非零的石堆,各取走一个石子,当所有石堆的石子数均为\(0\)时获胜.问有多少个区间\([l,r]\)可以保证获胜(若区间内石子数总和为奇数则会选一堆石子数最小的石堆取走一个石头). 题解:显然,对其中的一个区间,如果区间内的最大值\(mx\)不超过其总和\(sum\)的一半,则能保证获胜.于是可以考虑每一个\(a_i\)作为最大值的…
题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意: 给你偶数个点的坐标,找出一条直线将这n个点分成数量相等的两部分 并在这条直线上取不同的两个点,表示这条直线 思路: 看见这题的第一反应是,先定一个相对这些点无限远的定点 然后取扫一遍,取一个其中一个点,找到一条能将这些点分成m个和m+1个点 最后将斜率微微倾斜,在直线上再取一点即可 最后疯狂WA,不知道是算法问题还是代码问题 听了大佬的讲解,发现自己真的蠢 最后的做法: 将这n个点按x坐标从小到…
题目链接:https://ac.nowcoder.com/acm/contest/883/B 题意: 给你一段长度为n,且只有 ‘0’ 和 ‘1’ 组成的字符串 a[0,...,n-1].求子串中 ‘0’ 和 ‘1’ 数目相等的最大长度,子序列中 ‘0’ 和 ‘1’ 数目相等的最大长度. 思路: 子序列的最大长度很容易想到,就是 ‘0’ 和 ‘1’ 的数量中最小的两倍 求子串的最大长度就用前缀和 将 ‘1’ 的价值设为1,‘0’ 的价值设为-1,用数组 cnt[i] 记录从 0 到 i 的前缀和…
题意:给你一张无向图,设s(x)为与x直接相连的点的集合,题目中有两种操作: 1:1 l r 将读入的边的序列中第l个到第r个翻转状态(有这条边 -> 没这条边, 没这条边 -> 有这条边) 2:2 x y 询问s(x)和s(y)是否相等. 思路(官方题解):首要问题是怎么快速判断s(x)和s(y)是否相等.我们发现边的翻转操作实际上是异或操作,所以不妨给每个点随机一个值,用与x直接相连的点的异或和作为s(x),这样可以快速判断s(x)和s(y)是否相等.判相等解决了,怎么快速维护操作1呢?我…
问题可以转换为求有多少个区间数字的总和除2向下取整大于等于最大值.或者解释为有多少个区间数字的总和大于等于最大值的两倍(但是若区间数字总和为奇数,需要算作减1) 启发式分治: 首先按最大值位置分治,遍历长度较短的一边,枚举它为一个端点,另一边二分算贡献即可. 复杂度大概\(nlog(n)^2\) #pragma comment(linker, "/STACK:102400000,102400000") #include<bits/stdc++.h> #define fi f…
Crazy Binary String 题目传送门 解题思路 把1记为1,把0记为-1,然后求前缀和,前缀和相等的就说明中间的01数一样.只要记录前缀和数值出现的位置即可更新出答案. 代码如下 #include <bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; typedef long long ll; const int N = 100005; int l[N << 1]; int sum[N]; int ma…
Magic Line 题目传送门 解题思路 因为坐标的范围只有正负1000,且所有点坐标都是整数,所以所有点相连构成的最大斜率只有2000,而我们能够输出的的坐标范围是正负10^9.所以我们先把这n个点按照x轴从小到大,x相同的再按照y轴从大到小排序,然后取第n/2个点,在这个点上做一条斜率极大的线(大于2000即可),此时在这条线的上方有n/2-1个点,下方有n/2个点,还有一个点在线上,我们先在线上取两个在图外的点(即x或y的绝对值大于1000),然后把其中一个点的y坐标-1,此时两个点连接…
LRU management 题目传送门 解题思路 用map索引对应地址,用双向链表维护序列. 代码如下 #include <bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; typedef long long ll; inline int read(){ int res = 0, w = 0; char ch = 0; while(!isdigit(ch)){ w |= ch == '-', ch = getchar();…
Planting Trees 题目传送门 解题思路 枚举每一个下边界,再枚举其对应的所有上边界,求出其对应区间内的最大最小值,当下边界一样的时候,其最大最小值可以随着上边界减小逐步更新.然后将这些最大最小值分别放入单调队列,初始时设左边界为1,右边界即为当前放入的下标, 高即为此时枚举的高.当当前区间的最大最小值差超过m时,让最大值与最小值中位置靠前的出队,然后左边界变为其出队的下标+1.算出每一个满足条件的面积,取最大值即可. 代码如下 #include <bits/stdc++.h> #d…
题目链接:https://ac.nowcoder.com/acm/contest/883/H 题目大意 给定 N 个不同的整数点,N 为偶数,求一条直线,这条直线能把这 N 个点对半分开,输出这条直线经过的两个整点坐标. 分析1 在无穷远处选一个点(我选两个互质的质数),设为$(x, y)$,然后极角排序,然后取最中间两个点的中点,设为$(\frac{a}{2}, \frac{b}{2})$,由于题目要求整数点,通过求出直线方程,可以发现整数点$(3x - a, 3y - b)$也在直线上,于是…
Magic Line 题意 给出n(偶)个整点 整点范围1000,找出一条直线,把n个点分成均等的两部分 分析 因为都是整数,并且范围比较小,所以直接按x排序找到在中间那一部分,并且把中间那一部分的点按照左右点的分布情况,分成两部分即可.如何分呢,因为范围比较小,所以可以找一条斜率特别极限的直线把其分成两部分.这题的关键是要同意直线的形状,要么从左上到右下,要么从左下到右上,混淆就会WA. #include<bits/stdc++.h> using namespace std; #define…
题意 定义\(A(n)\) 为 n个1表示的十进制数,例如\(A(3) = 111\) 然后对于\(1 \le i \le n,1\le j \le m\) 问有多少的 \(pairs(i,j)\)满足\(A(i^j) \equiv 0 \pmod p\) 分析 $11\cdots 111 = {10^n-1 \over 9} \equiv 0\pmod p $ 等价于\(10^n \equiv 1\pmod {9p}\) 当 \(p = 2,5\)时,显然答案为0(因为\(11\cdots 1…
题意: 求最大矩阵面积,要求矩阵内数字满足\(max - min < m\) 思路: 枚举上下长度,在枚举的时候可以求出每一列的最大最小值\(cmax,cmin\),这样问题就变成了求一行数,要你得到\(max - min < m\)的最长长度.用单调队列\(O(n)\)求解.总复杂度\(O(n^3)\). 代码: #include<map> #include<set> #include<cmath> #include<cstdio> #incl…
2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或者说A‾\overline{A}A表示DA→\overrightarrow{DA}DA旋转180°之后的方向. block(A,B)block(A,B)block(A,B)表示的是DA→\overrightarrow{DA}DA旋转到DB→\overrightarrow{DB}DB的扫过的几何区间.…
牛客多校第三场 F Planting Trees 题意: 求矩阵内最大值减最小值大于k的最大子矩阵的面积 题解: 矩阵压缩的技巧 因为对于我们有用的信息只有这个矩阵内的最大值和最小值 所以我们可以将一个长度为i*j的子矩阵给压缩成一个1*i的序列 那么压缩成一维就是求区间内最大值减最小值大于k的最长长度了,这个问题用两个单调队列维护即可 代码: /** * ┏┓ ┏┓ * ┏┛┗━━━━━━━┛┗━━━┓ * ┃ ┃ * ┃ ━ ┃ * ┃ > < ┃ * ┃ ┃ * ┃... ⌒ ... ┃…
牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最大值的位置,每次分治找就找这个最大值,然后看最大值在哪个序列是可行的 怎么看最大值所在的序列是否可行呢? 我们用一个前缀和维护区间和 \[ max<=\frac{1}{2}(sum[r]-sum[l])\\ 2*max-(sum[r]-sum[l])<=0\\ \] 这个最大值在这一段区间内都有可…
链接:https://www.nowcoder.com/acm/contest/141/A 来源:牛客网 Eddy was a contestant participating , Eddy failed to solve a physics equation, which pushed him away from a potential medal. Since then on, Eddy found that physics is actually the most important th…
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 string) 求若干个串的公共子串个数相关变形题 牛客这题题意大概是求一个长度为\(2e5\)的字符串有多少个不同子串,若\(s==t\)或\(s==rev(t)\)则认为子串\(s,t\)相同.我们知道回文串肯定和他的反串相同. 链接:传送门. 做法1: \(yx\)大佬秒出思路%%,对\(s…
链接:https://ac.nowcoder.com/acm/contest/884/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言1048576K 64bit IO Format: %lld 题目描述 A new city has just been built. There're nnn interesting places numbered by positive numbers from 111 to nnn. In order…
题目传送门 大致题意: 输入整数n(1<=n<=100000),再输入由n个0或1组成的字符串,求该字符串中满足1和0个数相等的最长子串.子序列. sample input: 801001001 sample output: 4 6 题解: 补充一下子串和子序列的区别:字串必须连续,子序列不必连续. 求01个数相等的最长子序列长度:min(0的个数,1的个数). 下面说求01个数相等的最长子串长度: 可以建一个sum数组求前缀和,因为要使0和1个数相等,所以0可以用-1代替,故当sum[r]-…
目录 题目链接 题意 思路 代码 题目链接 传送门 题意 初始时有\(n\)堆石子,每堆石子的石子个数为\(a_i\),然后进行游戏. 游戏规则为你可以选择任意两堆石子,然后从这两堆中移除一个石子,最后石子个数变为\(0\)则获胜否则失败.由于总石子个数可能为奇数,此时不可能获胜,因此加了个规则为如果石子个数为奇数,那么可以事先移除一个石子. 问你有多少个区间能让玩游戏的人获胜. 思路 经过模型转换后题意变为有多少个区间,区间内石子个数之和大于等于石子最大数的两倍. 启发式分治,大体处理方法和这…
题目链接 传送门 题意 给你一个\(n\times n\)的矩形,要你求出一个面积最大的矩形使得这个矩形内的最大值减最小值小于等于\(M\). 思路 单调队列滚动窗口. 比赛的时候我的想法是先枚举长度然后再枚举左端点,最后用单调队列来做,然后\(T\)成傻逼,赛后看大佬们的代码发现我的做法比先枚举左端点再枚举右端点多很多状态(譬如在每次长度变化的时候我的写法会从最左边开始枚举,而先枚举左端点的做法则不会再反复考虑左边的情况). 我们先固定左端点,然后在枚举右端点的时候用两个数组记录\([L,R]…
B - Shorten IPv6 Address 题意 给你\(128\)位的二进制,转换为十六进制. 每\(4\)位十六进制分为\(1\)组,每两组用一个\(":"\)分开. 每一组的十六进制要去掉前导\(0\). 如果存在连续两组以上的\(0\)要转换为\("::"\).比如,\(0:0:0.0:0\)都可以转换成\("::"\). 但是最多只能转换一次,要求在长度最短的条件下字典序最小. 思路 先把二进制串转换为16进制串 找到最长连续的\…
subsequence 1 题意 给出两个数字串s,t,求s的子序列中在数值上大于t串的数量 分析 数字大于另一个数字,要么位数多,要么位数相同,字典序大,位数多可以很方便地用组合数学来解决,所以只剩下了位数相同的情况,如何实现呢,我们考虑定义状态dp[i][j][0/1]分别表示s串前i个字符中长度为j的串前面的字符等于t串相应长度的前缀的数量,1则表示大于的数量 ,然后分三种情况转移即可. #include<bits/stdc++.h> #define ll long long using…
题目我就不贴了...说不定被查到要GG... 题意就是我们需要在P,A,C,M四个属性的限制下,找到符合条件的最优解... 这样我们就需要按照0/1背包的思路,建立一个五维度数组dp[i][j][k][l][o]但是很明显36^5可能不怎么够用,一般来说就两种思路,吧这种多维数组由int 开成 short,这样岂不是爽歪歪?或者降维嘛...这里滚动会降一维,可是不会滚动啊!!!-_-     滚动数组优化!!!我们在正向退DP时,子状态只会用很少的种类,这样前面好多都是没用的,我们来看看简单的0…
https://www.nowcoder.com/acm/contest/141#question 一眼背包,用四维dp记录在A,B,C,D条件限制下可以获得的最大知识点,但是题目要求输出路径,在输入中包含0这样的样例,原本的递归寻找路径变的不可行,就需要开五维dp记录在i组条件下ABCD的最大知识点,空间复杂度为36 ^ 5,测试可以通过,但本题有更加优秀的解法,就是在原本四维dp的条件下同时用状压记录已经选择的物品,输出的时候只要输出加入状压的物品即可. #include <map> #i…