- 博客(22)
- 收藏
- 关注
原创 大一训练4题解
Problem - 1728A - Codeforces 题目大意:有n种颜色球,每种颜色球有cnt个球,且球的总数为奇数,每次取不同的两个颜色各取一个球,问最后可能剩下球的颜色的编号。数量最大的的一堆球一定可以剩下,让其他颜色先配对,剩下的一定比最大值小。Problem - 1627A - Codeforces题目大意:给定n行m列的矩阵以及r,c,矩阵的每个单元为W代表白色或B代表黑色。每次操作可以选择一个黑色的单元让其所在的行或者列全变为黑色,问最少多少次操作让给r行c列的这一单元变为黑色,如果
2022-11-25 17:12:27
383
1
原创 洛谷P1439 【模板】最长公共子序列
但这道题的n高达1e5,朴素做法无论时间还是数组都不够用,但两序列长度相同并且都是1-n的排列,因此可以进行优化将时间复杂度降为nlogn,数组降为1维。
2022-11-11 15:20:30
600
原创 2021 ICPC 江西省大学生程序设计竞赛(正式赛)
有n个数依次进入缓冲区,如果这个数已经存在那么就代替更早进入的这个数并且缓冲次数。如果没有这个数并且已经满了,就删除最早进入的数该数再进去,如果没满就进入。求最小的缓冲区容量使得缓冲次数不小于k。
2022-11-04 21:38:12
1580
原创 种类并查集
种类并查集与朴素的并查集判断是否在同一集团,可能有多个集团。先看一个例题:https://www.luogu.com.cn/problem/P1525一共有n个罪犯,m组对立关系,这道题我们可以通过贪心将怨恨值从大到小排序,大的怨恨值两人先分开放在不同的监狱,直到两个人无法分开放即为答案。那么我们如何来将罪犯们分配到两个监狱呢?可以通过利用种类并查集的方式。对于n个元素,我们开大小为2n的数组,n+1-2n这n个元素依次代表前n个元素的对立关系,即“敌人”。对于每一组对立关系,比如我
2022-05-06 20:13:23
586
1
原创 算法进阶指南0x02:递归
什么是递归?程序调用自身的编程技巧称为递归( recursion)。递归作为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。(百度百
2022-04-19 22:02:26
60
原创 算法竞赛进阶指南0X00:位运算
一、基本的位运算符二、补码,反码,原码1.原码就是符号位加上真值的绝对值,其他位表示值。如+1的原码为0000 0001-1的原码为 1000 00012.正数的反码是其本身,而负数的反码是其原码符号位不变,其他位置取反。3.正数的补码是其本身,而负数的补码是其反码+1。三、移位运算对于左移:1<<n为1的各二进制位左移n位,所以结果为2的n次方。n<<1则为2n。对于右移:n>>1为n/2向下取整。四、快速幂...
2022-04-13 12:09:47
226
原创 动态规划之背包问题
背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。相似问题经常出现在商业、组合数学,计算复杂性理论、密码学和应用数学等领域中。也可以将背包问题描述为决定性问题,即在总重量不超过W的前提下,总价值是否能达到V?背包问题一般分为以下几类:1.01背包问题2.完全背包问题3.多重背包问题4.分组背包问
2022-04-03 11:00:21
2020
原创 题解A Bug‘s Life(种类合并)
BackgroundProfessor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different genders and that they only interact with bugs of the opposite gender. In his experiment, individual bugs and their interac.
2022-03-18 20:12:53
415
原创 二分:最小值最大化
题意:输入n个数,再输入一个c,从n个数中选取c个数,使得这c个数使得两个数差的绝对值的最小值尽可能大,最后输出这个最大的最小值。输入6 31 2 3 13 9 8输出 5输入5 31 2 8 4 9输出 3我们对这个最大化的最小值进行二分,二分的left为0或者两个数差的绝对值的最小值,right为最大的数与最小数的差的绝对值,mid是我们假设的最小值。首先,对这几个数排序,想要让找到最大的最小值,那么最小的数一定是选取的,我们用k来表示...
2022-03-06 21:09:46
505
原创 图论:最小生成树的求法
一、克鲁斯卡尔算法克鲁斯卡尔算法将所有边按从小到达排序,遍历所有边,如果边的两头不在一个集合,则两头加入同一集合。遍历所有边的时候,所有点都已加入集合,如果集合中的点小于n,则存在点不在生成树中。#include<bits/stdc++.h>using namespace std;const int N=10010;int n,m;int p[N];struct Edge{ int a,b,w; bool operator<(const Edge &W)c
2022-02-24 16:24:55
254
原创 四个最短路
单源最短路:求一个点到其他点的最短路。多源最短路:求任意两个点的最短路。稠密图用邻接矩阵存,稀疏图用邻接表存储。稠密图: m 和 n2 一个级别稀疏图: m 和 n 一个级别一 、朴素distra算法算法思路:1.使用一个dist数组来存所求的点到其他点的距离,初始化距离的时候,如果是源点到自身的距离记为0,其他的则记为无穷大.2.找到一个没有被标记过的并且距离源点最近的点,利用这个点来更新所求点到其他所有点的距离(设源点为i,此时标...
2022-02-24 15:26:24
372
原创 题解:树的的重心(树与图的深度优先遍历)
题目给定一颗树,树中包含n个结点(编号1~n)和n-1条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。输入格式第一行包含整数n,表示树的结点数。接下来n-1行,每行包含两个整数a和b,表示点a和点b之前存在一条边。输出格式输出一个整数m,表示重心的所有的子树中最大的子树的结点数目输入样例91 21 71 4
2022-02-17 22:25:09
146
原创 数据结构:手写堆
堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:1.堆中某个节点的值总是不大于或不小于其父节点的值;2.堆总是一棵完全二叉树。手写堆用一维数组来储存数据,本篇以小根堆(某个节点总是大于其父节点)为例。如果一个根节点的下标为x,则其左子节点的下表为2x,右子节点的下标为2x+1。堆的基础操作可以用down和up两个操作来完成1.插入一个数。2.求集合当中的最小值。3.删除最小值4.删除任意一个元素。..
2022-02-16 21:12:36
1376
原创 数据结构:栈(stack)
只允许在一端进行插入或删除操作的线性表。首先,栈是一种线性表,但限定这种线性表只能在某一段进行插入和删除操作。简单来说就是像球筒中放羽毛球,只能在一端点拿出 球来,先进的球最后拿出来,后进的球先拿出来。栈顶(top)为可以进行插入删除操作的一端。定义栈:int stk[N],tt;插入 stk[++tt]=x;删除 t--;判断栈是否为空 if(tt>0) emptyelse not empty;单调栈 单调栈就是在栈先进后出性质的基础上
2022-02-12 12:02:39
513
原创 基础算法:离散化
什么是离散化?离散化通过映射关系,将分散的数据映射到相邻的数组元素中,降低时间复杂度。模板:vector<int>alls; //储存所有需要离散化的值sort(alls.begin(), alls.end()); //排序alls.erase(unique(alls.begin(), alls.end()), alls.end()); //去重int find(int x){ int l=0,r=alls.size()-1; while(l<r) {
2022-02-11 22:42:04
359
原创 基础算法:双指针算法
双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向( 快慢指针 )或者相反方向( 对撞指针 )的指针进行扫描,从而达到相应的目的。. 换言之,双指针法充分使用了数组有序这一特征,从而在某些情况下能够简化一些运算。参考(www.cnblogs.com/huansky/p/13508533.html)例题:给定一个长度为 n 的整数序列,请找出最长的不包含重复数字的连续子序列,输出它的长度。输入格式第一行包含整数 n。第二行包含 n 个整数(均在 0∼1.
2022-02-11 18:38:04
442
原创 基础算法:前缀和
一维前缀和一维前缀和包括一维数组a和一维前缀和数组s。s满足性质 s[x]=a[1]+a[2]+a[3]+.....+a[x]。作用:求一维数组内某一区间的和。例如:求a[2]到a[5]的和。因为s[5]为a[1]加到a[5],s[1]为a[1],所以s[5]-s[1]为a[2]加到a[5],所以求一维数组区间从L到R的和,即为s[R]-s[L-1]。求法:for(int i=1;i<=n;i++)s[i]=s[i-1]+a[i];二维前缀和二维前缀和s[i].
2022-02-11 16:11:59
224
原创 基础算法:二分
二分查找法是通过不断缩小范围来实现最优解的算法。二分将将某一区间的中间值的特性与查找的特性相对比,再通过对比结果将左端点或者右端点更新为中间值。例如:二分查找有序序列中的某一元素#include<bits/stdc++.h>using namespace std;int main(){ int n,m,a[10000],l,r,mid; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; cin>&g
2022-02-11 15:11:09
633
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人