[2019牛客多校第二场][E. MAZE]】的更多相关文章

题目链接:https://ac.nowcoder.com/acm/contest/882/E 题目大意:有一个\(n\times m\)的01矩阵,一开始可以从第一行的一个点出发,每次可以向左.向右.向下移动一格且不能回头.中途会有一些点变为障碍物(用1表示),或者从障碍物变回可以通过的格子,同时还需要处理询问:从\((1,a)\)出发,走到\((n,b)\)的方案数有多少种.\(n\leq 50000,\ m\leq 10\) 题解:设\(f(i,j)\)为走到\((i,j)\)的方案数,且第…
题意: n * m的矩阵,为0表示可以走,1不可以走.规定每走一步只能向下.向左.向右走.现给定两种操作: 一.1 x y表示翻转坐标(x,y)的0.1. 二.2 x y表示从(1,x)走到(n,y)有几种走法 思路: 假设\(dp[i][j]\)表示从下一层能到达(i,j)点的路径数,那么显然到达(i,j)的路径数为\(dp[i + 1][j]\). 我们能很显然的得到转移方程\(dp[i][j] = \sum_{k = l}^r dp[i - 1][k]\),其中l~r为(i,j)下方能直接…
2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n-1,从0号点出发,每次向左走或者向右走的概率是相同的,问你出发后,经过n-1个点后,恰好到达点m的概率是多少,答案是一个前缀积 题解: 讨论两个点的情况: 点0->1的期望是1 讨论三个点的情况 假设我们要到点3,我们必须经过点2,然而我们到了点2可能会再回到点1再到达点3,所以我们讨论必须经过的…
Second Large Rectangle 题目传送门 解题思路 先求出每个点上的高,再利用单调栈分别求出每个点左右两边第一个高小于自己的位置,从而而得出最后一个大于等于自己的位置,进而求出自己的位置的高为高,这个点所在的边为底的最大矩形.这些求出的矩形中的最大值即为可求出的最大矩形.而次大值可能是这些矩形之一,也可能是这些矩形的高减1或者宽减1得到的矩形.所以把这些全都记录下来,第二大的即为答案.由于这样求出的矩形会有重复,所以记录一下坐标来去重. 代码如下 #include <bits/s…
题目链接:https://ac.nowcoder.com/acm/contest/882/G 题目大意:有\(n\)条直线将平面分成若干个区域,要求处理\(m\)次询问:求第\(q\)大的区域面积.保证没有三线共点或者两直线重合,\(n\leq 1000,\ m\leq 10000\) 题解:先考虑最多会有多少个区域,由于第\(i\)条直线最多与前面的\(i-1\)条直线同时相交,所以交点个数和区域个数都是\(n^2\)级别的,考虑求出所有区域的面积并排序 首先预处理所有的交点,并记录与该交点相…
题目链接:https://ac.nowcoder.com/acm/contest/882/H 题目大意 给定一个 n * m 的 01 矩阵,求其中第二大的子矩阵,子矩阵元素必须全部为 1.输出其大小. 分析1(前缀和,O(NM2)) 这题数据没那么强,所以用前缀和暴力枚举也能过. 代码如下 #include <bits/stdc++.h> using namespace std; #define INIT() ios::sync_with_stdio(false);cin.tie(0);co…
把以前的题补补,用悬线求面积第二大的子矩形.我们先求出最大子矩阵的面积,并记录其行三个方向上的悬线长度.然后排除这个矩形,记得还得特判少一行或者少一列的情况 #include <bits/stdc++.h> using namespace std; ; int n; int mat[maxn][maxn],Left[maxn][maxn],Right[maxn][maxn],up[maxn][maxn]; int main() { int T; T=; while(T--) { int m,n…
Kth Minimum Clique 题目传送门 解题思路 我们可以从没有点开始,把点一个一个放进去,先把放入一个点的情况都存进按照权值排序的优先队列,每次在新出队的集合里增加一个新的点,为了避免重复,一个集合中的放入次序是按编号递增的,新放进去的点必须和已经在集合中的所有点之间都有一条边.当然我们不可能在入队时写两层循环来判断能不能放,所以用bitset,为1则说明集合里的点都和这个点之间有边,每次入队前利用&操作更新. 代码如下 #include <bits/stdc++.h> #…
Partition problem 题目传送门 解题思路 假设当前两队的对抗值为s,如果把红队中的一个人a分配到白队,s+= a对红队中所有人的对抗值,s-= a对白队中所有人的对抗值.所以我们可以先假设所有人都在红队中,把人一个一个分配到白队中,枚举所有的情况求最大值. 然后继续剪枝: 1.我们可以让1是固定在白队. 2.在搜索的过程中让序号递增,以此来避免重复枚举. 3.保证剩下的的人数足够选择,不够的必然不行. 代码如下 #include <bits/stdc++.h> #define…
题意 从数字 $0$ 除法,每次向前走 $i$ 步,$i$ 是 $1 \sim K$ 中等概率随机的一个数,也就是说概率都是 $\frac{1}{K}$.求落在过数字 $N$ 额概率,$N=-1$ 表示无穷远. 分析 设落在过 $i$ 的概率为 $p_i$,则 $p_i = \frac{1}{K}p_{i-1} + \frac{1}{K}p_{i-2}...+\frac{1}{K}p_{i-k}$. 以 $k=2$ 为例, $p_0 = 1 \\p_1 = \frac{1}{2} \\p_2 =…
题目链接:https://ac.nowcoder.com/acm/contest/882/A 题目大意:圆上有\(n\)个点,标号从\(0\)到\(n-1\),初始一个人在点\(0\),每次会等概率向左或向右移动一步,如果某一时刻所有点均被访问过则停止移动,问最终停留在\(m\)点的概率 题解:若\(m \neq 0\)且\(n \neq 1\),则\(ans=\frac{1}{n-1}\),具体证明如下 若设答案为\(f(n,m)\),可以发现这个函数有如下性质: 1.函数是关于零点对称的,即…
Eddy Walker 题目传送门 解题思路 因为走过所有的点就会停下来,又因为是从0出发的,所以当n>1时,在0停下来的概率为0,其他的为1/(n-1); 代码如下 #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))…
Partition problem 暴力+复杂度计算+优化 题意 2n个人分成两组.给出一个矩阵,如果ab两个在同一个阵营,那么就可以得到值\(v_{ab}\)求如何分可以取得最大值 (n<14) 分析 经过复杂度计算我们可以算出28!2828过⑧了,但是28!28可以过,所以我们思考一下怎么优化计算阵营值得过程.可以考虑一种dp得思想,当选择这个人进A阵营时,后面所以得人进A阵营都会得到A得值,所以只要把这个人的贡献加到后面所有可选择的人的进A阵营的贡献即可,每次选一个人的时候,只要把当前的人…
题意:把2n个人分成相同两组,分完之后的价值是val(i, j),其中i属于组1, j属于组2,已知val表,n <= 14 思路:直接dfs暴力分组,新加的价值为当前新加的人与不同组所有人的价值.复杂度$O(C_{2n}^n * n)$. 大概6e8这样子, 代码: #include<cmath> #include<set> #include<map> #include<queue> #include<cstdio> #include&l…
2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有两个属性a,b 需要将点划分为两堆,划分依据是对于在A划分中的任意点a和在B划分中的任意点b满足 不存在当a.x>b.x时,a.y<b.y 的情况 在A划分中的点可以给出其a属性的贡献,在B划分中的点可以给出其b属性的贡献 求最大贡献和 题解: 根据题意,我们可以得出结论,我们需要找的是一根折线,…
链接:https://ac.nowcoder.com/acm/contest/881/E 来源:牛客网 ABBA 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言1048576K 64bit IO Format: %lld 题目描述 Bobo has a string of length 2(n + m) which consists of characters A and B. The string also has a fascinating prop…
链接:https://www.nowcoder.com/acm/contest/140/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 题目描述 White Cloud is exercising in the playground. White Cloud can walk 1 meters or run k meters per second. Since White Clou…
链接:https://www.nowcoder.com/acm/contest/140/A来源:牛客网 题目描述 White Cloud is exercising in the playground. White Cloud can walk 1 meters or run k meters per second. Since White Cloud is tired,it can't run for two or more continuous seconds. White Cloud wi…
题目链接 传送门 题意 求在\(n\times m\)的\(01\)子矩阵中找出面积第二大的内部全是\(1\)的子矩阵的面积大小. 思路 处理出每个位置往左连续有多少个\(1\),然后对每一列跑单调栈,记得处理由同一矩阵贡献的面积. 代码实现如下 #include <set> #include <map> #include <deque> #include <queue> #include <stack> #include <cmath&g…
题目链接 传送门 题意 在一张\(n\times m\)的矩阵里面,你每次可以往左右和下三个方向移动(不能回到上一次所在的格子),\(1\)表示这个位置是墙,\(0\)为空地. 现在有\(q\)次操作,操作一是将\((x,y)\)这个位置的状态取反,操作二问你从\((1,x)\)走到\((n,y)\)的方案数. 思路 首先我们考虑不带修改操作时求方案数: 我们发现从第\(i-1\)行到第\(i\)行的\(j\)这个位置只能通过\((i-1,j)\)到达,因此可以从第\(i-1\)行到\((i,j…
目录 题目链接 题意 思路 代码 题目链接 传送门 题意 找第\(k\)小团. 思路 用\(bitset\)来标记每个结点与哪些结点直接有边,然后进行\(bfs\),在判断新加入的点与现在有的点是否都有边则直接用\(bitset\)与一下即可,记得去重. 代码 #include <set> #include <map> #include <deque> #include <queue> #include <stack> #include <…
题目链接 传送门 题意 总共有\(2n\)个人,任意两个人之间会有一个竞争值\(w_{ij}\),现在要你将其平分成两堆,使得\(\sum\limits_{i=1,i\in\mathbb{A}}^{n}\sum\limits_{j=1,j\in\mathbb{B}}^{n}w_{ij}\)最大. 思路 看到这一题第一想法是状态压缩然后枚举状态,然后人就没了. 其实这题就是个普通的\(dfs\),假设在枚举第\(i\)个人时,前面已经有\(tot1\)个人分进了\(\mathbb{A}\),\(t…
题意: 给你一幅图,问你第二大矩形面积是多少. 思路: 直接一行行跑stack求最大矩阵面积的经典算法,不断更新第二大矩形面积,注意第二大矩形可能在第一大矩形里面. #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupper #include <cstdlib>//malloc exit strcat itoa system("cls&qu…
题目链接:https://ac.nowcoder.com/acm/contest/881/D 看此博客之前请先参阅吕凯飞的论文<集合幂级数的性质与应用及其快速算法>,论文中很多符号会被本文延用! 题目大意 给定一个 n * m 的二维矩阵和 k,定义$count(x) = \sum\limits_{i = 1}^{n} \prod\limits_{j = 1}^{m} [v_{i, j} \& x 所表示的二进制位有奇数个一] $,求如下式子: $$\begin{align*}\big…
Second Large Rectangle 题意 给出n*m的01矩阵,问由1组成的第二大的矩阵的大小是多少? 分析 单调栈(or 悬线法)入门题 单调栈 预处理出每一个点的最大高度,然后单调栈每一个点扫,一个点的左右高度不小于他的点就可以构成一个矩形,因此就可以求出矩形面积了. 悬线法 预处理每个点的连续最左边,最右边,和最上面.同时一个点的最左边要小于等于他的正上方那个点的最左边,右边同理,即要满足,高度优先,尽量取左右边界,这样就可以取遍所以的极大矩形了.…
链接:https://www.nowcoder.com/acm/contest/140/G White Cloud placed n containers in sequence on a axes. The i-th container is located at x[i] and there are a[i] number of products in it. White Rabbit wants to buy some products. The products which are re…
一个人可以走一步或者跳x步,但不能连着跳,问到这个区间里有几种走法 考虑两种状态  对于这一点,我可以走过来,前面是怎么样的我不用管,也可以跳过来但是,跳过来必须保证前一步是走的 dp[i][0]表示i这一步是走过来的dp[i][1]表示i这一步是跳过来的 #include<iostream> #include<bits/stdc++.h> using namespace std; ][]; ; ]; int main() { int n,w; cin>>n>&g…
ABBA 题目传送门 解题思路 用dp[i][j]来表示前i+j个字符中,有i个A和j个B的合法情况个数.我们可以让前n个A作为AB的A,因为如果我们用后面的A作为AB的A,我们一定也可以让前面的A对应那个B,同理,我们可以让前m个B作为BA的B. 接下来讨论转移方程.当i<=n时,这个A作为AB的A必然可以放进来,当i>n时,此时若放入A,则这个A是第i-n个BA的A,所以只有当i<=n+min(j,m)时才可以放入.同理,只有当j<=m或者j<=m+min(i,n)时才可…
Equivalent Prefixes 传送门 解题思路 先用单调栈求出两个序列中每一个数左边第一个小于自己的数的下标, 存入a[], b[].然后按照1~n的顺序循环,比较 a[i]和b[i]是否相等,如果不相等则退出循环,此时最后一个相等的就是答案. 假设前1 ~ n-1已经满足了条件,此时判断1 ~ n是否可行,就是判断l~n是否都成立,如果a[n] < b[n], 那么当l=b[n]时,序列1的RMQ为b[n],序列2的为n,明显不成立,a[n] > b[n]同理.当a[n]等于b[n…
题意: 有n种商品,每种商品有一个价格 p[i] . 每种商品都有2种打折方式: 1. 给你优惠 d[i] 元. 2. 免费送你第 f[i] 种饮料. 现在求每种饮料至少一瓶的最小花费. dp[i][0] 表示 i 的子树内所有的饮料都至少买了一瓶. dp[i][1] 表示 i 的子树内所有的饮料都至少买了一瓶 且 第i种饮料是使用第2种方式购买的. 我们考虑树的转移方式. sum[i] 表示  dp[son[i]][0] 的和 dp[i][1] = sum[i] + p[i] dp[i][0]…