![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
题解
qq_34026804
这个作者很懒,什么都没留下…
展开
-
金发姑娘和 N 头牛
解题思路:这头牛在数轴赏每上每个区域的贡献度不同,需要将每头牛的在数轴上不同区间的贡献度用差分数组记录下来,寻找最大的一块区域即可。题目链接 for (int i = 0; i < n; i ++ ) { int l, r; scanf("%d%d", &l, &r); b[-INF] += x; b[l] += y - x; b[r + 1] += z - y; b[I...原创 2022-01-21 00:03:14 · 234 阅读 · 0 评论 -
穿过圆(bitset)
题目链接穿过园题目大意平面上又许多不相交的园包围着点,每回询问两个点 a ,b 询问从a到b至少穿过多少个圆。思路最开始想到暴力的解法,也就是对每个点进行遍历,看其是否在园内,并将此点在多少个园内的数量记录在一个数组cnt中,然后记录a和b在相同园内的数量(假设记作k),拿cnt[a]+cnt[b]-2*k即为答案,这样做的时间复杂度过大无法通过题目要求。听课后学会了一种压位的做法,即用bitset存储这个点对于各个园的状态,在园内为0,在园外为1,然后将两个点的二进制位数亦或,此时二进制...原创 2021-12-27 00:26:23 · 123 阅读 · 0 评论 -
Codeforces Round #714 (Div. 2) B. AND Sequences (思维)
题目题目大意:给定一个数据,求其全排列中满足 以下条件的数量。大致思路:如果想要等式左边等于右边,即二进制的每一位相等,那么必须找到一个数,即&上其他数对整个数不会产生影响,将这两个数放到等式两边,即可一定满足等式两边相等,那么怎么求这个数呢? cin>>a[0]; ll k=a[0]; //将k&上数组中所有的数,找到那个不会影响等式两边的数 for(int i=1;i<n;i++) { scanf("%lld",&a[i..原创 2021-04-12 20:05:41 · 154 阅读 · 0 评论 -
cf B. Box Fitting(贪心+优先队列) 题解
B. Box Fitting大致思路:开一个优先队列,开始将w入队,因为方块高度全为1,故只看其长度即可,将其从大到小排队,优先队列里存每一行的剩余容量,如果a[i]大于与队顶(放不下),则开辟新一行,及将(w-a[i])入队,否则将(q.top()-a[i])入队,最后队列长度即为答案。#include<iostream>#include<algorithm>#include<queue>using namespace std;const int原创 2021-03-30 20:01:07 · 612 阅读 · 1 评论 -
导弹拦截题解(dp+Dilworth定理)
导弹拦截本题的第一问为最长不上升子序列,重点在于第二问。第二问可分为两种做法1.贪心做法用如下方式维护数组g,数组长度cnt,意为cnt个不下降子序列。保存的是每一个不上升子序列中的最后一个数:遍历原序列,对于遍历到的每一个数x:1.若x大于g中每一个数,则新建一个不上升子序列,放入x;2.否则,找到g中大于等于x的最小的数,将其替换。由于g每次增加长度时,增加的数必然大于其前面g中的任何一个数;且每次替换时,不改变x与被替换数左右相邻两数的相对大小关系,故g必然维持单调递增。则g即为原..原创 2021-03-09 14:44:44 · 164 阅读 · 0 评论 -
食物链题解(并查集)
食物链首先可知 A 吃 B,B 吃 C,C 吃 A。故知道A和B,B和C的关系,便可推出A和C的关系。主要思想维护一个集合,若两动物已经在集合中,便可判断其关系是否正确,若不在集合中,便可加入集合。那么怎么判断当前加入的动物是A,B,C中的哪类动物呢?可以用一个距离数组记录(假设为d),那么d[i]为动物i到根节点的距离,将其%3即d[i]%3即可判断他是哪类动物(假设1吃0,2吃1,0吃2)并且不断维护这个数组即可。那么并查集find的模板代码为int find(int x) //p[..原创 2021-03-09 11:12:55 · 251 阅读 · 0 评论 -
方格取数题解(线性dp)
方格取数题目分析本题目是考察了dp中的数字三角形模型,只不过从一维上升到了二维。其中f[ i1 , j1 , i2 , j2 ] : 由数字三角形可以推广出从(1,1),(1,1)(1,1),(1,1)走到(i1,j1),(i2,j2)(i1,j1),(i2,j2)能获得的最大花生数目.主要思想把 f[i1][j1][i2][j2]f[i1][j1][i2][j2] 转化为 f[k][i1][i2]。其中k=i1+j1=i2+j2k=i1+j1=i2+j2: 两个小朋友同时走, 每..原创 2021-03-02 21:45:09 · 130 阅读 · 0 评论 -
八数码题解(bfs)
八数码分析本题是求最少交换次数,故先想到bfs,而本题的难点在于状态和步数的存储。以及状态的转移。如何记录下x和一个数交换后的状态?如何记录步数?主要思想一个巧妙的思想可以解决此类问题,状态可以用string类型来记录,求在3*3矩阵中的横纵坐标无非就是将其在string类型中的位序(假设为k)x=k/3,y=k%3。而查询起来也异常放边 直接用find函数即可找到(string类型作为stl的优势),而它的交换次数可用哈希来存储 即可定义unordered<string,int>..原创 2021-02-25 18:03:04 · 107 阅读 · 0 评论 -
(线性dp)最长公共子序列 最短编辑问题 题解
最长上升子序列状态表示:f[i,j]表示为所有在第一个序列前i个字母中出现,第二个序列前j个字母中出现的子序列的最长长度。状态计算:将此问题分解成两半考虑如果两个字符相等,就可以直接转移到f[i-1][j-1],不相等的话,两个字符一定有一个可以抛弃,可以对f[i-1][j],f[i][j-1]两种状态取max来转移。代码#include <iostream>using namespace std;const int N = 1010;int n, m;char a[N]原创 2021-02-17 20:18:42 · 84 阅读 · 0 评论 -
C. Sum of Cubes(打表)题解
题目链接题目大意:给出一个数x判断是否有存在a,b使得a3+b3=x。思路:因为x的范围1<=x<=1012,故可判断出i是从1到10000循环,且时间限制在2s内,故可用打表的方法判断是否存在a,b。#include<iostream>#include<algorithm>#include<map>using namespace std;typedef long long ll;map<ll,int> m;int mai.原创 2021-02-22 20:45:54 · 203 阅读 · 0 评论