首页 > TAG信息列表 > MID

ARC100 部分题解

C: 转化一下就是取中间部位,绝对值之和最小 // by Balloons #include <cstdio> #include <vector> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> #define mpr make_pair #define debug() cerr<<"Madoka"

2022.9.4———HZOI【CSP-S模拟2(联考)】

\(Write\ In\ Front\) \(Rank33/43\) 只拿了 \(13 + 25 + 32 + 7 = 77pts\) \(lyin\)大佬三百多分,我一百不到,我太菜了 \[ \Huge \mathbf{水博客警告!} \]这篇博客里基本没写啥 \(\mathfrak{T1}\ 谜之阶乘\) 蜜汁阶乘太草了 注意到a-b最大差值不会超过\(20\),因为\(20!\)已经达到了1

【学习笔记】可持久化权值线段树--主席树 (静态)

001 前置芝士 (1)动态开点线段树 (2)动态开点维护权值线段树 (3)可持久化数组(可持久化线段树) (4)掌握权值线段树以及查询全局第k大/小值 002 动态开点 我们知道,开一棵线段树数组所需空间为4*MAXN,当MAXN过大时,显然会MLE,那有没有什么优化空间的方法呢? 当然有(废话,要是没有我还写什么) 动态开点

搜索插入位置

搜索插入位置 一、题目描述 给定一个有序数组。需要插入一个元素。返回插入索引。 请必须使用时间复杂度为 O(log n) 的算法。 实例 输入: nums = [1,3,5,6], target = 5 输出: 2 输入: nums = [1,3,5,6], target = 2 输出: 1 输入: nums = [1,3,5,6], target = 7 输出: 4 二、

LeetCode 1901 Find a Peak Element II 二分

A peak element in a 2D grid is an element that is strictly greater than all of its adjacent neighbors to the left, right, top, and bottom. Given a \(0\)-indexed m x n matrix mat where no two adjacent cells are equal, find any peak element mat[i][j] and

P8539 「Wdoi-2」来自地上的支援 题解

思路 根据题意,如果每次询问选中的为第 \(x\) 个数,那么前 \(x-1\) 次操作一定不会选中第 \(x\) 个数。(感觉在说废话。) 同样,因为第 \(x\) 个数必须被选中 \(k\) 次,根据题意,不难发现这 \(k\) 次选中一定是从第 \(x\) 次操作到 \(x+k-1\) 次操作被选中。因为如果某个数在某次操作时没

AtCoder Regular Contest 148 A - mod M

题面 You are given a sequence \(A = (A_1, A_2, ..., A_N)\). You may perform the following operation exactly once. Choose an integer \(M\) at least \(2\). Then, for every integer \(i\) (\(1 \leq i \leq N\)), replace \(A_i\) with the remainder w

关于二分边界

关于二分边界 1. 终止条件 while (l < r) 2. mid取值 如果答案寄存在\(l\)上,则mid = (l + r + 1) >> 1,反之如果答案寄存在\(r\)上,则mid = (l + r) >> 1。 3. l, r取值 如果要求较小的答案,比如小于等于某数的最大值,就是将答案寄存在\(l\)上,以此为例此时 while (l < r) { int mid

Codeforces 题目选做

CF1711D 令直接下大雨的点为关键点。 做法一: 首先有结论:对于发大水的点我们只需要考虑关键点即可。 证明: 对于两个相邻的关键点 \(x_i\) 和 \(x_j\) \((x_i<x_j)\) 。令他们的降水量分别为 \(p_i\) 和 \(p_j\) 。考虑中间的一个点 \(pos\) 。 那么考虑这两个关键点对这三个点的影

归并排序

归并排序时间平均复杂度为O(nlogn)。归并排序是创建在归并操作上的一种有效的排序算法,其核心思想与快排相同,也是分治思想。  分治思想可分为三步走: 原问题分成子问题 递归处理子问题 子问题合并  时间复杂度对比图:  归并排序动图: 归并排序函数: void merge_sort (int a[

10.求一个数组最大值(递归)

int GetMax(int arr[], int left, int right) { if (left == right) return arr[right]; int mid = left + ((left-right)>>1); int leftMax = GetMax(arr, left, mid); int rightMax = GetMax(arr, mid+1, right); return leftMax > right

数据结构实验(二)递归函数练习

6-1 递归法求Fibonacci数列第n项的值 这道题就是写一个简单的递归函数即可 int fun( int n ){ if( n == 1 || n == 2 ) return 1; return fun(n-1) + fun(n-2); } 6-2 分治法求解金块问题 这道题就是典型的分治 [l,r],区间的中点是mid,那么a[l,r]的最小值就是min( a[l,mid]

ARC 记录

ARC145F Modulo Sum of Increasing Sequences 先考虑 \(p\mid n\) 的情况,令 \(b=\frac pn\)。 典中典。 列出生成函数: \[[x^ky^m](\prod_{i=0}^{n-1}(1+x^iy))^b\bmod(x^n-1) \]一个关于循环卷积的结论是:(就是对多项式的每个位置单位根反演然后线性组合) \[[x^0]f\bmod(x^n-1)=\frac

2022.9.7 模拟

挂了点分,原因如下: r = mid - 1 ;mid = (l + r) / 2; Unknown TLE (本地测没有超过0.7s) 反正题不难。 T3一眼原题,其实现做也会,就是缩点后的拓扑 dp 。 然后做 T2,T2读了题的前几行:线段树区间覆盖,一看数据:我是傻逼。 然后开始想乱搞,但是都不太靠谱,然后我忽然发现这题可以二分,于是就

20220906总结

20220906三道模拟题 第一道没有什么技术含量,也没有什么算法,只要注意不出一些小失误就可以了。 第二题看到数据范围之后开始犯难,感觉想到的几种写法都无法拿到满分,其中有想到二分的正解思路,但因为没想明白如何打开区间所以最终沉没了。 正解就是二分第k个数的值,看小于它的数的个数

最大数

https://www.luogu.com.cn/problem/P1198 线段树的应用,其中需要一个cnt记录当前已经存放了的个数 last记录上次查询的值 #include <bits/stdc++.h> using namespace std; #define INF -2e9 #define MAX 1000005 int dat[MAX], m, D, nums, cnt, last; char q; void add(int l,

jerry99的序列 --binary search, math

    #include <bits/stdc++.h> using namespace std; using i64 = long long; const int N = 1e5 + 10; const int M = N - 10; int tot, vis[N], prime[N]; //#define LOCAL void sieve () { for (int i = 2; i <= M; ++i) { if (!vis[i])

个人赛题解

A. Rectangular Queries 题意 给定一个最多包含 \(10\) 个不同数字的 \(n\times n\) 矩阵,依次回答 \(q\) 个询问,每个询问给定了一个子矩阵,问该子矩阵有多少不同数字。 题解 注意只有十个数字,预处理二维前缀和数组\(cnt[k][i][j]\)表示子矩阵 \((1,1) \to (i,j)\)中数字\(k\)的个数

CSP-S模拟2(联考)

差点又双叒叕模拟退役 上来先\(\% T2\), 然后感觉就差一点, 最后搞出来就十点多了.. 然后心态一度爆炸,有点小摆烂,上厕所冷静一下觉得还有时间,能抢救一下 然后开了 \(T1\), 没啥思路瞎搞,开根号在附近找数用 \(pow\),发现大数据丢精异常严重 $pow(n, 1.0 / 1) $比 \(n\)大了好几百你敢信

XM6138 分糖果(线段树)

XM6138 分糖果 stO jc Orz 解题思路 很神奇的一题。 看到题目首先想到的就是二分答案。那么问题转化为了如何验证一个答案 \(x\)。 我们定义函数 \(f_{i,j}\) 表示考虑前 \(i\) 个小朋友,是否可以分成 \(j\) 段,使得每一段都满足和小于 \(x\)。这个函数很好转移: \[f_{i,j}\leftarrow

排序算法整理C++(初赛)

排序算法整理 常见考点 将一个乱掉的字符串排回有序(以交换为基本操作)的最少操作,就是冒泡排序。 排序算法的稳定性 排序算法的时间复杂度 排序算法的稳定性 稳定性是指排序前两个元素a1 = a2,a1在前。排序过后,倘若a1始终在前,则算法是稳定的,否则是不稳定的。 稳定的 冒泡排序、插入

654.maximum-binary-tree 最大二叉树

递归就好了,没啥好说的。 class Solution { private: int getMax(vector<int> &nums, int l, int r) { int m_index = l; for (int i = l; i < r; i++) { if (nums[i] >= nums[m_index]) m_index = i; }

二分查找

一、思路 使用二分查找的前提是数组是有序的,思路是把整个数组根据中点一分为二,如果target小于中点,则将搜索目标缩小为左半部分再继续搜索,否则搜索目标缩小为右半部分,直到找到中点为target返回。 二、解题模板 int binarySearch(int[] nums, int target) { int left = 0, righ

归并排序

需要额外空间的外部排序? 菜鸟教程版本 这个版本的写法很不一样, 首先,它每次都copy构造了两个子数组,然后再从这两个子数组中挑元素往原数组放 构造的两个子数组容量都+1,并且设置末尾值为max值,为了比较大小的时候方便 // 合并操作 void Merge(vector<int>& arr, int front, int m

cdq分治

cdq分治,一种广为人知的离线分治算法。大体的思想是: 将左右两边区间分开递归处理。 统计左边区间修改对右边区间查询的影响。 第一步很简单,写两个递归就行了。关键在第二步。我们搞个cdq的经典问题——三维偏序来具体解释这个东西。 P3810 【模板】三维偏序(陌上花开) 三维偏序,顾名