02 2022 档案
摘要:单调队列优化dp + 二分答案 #include<bits/stdc++.h> using namespace std; #define N 500005 #define inf 0x3f3f3f3f #define LL long long int n,d,k; int x[N],v[N]; in
阅读全文
摘要:题面大意:有n个问题,每个问题有一个品质ai,一开始的心情值为q,每当看完一个问题时,心情值将会加上这道问题的品质。问题只能按顺序看。有m个询问,求当q=bi时,至少要删去多少个问题才能使得在任何时候心情值都>=0。 这道题由于m的范围很大,对于询问我们不可能每次都重做一遍,但是n的范围只有750,
阅读全文
摘要:经典线段树,区间修改,区间查询,比较麻烦 #include<bits/stdc++.h> using namespace std; #define N 1000005 void read(int &x){ int f=1;x=0;char s=getchar(); while(s<'0'||s>'9
阅读全文
摘要:难度较高的一道题(当时第一遍做没啥思路),转换比较难想 拓扑+最短路 CODE #include<bits/stdc++.h> using namespace std; #define N 10005 int n,m,k[2505]; int tot,head[N],ver[N],Next[N];
阅读全文
摘要:在一维哈希的基础上用二维前缀和思想 #include<bits/stdc++.h> using namespace std; typedef unsigned int ull; int base1=133,base2=107; ull val[1000055],pi[1005],pj[1005],
阅读全文
摘要:当年比赛不会STL 手写堆确实麻烦 #include<bits/stdc++.h> using namespace std; #define N 100005 int n , k ; int a[N]; int maxn[205]; int heap[N] , len ; int ans [N] ;
阅读全文
摘要:题意: 这个农场一共有被用 M条双向道路连接的 N个谷仓,题目会先输入M条双向的边,再输入这N个谷仓的关闭顺序,判断N次关闭后是否是连通图。 做法: 这题用并查集和链表两个数据结构,链表用来存各个点的边,并查集是用来判断所有点是不是连通的。如果一开始就存好了整个图,边删除边边判断是否连通的话比较难,
阅读全文
摘要:题意 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数)。棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。 乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型的卡片,见样例),每种类型的卡片上分别标有1,2,3,4四个数字之一,表
阅读全文
摘要:题意 给出一个长度不超过 200的由小写英文字母组成的字母串(该字串以每行 20 个字母的方式输入,且保证每行一定为 2 个)。要求将此字母串分成 k 份,且每份中包含的单词个数加起来总数最大。 每份中包含的单词可以部分重叠。当选用一个单词之后,其第一个字母不能再用。例如字符串 this 中可包含
阅读全文
摘要:题意 给出一个边长为n的正方形矩阵,农民约翰需要统计那些可以放牧奶牛的正方形牧场(至少是2x2的,在这些较大的正方形中没有一个点是被破坏的,也就是说,所有的点都是“1”)。 你的工作要在被供应的数据组里面统计所有不同的正方形放牧区域(>=2x2)的个数。当然,放牧区域可能是重叠。 做法 这道题用动态
阅读全文
摘要:题意 给出长为n的序列,有两个人,轮流拿最左边或最右边的,且两个人的拿法的是最优的,写一个程序,判断第一个人和第二个人分别能拿到的的最大值。 做法 这道题的内存足够大,我们可以用动态规划,数组f [ i ] [ j ]表示从i到j这一段序列先手的比后手的多拿多少分。因为只能拿最右边的和最左边的,所以
阅读全文
摘要:题意 给出长为n的序列,有两个人,轮流拿最左边或最右边的,且两个人的拿法的是最优的,写一个程序,判断第一个人能拿到的的最大值。 做法 动态规划,表示从i开始拿长度为L的序列的先手比后手多的分值因为内存的关系,所以我们要用滚动数轴,因为递推的值只与前一个值有关。拿法只有两种,所以只要max求最大值即可
阅读全文
摘要:五年OI一场空,不开LongLong见祖宗 题意 你的任务是输出第i(1<=i<=长度为N的二进制数的个数)小的(注:题目这里表述不清,实际是,从最小的往大的数,数到第i个符合条件的,这个意思),长度为N,且1的位数的个数小于等于L的那个二进制数。 做法 数论加动态规划,f [ i ] [ j ]
阅读全文
摘要:题意 有N头牛,P个牧场,C个道路,给出牛在的牧场和牧场之间的道路,求出所有牛到同一个牧场(最优解)的最短路。 做法 因为这道题牧场很多,但边的数量较少,所以我们可以用SPFA做这道题,用一个循环队列,用链表存牧场之间的道路,然后模拟从所有牧场出发的所有情况,求最短路即可。 代码 #include<
阅读全文
摘要:题意 一块初始的2*4的模板,有三种变动方式,给定目标状态,求出最少要多少步变成目标状态,并输出变动方式。 做法 第一眼看这题的时候,心里就想:这不就是BFS吗,居然有提高+的水准(最多普及-),但这个内存是真心恶心,如果开八维存下每种数量的话肯定MLE,所以我们可以用一个24位的二进制存下一种方案
阅读全文
摘要:题意 就是有三种饲料,让你输入在每种饲料中大麦,燕麦和小麦各自的比,求出如何混合才能成为给出的完美饲料。 做法 为了方便诉说,我们先将完美饲料的比记作n1:n2:n3,其实也就是求在用最少的饲料的情况下n1t:n2t:n3*t=n1:n2;n3是存在的,我们可以把混合的饲料是原先饲料的t倍,前提是除
阅读全文
摘要:题意 有五个轮子,每个轮子都是360度(0~359),到了360度就会变成0度,每个轮子上都有 W个洞(1 <= W <= 5),判断在什么时候,五个轮子上的洞会有1度重合,光能后透过 做法 模拟加上暴力枚举轻松过,只要判断在一个点上什么时候有洞会重合即可 代码 #include<bits/stdc
阅读全文
摘要:题意 丑数的定义:对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S。这个正整数集合包括,p1、p1p2、p1p1、p1p2p3...(还有其它)。该集合被称为S集合的“丑数集合”。注意:我们认为1不是一个丑数。 我们要做的就是给
阅读全文
摘要:题意 也就是字面上的意思,求出N!阶乘的最右边的非零位的值。 做法 用模拟加数论的方法,因为想要在末尾出现一个0,那么就一定会是10的倍数,而10=2*5,所以只要看1~N中出现5的次数即可,因为2的倍数的数量一定是比5的倍数的数量多的。然后在循换中每次mod10求个位数,因为任何正整数相乘的个位数
阅读全文
摘要:Prim算法 题意 在n个农场间铺设光纤(也就是边),使所有的点形成一个连通图,求出所有边的值(最小花费) 做法 贪心模拟,从任意一个点出发,寻找边最短的一条,sum(初始值为0)加上边的值,在将这两个点看做一个整体,寻找他们周围边最短的一个点(注意:要用一个数组记录点是否处于这个整体中),直到找到
阅读全文
摘要:题意 题目就是最短路的模型,求的是离‘Z’牧场最近的有牛的牧场的字母标号(就是牧场的名字)以及这座牧场到‘Z’距离 做法 要换位思考,将起始点设为‘Z’,一个个向外更新,可以将所有字母用一个自己写的ID函数将其化为序号,再读入距离时因为有多条路线,而我们要用的只有最短的那条,要min取最小的存入数组
阅读全文
摘要:特坑题 题意 给你一个字符串(会有换行),求出在长度A~B的01字符串出现最多的N种(出现次数一样多的算一种),输出它的次数以及分别是哪些字符串,出现次数为第一关键字,字符串的长度为第二关键字,字符串的大小(也就是二进制化为整数的大小)为第三关键字。 做法 第一眼看时觉得挺水,感觉只有普及+左右的难
阅读全文
摘要:题意 判断从1开始的能凑出的连续的邮票价值(1~n),会给出两个数K和N,K是可用的邮票总数。N是邮票面值的数量。接下去的N行是每种邮票的价值 注意:每种邮票是可以多次使用 做法 完全背包模型,用一维即可,如果用二维会内存超限,记录的是凑足i的价值至少要多少邮票,如果大于K,输出i-1,跳出循换,如
阅读全文
摘要:题意 也就是普通的背包模型,难点主要在于动态规划的状态和方法以及内存的限制 做法 用二维数组存 i(前i种题)和 j(时间)的最大分数,再用滚动数轴存数组(因为递推下一个数组用到的只是它的前一个),最后for一遍取最大值即可 代码 #include<bits/stdc++.h> using name
阅读全文
摘要:题意 这道题意较难理解:john有多个农场,每个农场有多个农区,给出农区的位置以及农区之间是否有路线(就是邻接表),求出用最好的方法连接后(可以理解为合并后的一个农场),求出这个农场直径(相距最远的两个农区的最短路) 做法 我的做法是先将农场给划分开来,因为连接后的的直径有三种可能,先将第一个农场记
阅读全文
摘要:题意:将分数化小数,也就是分子除以分母的值,难点在于循环节的判断以及竖式的模拟,送上题解 #include<bits/stdc++.h> using namespace std; int a,d; int ok=1; int p[1010000]; int k[1010000]; int main(
阅读全文