>传送门< 前言 这题我前前后后看了三遍,每次都是把网上相关的博客和通过代码认真看了再思考,然并卵,最后终于第三遍也就是现在终于看懂了,其实懂了之后发现其实没有那么难,但是的的确确需要思维.(博客分析那块写的啰里吧嗦又改了很多废话) 题意 在一个长度为$10^{9}$的序列上,保证只有$n(n<10^{6})$个区间等于$1$,且$1$的个数小于10^{7},其他位置全部为$-1$,求区间和$>0$的区间数量 分析 题目意思很简单,对不对~ 那接下来我们就思考下该怎么做这题. 考虑…
题意:给你n个点 求第k小的团 思路:暴力bfs+bitset压位 #include <bits/stdc++.h> using namespace std; const int N = 1e5+7; const int inf = 0x3f3f3f3f; typedef long long ll; typedef bitset<107> bs; struct node{ ll v; bs t; friend bool operator < (node a,node b){…
>传送门<题意:给你一个有n个元素的数组,一个sum,让你找到数组的子集使得子集元素和等于sum,保证只有一个解决方案. (其中1≤n≤36,0≤ sum<9*1018,0<ai<2*1017) 思路:写这题的时候队友直接搜子集,然后我就满脸???236,老哥你确定不会爆?于是天真的我发现和背包不是很像么,然后就用背包写,写完后发现W是9*1018,此时我的内心对我自己也是??? 所以暴搜肯定是不行的,有一个很巧妙的思路,就是将数组分成两个区域,18个元素我们完全可以暴力枚举…
传送门 大体思路就是:枚举所有可能的水平对称线,计算面积更新答案. 所有可能的水平对称线:\(L_i,R_i,{L_i+R_i\over 2}\) 计算面积:将所有可能的水平对称线从小到大排序,然后依次计算. 假设算出了第\(i-1\)条对称线的答案,然后更新第\(i\) 条的,两个的高度差为\(h\) 对于块1,贡献多了\(2h\),对块2并没有贡献. 当更新第\(i+1\)条时,高度差为\(h_2\),对块1的贡献为\(2h_2\),对块2的贡献为\(2h_2\). 当更新第\(i+2\)条…
示例1: 输入:600 输出:4 说明:'600', '0', '0', '00' are multiples of 300. (Note that '0' are counted twice because it appeared two times) 示例2: 输入:123000321013200987000789 输出:55 题意:给一个全由数字字符组成的字符串,求出是300倍数的子串的个数.0,00,000等都算,并考虑前导为0的情况. 题解:让求的是300的倍数,但是呢我们可以拆成既是…
>传送门< 题意:给你一个字符串s,求出其中能整除300的子串个数(子串要求是连续的,允许前面有0) 思路: >动态规划 记f[i][j]为右端点满足mod 300 = j的子串个数,可以容易的转移 则状态转移方程为:f[i][(10*j+num[i]) %300] = f[i][(10*j+num[i]) %300] + f[i-1][j] 解释:假如给你个数3,很容易得出3mod300的值就是3,f[3] = 1,然后在3后面加一位1,变为31,则31mod300的值为31,f[31…
https://ac.nowcoder.com/acm/contest/884/K 一开始整了好几个假算法,还好测了一下自己的样例过了. 考虑到300的倍数都是3的倍数+至少两个零(或者单独的0). 求以第i个位置的数为结尾的前缀和为j的数的方案数. 当遇到至少两个0的时候,ans+=dp[0][i-2]+1. +1是那两个0的贡献. 这样子算会漏算单独的0的贡献,最后加回去. 还因为忘记mod3段错误好几次. 老了. #include <bits/stdc++.h> using namesp…
传送门 k题: 题意: 给你一串由数字构成的字符串,你从这个字符串中找子字符串使这个字符串是300的倍数 题解: 这道题和第三场的B题极其相似 首先可以把是三百的倍数分开,必须要是100和3的倍数 是100的倍数就要求后面必须有两个0 是3的倍数就可以通过这个子字符串的数字之和是3的倍数来判断 那么暴力来计算子字符串肯定会超时,所以这个3的倍数这里要优化 首先我们要对这个字符串进行初始化,计算它的前缀和取余3后的结果 首先对一个0的出现要特判,因为题目上说了0也算300的倍数 其次大家想一下如果…
示例: 输入: 140 1-1 01 00 -1 输出:-1 999000000 1 -999000001 题意:给定平面上一系列的点,求一条以(x1,y1),(x2,y2)两点表示的直线将平面分为包含点数量相等的两部分,其中直线不能穿过任何一点. 思路: #include<bits/stdc++.h> using namespace std; struct node { int x,y; }; bool cmp(node p,node q) { if(p.x==q.x)return p.y&…
前置知识 代数基本定理 定理:每个次数 ≥ 1 复系数多项式在复数域中至少有一个跟. 由此推出,n次复系数多项式方程在复数域内有且只有n个根(重根按重数计算).(只要不断把多项式除以(x-xa),即可从有一个根推出有n个根) 实系数多项式因式分解定理 定理:每个次数 ≥ 1 实系数多项式在实数域上都可以唯一的分解成一次因式和二次不可约多项式的乘积. 证: 对 f(x) 的次数用数学归纳法. n=1时,一次多项式显然不可约,定理成立: 假设对次数 ≤ n 时定理成立, 设 f(x) 是 n 次多项…
>传送门< 题意:有n块能量石,每秒钟会增加Li的能量,但是一旦增长到了Ci它就不会增长了,它初始的能量为Ei. 现在有若干个时刻ti,会选择下标在[Si,Ti]的能量石吸取它们的能量,这些能量石的能量变为0,并依据上述规则继续增长. 问最后一共吸取了多少能量?思路:本来我写的时候没考虑到时间复杂度,蜜汁自信觉得应该能跑出来,然并卵,我模拟了整个过程,毫无疑问的TLE了.这题的做法好像是被称作为线性期望性,大概可以理解为,比如有m次查询,我直接每次求多个数据的期望和,最后把这m次期望加起来就是…
>传送门< 题意:给n个操作,每次和 (1e9范围内)即往数组里面插所有 的所有数,求每次操作后的中位数思路:区间离散化然后二分答案,因为小于中位数的数字恰好有个,这显然具有单调性.那么问题就转化为如何求小于等于某个数x的数一共有多少个. 考虑以下两种情况:假设左端点小于等于x的区间一共有q个 如果x不落在任何一个区间,那么答案显然是 否则假设x同时落在m个区间中,答案是 做一点点数学上的变换:令 注意到在第一种情况下m=0,所以我们就成功归约到只有一种情况.对区间的左右端点离散化,用两个树状…
>传送门< 题意:给你一个01矩阵,求出所有不可扩大的全为1的矩阵的个数 思路:比赛的时候想到了用单调栈,但是也只是想到了,并不知道怎么用,其实和之前求二维01矩阵中全为1的矩阵最大面积非常相像. 像到什么地步呢!!你想一个不能扩大的矩阵,也即是说不能向左右扩展,也不能向上扩展,那我们就用单调栈维护每一行中每个点能向上扩展的最大高度h. 目前到这里都和二位01矩阵求最大面积的解法一模一样!!接下来我们只需要判断这个矩阵能不能向下扩展就行了,对吧.这里我们就用数组记录一下,如果能向下扩展就记为1…
>传送门< 题意: 给你几组样例,给你两个字符a,b,一个长度len,一个长度为len的字符串str,str是字符串s的子串 str是s删掉除过a,b两字符剩下的子串,现在求s,多种情况输出一种.构造不出来输出-1 思路: 想都想不到的拓扑排序. 因为这个str肯定是满足s顺序关系的s的子串,所以依次对str建图,又因为给了好几个子串所以全部建图,如果最后跑完拓扑,得到的字符串长度等于s长度即 可. 所以今后遇到求顺序一定的问题或图,哪怕是字符串都往拓扑排序靠 细节:对于这道题最重要的就是对每…
传送门 J-Counting Triangles_2021牛客暑期多校训练营3 (nowcoder.com) 题目 Goodeat finds an undirected complete graph with n vertices. Each edge of the graph is painted black or white. He wants you to help him find the number of triangles (a, b, c) (a < b < c), such…
Count New String 题意: 定义字符串函数 \(f(S,x,y)(1\le x\le y\le n)\),返回一个长度为y-x+1的字符串,第 i 位是 \(max_{i=x...x+k-1}S_i\) 设集合\(A = {f(f(S, x_1,y_1),x_2-x_1+1,y_2-x_1+1)|1\le x_1 \le x_2 \le y_2 \le y_2 \le n}\) 求集合A 的大小 \(N\le 1e5\) 字符集大小 <=10 分析: 先放出官方题解 方法一 核心点…
LINK:Keyboard Free 我要是会正经的做法 就有鬼了. 我的数学水平没那么高. 三个同心圆 三个动点 求围成三角形面积的期望. 不会告辞. 其实可以\(n^2\)枚举角度然后算出面积 近乎可以得到面积的期望. 正解的话 听李指导说的意思是指二维积分?辛普森积分即可??? 值得一提的是 三角形面积我也不会计算 自闭了. code //#include<bits/stdc++.h> #include<iostream> #include<cstdio> #in…
2018牛客网暑期ACM多校训练营(第二场)I- car 链接:https://ac.nowcoder.com/acm/contest/140/I来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 题目描述 White Cloud has a square of n*n from (1,1) to (n,n). White Rabbit wants to know the maximum…
链接:https://ac.nowcoder.com/acm/contest/884/K来源:牛客网 题目描述 300iq loves numbers who are multiple of 300. One day he got a string consisted of numbers. He wants to know how many substrings in the string are multiples of 300 when considered as decimal inte…
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 string) 求若干个串的公共子串个数相关变形题 牛客这题题意大概是求一个长度为\(2e5\)的字符串有多少个不同子串,若\(s==t\)或\(s==rev(t)\)则认为子串\(s,t\)相同.我们知道回文串肯定和他的反串相同. 链接:传送门. 做法1: \(yx\)大佬秒出思路%%,对\(s…
题意 给出一个矩阵,矩阵每行的和必须为2,且是一个主对称矩阵.问你大小为n的这样的合法矩阵有多少个. 分析 作者:美食不可负064链接:https://www.nowcoder.com/discuss/87226?type=101&order=0&pos=1&page=1来源:牛客网 题目给出的合法矩阵是一个类似与邻接矩阵的样式. 所以应该往这方面去考虑. 每行之和等于2 , 代表每个点都连有两条边,可以有重边 不能有自环. 这说明 每个点属于且仅属于一个环. 因为输入只有一个n…
链接:https://www.nowcoder.com/acm/contest/140/I来源:牛客网 White Cloud has a square of n*n from (1,1) to (n,n). White Rabbit wants to put in several cars. Each car will start moving at the same time and move from one side of one row or one line to the other…
链接:https://www.nowcoder.com/acm/contest/140/D来源:牛客网 White Cloud has built n stores numbered from 1 to n. White Rabbit wants to visit these stores in the order from 1 to n. The store numbered i has a price a[i] representing that White Rabbit can spend…
number 题意 给一个数字串,问有几个子串是300的倍数 分析 dp写法:这题一看就很dp,直接一个状态dp[i][j]在第i位的时候膜300的余数是j左过去即可.这题比赛的时候样例老是少1,后面发现是中间忘记加上了,铁憨憨,以后一定要冷静,分析状态,找到少的那部分. #include<bits/stdc++.h> #include<vector> #include<algorithm> using namespace std; #define pb push_ba…
题目传送门 题意: 输入一个只包含数字的字符串,求出是300的倍数的子串的个数(不同位置的0.00.000等都算,并考虑前导零的情况). sample input: 600 123000321013200987000789 sample output: 4 55 题解: O(n)做法:遍历一遍,求前缀和sum取余3,统计sum的个数num[sum],遇到本位和下一位都是0,则把之前统计的个数加上,最后加上单独0的个数. O(300n)DP做法:如下 官方题解: Code: O(n)做法如下: /…
链接: https://www.nowcoder.com/acm/contest/139/I 题意: 给出一个n(1≤n≤5e4)个字符的字符串s(si ∈ {a,b,c}),求最多可以从n*(n+1)/2个子串中选出多少个子串,使得它们互不同构.同构是指存在一个映射f,使得字符串a的每个字符都可以映射成字符串b的对应字符.例如ab与ac.ba.bc.ca.cb都是同构的. 分析: 以字符串abba为例:现在只考虑这个字符串的2个子串ab和ba,如果不考虑重构,有2个子串,否则,只有1个子串.这…
题意:给你一个n*m的矩阵 ,每个位置都有一个字符并且都有一个值,现在需要找到一个p*q的子矩阵, 原来的矩阵可以由现在这个矩阵无限复制然后截取其中的一部分得到,并且要求 子矩阵里最大的值 * (p+1)*(q+1)的值最小. 题解:对于每一行处理出可能的循环节长度, 然后找到一个长度是所有行的循环节, 对于列同样处理.然后问题就变成了对n*m所有的p*q的子矩阵的找到最小的最大值.这个操作用单调队列维护. 代码: #include<bits/stdc++.h> using namespace…
题目链接: 解法: 先建n颗平衡树,合并的时候将a中最右的结点翻转到根节点,b中最左的结点翻转到根节点,对合并后的根节点进行标记. #include <bits/stdc++.h> using namespace std; #define ls(p) p << 1 #define rs(p) p << 1 | 1 ; int n, m, cnt; int rt[M]; struct node{ ], val, cnt, sz, lazy; }spl[M]; bool i…
题意 有 $n$ 种树,每种树都有高度 $H_i$,费用 $C_i$,数量 $P_i$,现要砍掉一些树,使得剩下的树中最高的树的数量超过一般,求最小的费用.($1 \leq n \leq 10^5, \ 1 \leq H_i \leq 10^9, \ 1 \leq C_i \leq 200, \ 1 \leq  P_i \leq 10^9$) 分析 首先,容易想到我们应该枚举最高树的高度,将更高的全部砍掉,再从低的中选取k个费用最小的砍掉. 重点在于如何求出当前最小费用的k个. 注意到 $C_i…
题意 给定 $n$ 个物品,体积分别为 $v_i$,现有 $K$ 的容积一样的箱子,按如下策略装入物品:每次选取尽可能大的装入(较大的不能装入时可以向小的找),依次装入箱子. 分析 首先,不具有严格的单调性,即可能大的箱子不符合但小的符号.与我们的直觉有点不同,是这个策略造成的. 但是基本单调,最优解应该在二分结果附近,于是有了方法一. 方法二:找出答案的上下界,下界 $\left \lceil sum/k \right \rceil$,上界 $ \left \lceil sum/k \righ…