题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 1 1 1 1 1 有篇博主的代码细节处理的很好,由于矩阵每行的长度一致,则不必重复在数组末尾标记0:然后由于j是从1,最开始如果push进0的话,有两个好处: 1.可以不受栈之前"残留"的元素m+1的影响 2.不用再判断栈是某为空来确定wid的值 Code #include <b…
LINK:Keyboard Free 我要是会正经的做法 就有鬼了. 我的数学水平没那么高. 三个同心圆 三个动点 求围成三角形面积的期望. 不会告辞. 其实可以\(n^2\)枚举角度然后算出面积 近乎可以得到面积的期望. 正解的话 听李指导说的意思是指二维积分?辛普森积分即可??? 值得一提的是 三角形面积我也不会计算 自闭了. code //#include<bits/stdc++.h> #include<iostream> #include<cstdio> #in…
LINK:Just Shuffle 比较怂群论 因为没怎么学过 置换也是刚理解. 这道题是 已知一个置换\(A\)求一个置换P 两个置换的关键为\(P^k=A\) 且k是一个大质数. 做法是李指导教我的. \(k\sqrt{A}=p\)即\(A^{\frac{1}{k}}=p\) 设当前置换大小为r 那么有 \(A^r=I\)其中I为单位置换. \(A^{r+1}=A\)那么有\(A^{ar+1}=A\) 原式等于\(A^{\frac{ar+1}{k}}=P\) 那么只需要随便找个a满足\(k|…
LINK:Interval 赛时连题目都没看. 观察n的范围不大不小 而且建图明显 考虑跑最大流最小割. 图有点稠密dinic不太行. 一个常见的trick就是对偶图转最短路. 建图有点复杂 不过建完跑最短路即可. 当做复习了一下吧. 值得注意的是需要开\(long long\) code //#include<bits/stdc++.h> #include<iostream> #include<cstdio> #include<ctime> #includ…
LINK:Cover the Tree 最受挫的是这道题,以为很简单 当时什么都想不清楚. 先胡了一个树的直径乱搞的贪心 一直过不去.后来意识到这类似于最经典长链剖分优化贪心的做法 然后那个是求最大值 这个是构造不太一样 最后也没能搞出来. 不过后了我wa了几发之后 我唯一的队友看不下去了 他来做这道题了 最后还是过了这道题.(有一个好队友就是很舒服 可以想到从叶子节点到跟的过程 每个叶子节点必须要向上合并 因为其父亲的那条边需要被覆盖. 这要到达某个节点会有很多叶子节点相遇 此时考虑父亲那条边…
LINK:Boundary 计算几何确实是弱项 因为好多东西都不太会求 没有到很精通的地步. 做法很多,先说官方题解 其实就是枚举一个点 P 然后可以发现 再枚举一个点 然后再判断有多少个点在圆上显然会超时. 直接考虑求出所有点和\(O,P\)的夹角 因为同弧所对圆周角相等 最后统计有多少个角度相等来做. 一个误区是 两个对称的圆上的点被算在一起了 此时强制利用 第三个点在所在直线的左侧/右侧来消除影响. 正确性显然.复杂度\(n^2\cdot logn\) 一个比较好想好写的做法: 枚举到第三…
LINK:All with Pairs 那天下午打这个东西的时候状态极差 推这个东西都推了1个多小时 (比赛是中午考试的我很困 没睡觉直接开肝果然不爽 一开始看错匹配的位置了 以为是\(1-l\)和\(r-(r-l+1)\)进行匹配. 我想这不是随便写个trie树???码完发现过不去样例 我真的是眼瞎 后来看清了. 大致思路如下 可以直接暴力枚举\(n^2\)个点对 找到最大的匹配位置这个也可以暴力 由于串长总和是M. 这一部分复杂度也不过是\(n^2+M\)的. 过不了 就可以思考能不能从大到…
题目 题意: 给你n(最大36)个数,让你从这n个数里面找出来一些数,使这些数的和等于s(题目输入),用到的数输出1,没有用到的数输出0 例如:3  4 2 3 4 输出:0 0 1 题解: 认真想一下这一道题,首先看到n不是多大就想用dfs(超时),又在dfs的基础上记忆化(超时),大概是我记忆化不完全.又想用01背包,打出来代码后发现s就是体积,但是s的范围太大了,数组存不下 T_T 看题解发现用一个叫 折半枚举(就是一种思想) 和 二进制枚举 的东西 折半枚举:比如有时集合过大无法全部搜索…
题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意:二维平面上有n个不同的点,构造一条直线把平面分成两个点数相同的部分. 题解:对这n个点以x为第一关键字,y为第二关键字从小到大排序.找到最中间两个点.然后以这两个点为界限,将平面划分为左右两个点数相同的区域.如图所示. 由于题目中给出点的坐标绝对值≤1000,而我们需要给出的点的坐标范围为1e9,因此必定可以找到这样一条很陡的直线. AC代码: #include <bits/stdc++.h>…
LINK:Happy Triangle 这道题很容易. 容易想到 a+b<x a<x<b x<a<b 其中等于的情况在第一个和第三个之中判一下即可. 前面两个容易想到set来找前驱后继 第三个 考虑比x大的数字中两个连着的数字差的最小值 直接用线段树维护一下即可. code //#include<bits\stdc++.h> #include<iostream> #include<iomanip> #include<cstdio>…