![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
题解
文章平均质量分 59
LeBronGod
life is a fu ck ing movie
展开
-
Codeforces Round #698 (Div. 2)
A、Nezzar and Colorful Balls根据题意相同的标号的小球不可能标记为同一个颜色,只需要输出同一标号小球数量最多为多少就可以了#include<bits/stdc++.h>using namespace std;typedef pair<int,int> pii;typedef long long ll;const int maxn = 1e6+10;const int INF = 1e8;const int mod = 1e9+7;int a[原创 2021-01-29 14:50:08 · 225 阅读 · 0 评论 -
AcWing 176. 装满的油箱
题意:从起点到目的地,一路上有油价不同的加油站,选择最佳的加油方案,使加油钱最少。思路:就是两种可选择的方案如果说当前还没有装满油的话,那么我们可以选择加一升汽油,然后拓展到新的状态,也就是(city,fuel+1)对于每一条边而言,我们可以通过这条边到达一个城市,那么如果说当前剩余油量可以走完这条路,那么我们就拓展新状态(Next,fuel-w)这样我们不断地取出当前花费最少的状态进行拓展,然后每一次拓展用ans数组记录最小花费即可.AC代码:#include<bits/stdc+.原创 2020-10-13 21:57:45 · 166 阅读 · 0 评论 -
AcWing 175. 电路维修
题意:改变最少的电线方向使得左上角和右下角连接起来。思路:也是一个最小步数模型,首先把电路板上每一个格子点看作无向图中的节点,两个节点x和y是某个小方格的两个对角,那么如果说x和y的线段是“",那么我们可以认为边权为0,反之如果x和y线段是“/”,那么我们的边权视为1,说明要旋转一次才能够连上。现在得到了一张边权0或1的无向图,那么和普通广搜一样,我们唯一的改变就是,如果说当前新状态的边权为0,那么我们就放到队头先走,因为我们要满足两端性和单调性,而为了这个单调性,如果说当前新状态边权为1,那么我.原创 2020-10-13 20:46:34 · 244 阅读 · 0 评论 -
AcWing 170. 加成序列
题意:给定一个数字生成一个序列要使得序列中的元素满足递增且每个数都能用他前面的两个数(可以是一个数的两倍)相加得到。思路:第一个数和第二个数肯定是1和2,然后再根据层数和数要递增这些限制来进行dfs。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e6+10;int x[maxn];bool vis[maxn];int n; int dfs(int now,in.原创 2020-10-11 21:17:08 · 151 阅读 · 0 评论 -
AcWing 172. 立体推箱子
题意:箱子是一个长方体,有立着和躺着两种形态,给定图及各点含义,问从起点到终点的最小步数思路:图论最小步数,选择BFS进行求解,不同于常规的搜索的那四个方向,这次是一个长方体滚来滚去,有三种不同的状态,注意一点方向数组不要写错了。其他的详见代码#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e6+10;int n,m;char mp[550][550];const.原创 2020-10-11 20:59:33 · 208 阅读 · 0 评论 -
AcWing 171. 送礼物
题意:找到不超过w的最大和思路:首先这道题目肯定是要搜索的,因为如果说用DP做的话,那么这个W值太大了,但是如果说只是普通搜索的话,那么O(2^N)的复杂度足以超时,而且这道题目重点就是,我们已经知道了初态而且还知道了终态,既然如此的话,我们可以选择双向搜索.根据双向搜索的性质,我们大致可以确定当前搜索的范围,首先从前一半个物品中,挑选任意多个物品,然后将这些物品的权值总和加入到数组S中,然后我们就会发现在这个S数组中有很多很多的重复的数值,既然如此,我们不妨将他们统统都删掉,至于如何删掉,相信S.原创 2020-10-11 11:22:42 · 191 阅读 · 0 评论 -
AcWing 167. 木棒
题意:有一堆木棒他们是从几根等长木棍切出来的,现在知道这堆木棒分别的长度,问你重组成几根等长的木棍且要求该等长最短的长度。思路:这题一开始看的时候我还以为是二分长度不断取小,结果想半天不会。这题其实是一道搜索剪枝,涉及到的剪枝其实还挺巧妙的,首先我们可以对木棒根据长度先排个序从大的开始往后用,如果遍历到他的时候用不上,在组这根木棍也就用不上了,木棒之间除了长度是没有差别的,所以我们只需在意长度大小和数量多少即可,这一波分析完TMD不就是做个桶排序吗。让后我们从最大的木棒长度枚举到所有木棒长度之和,.原创 2020-10-08 15:11:20 · 174 阅读 · 1 评论 -
AcWing 166. 数独
题意:完成数独思路:看到题目,这肯定是搜索,但是试了一发普通的直接就超时了,肯定要加一些剪枝和优化,首先是位运算优化可以将每一行,每一列,每一个九宫格,都利用一个九位二进制数保存,当前还有哪些数字可以填写,再一个我们肯定是从限制性最高的那个点开始填的,其实每次都是填限制最多的那个数,涉及到一个lowbit函数:当前得需要用lowbit运算取出当前可以能填的数字.AC代码:#include<bits/stdc++.h>using namespace std;typedef lon.原创 2020-10-08 11:26:49 · 408 阅读 · 0 评论 -
ACwing164. 可达性统计
题意:求出每个点可以到达的点的个数思路:就是一个简单的图的暴力,为什么拿出来讲下,是因为看题解的时候看到个东西觉得挺不错的,bitset STL里的一个东西,我们在统计可到达点时可能会有很多,所以可以借助biset里面是以二进制存储的,f[i][j]的含义是指d点i和点j之间可不可以到达,通过f[i].count()就可以统计出他的可到达点的数量。AC代码:#include<bits/stdc++.h>using namespace std;typedef long long l.原创 2020-10-07 10:36:11 · 215 阅读 · 0 评论 -
ACWing 147.数据备份
题意:选取K对大楼,使得每对距离之和最小,并且一个大楼只会被链接一次思路:当k=1时肯定就是贪心的选取距离最小的那两栋。当k=2时我们是否还要留着距离最小的那一对呢?如果没有选择距离最小的那一对,那肯定要选择最小那一对的左右两对,否则就可以将其中一对换成最小的那对,那样会更小。当k>2时同理如果不选择中间的就必须选择其左右两边的,这样才能保证较小的那对我是因为实在拿不了的才放弃的,否则就可以更优。我们可以用一个双指针链表加一个set来完成这些工作,当删去中间这对时将其左右两对的权值重新加.原创 2020-10-06 21:51:33 · 328 阅读 · 1 评论 -
AcWing 145. 超市 146. 序列
题意:商品有保质期和价值,要在保质期内把商品卖出才有收入,每天只能卖一件,问产品的的最大利益是多少思路:这道题目,我们很容易发现是有一个贪心策略,也就是对于 t 天,我们需要在保证不卖出过期商品的前提下,卖出利润前t大的商品.所以呢,我们可以把商品按照保质时间排序,然后建立一个小根堆,对于每一个数而言,如果说它的过期时间大于当前小根堆的个数,那么我们可以直接将这个货物的价值加入进来,如果说当前过期时间正好等于这个小根堆堆内的个数,那么我们就需要对比一下,如果说这个货物的价值,是高于小根堆的堆顶的话,.原创 2020-10-06 16:24:37 · 134 阅读 · 0 评论 -
AcWing 144. 最长异或值路径
题意:找到两个点之间的路权值异或和最大。思路:将无根树扯成有根树,将根节点到每个叶子节点的路径异或权值处理出来存起来,然后我们可以遍历取max,因为从根节点到两个叶子节点的值异或起来会把中间重复路径的异或权值消去(异或的性质,相同异或为0),所以借助Trie树就可以了。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e6+10;int trie[maxn][2];i.原创 2020-10-05 21:44:08 · 111 阅读 · 0 评论 -
ACwing 142.前缀统计 143.最大异或对
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e6+10;int trie[maxn][26],tot = 1,End[maxn];void insert(char *str) { int len = strlen(str), p = 1; for(int i=0;i<len;i++) { int ch = str[i]-'a'; if(trie[p.原创 2020-10-04 21:52:22 · 1090 阅读 · 0 评论 -
回文子串的最大长度(二分+Hash)
题意:题面意思思路:上一道兔子兔子的题目,我们知道判断两个字符串是否相等,可以使用字符串哈希,也就是将字符串算成P进制数值,然后区间和判断即可,那么这道题目我们需要一个正的字符串,还需要一个反的字符串,然后如果正字符串等于反的字符串之所以要这么做,因为我们是要回文串所以我们需要将回文拆解成为一个正字符串和一个反字符串,这样才好处理这道题目.既然如此,我们可以算出一个前缀和,再算出一个后缀和,然后就可以知道,正字符串和一个反字符串.字符串的哈希值就是这个区间的哈希值和.算完之后,我们当前就只需要枚.原创 2020-09-30 23:50:43 · 459 阅读 · 0 评论 -
AcWing 137. 雪花雪花雪花 138. 兔子与兔子
雪花题意:根据雪花六个角的长度判断两朵雪花是否相同。思路:属于hash表内容,根据值域建立一个一样大小的数组进行映射查找,这是hash表的关键,比如本题就可以用长度的和与乘积作为hash的规则,用这个值来归类这些雪花,如果hash值相同,再将两片雪花做精细化比对顺序是否相同。AC代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<int,int> PII;..原创 2020-09-28 20:21:11 · 206 阅读 · 0 评论 -
131. 直方图中最大的矩形、135. 最大子序和
这两道题解法分别是单调栈和单调队列,其实感觉这两个算法没什么区别,都是借助单调性处理问题,在于及时排除不可能的选项,保持单调性,保证策略集合是最优解。单调栈:a[n+1] = p = 0;//初始化边界 for(int i=1;i<=n;i++) { if(a[i]>s[p]) {//满足单调性直接进栈,w数组是一个策略集合 s[++p] = a[i],w[p] = 1; } else {//不满足单调性则退栈直至满足单调性 int width = 0;//记录退栈的策略原创 2020-09-23 21:33:52 · 117 阅读 · 0 评论 -
133. 蚯蚓
题意:相当于维护一个集合,支持查询最大值、删除最大值、插入新的值。时间卡的贼紧!!!!!!!!!!我不记得我T了几次了都思路:根据输入输出以及n、m的数据范围可以知道,需要在每秒进行切割时找出当前最大值,这时发现枚举和堆、单调队列等查找/维护最大值的方法是超时的。这时就有三个队列q1、q2和q3,如果q1开始时单调递减,每次取出最大值,然后将这个蚯蚓分开,把其中大的一部分压入q2,小的一部分压入q3,显然,此时q1、q2和q3都是单调递减的(所以每次的取出操作就可以是:在q1、q2、q3的队首取出最.原创 2020-09-23 21:10:42 · 237 阅读 · 0 评论 -
114. 国王游戏
题意:除第一个人以外的每个人能获得的奖赏为他之前所有人的左手乘积除以自己右手上的值(注意是之前的所有人不包括自己),通过改变顺序使得获得最多奖赏最小化。思路:贪心策略:受到奶牛的杂技这题的影响,我们发现乘积越大的要往后放除的大的也要往后放,所以我们根据左手右手的乘积从小到大排序,然后以此计算取max即可,交了之后WA了,标准答案贼大已经超出ull范围,所以还得上个高精乘除单精(顺便复习一手)。AC代码:#include<bits/stdc++.h>using namespace s.原创 2020-09-19 17:33:07 · 641 阅读 · 0 评论 -
105.七夕祭
题意:有一个n*m的矩阵上面是n * m个摊位,给定T个cl感兴趣的摊位的坐标,问现在能否使每行或每列上cl感兴趣的摊位个数相等,可以交换相邻两个摊位的位置每行或每列的头和尾也属于相邻。思路:因为行列之间不能交换所以行列的判断是分开的,当总的感兴趣摊位数目不能均分到每一行或每一列时,则行的方案或列的方案不可行。单独看行和列的方案,如果可行那么每行上的感兴趣摊位数量等于总的感兴趣摊位数量/行数,是一个定值,那么我们可以遍历每一行如果当前行没有达到定值就去下一行拿(下一行可以被拿成负值,下一行可以去找再.原创 2020-09-17 16:00:14 · 151 阅读 · 0 评论 -
112. 雷达设备
题意:海岸上有雷达可以辐射以d为半径的半圆区域,海岸之外还有岛屿,要求用最少的雷达个数覆盖所有的岛屿。思路:一开始画图的时候,一直是画雷达的辐射范围去想怎么贪心使得覆盖面积最大,一直卡着,其实可以换个角度,从岛屿的角度考虑雷达的区域只要以岛屿为中心的圆与海岸线的相交线(下图ab)中有一个雷达即可,所以问题就转化为在所有这样的ab区域内都有一个点,总的点数目还要最少。贪心策略:将所有区间(ab)按右端点从小到大排序;依次考虑每个区间:如果当前区间包含最后一个选择的点,则直接跳过;如果当前区.原创 2020-09-16 20:34:50 · 230 阅读 · 0 评论 -
110. 防晒
题意:让尽可能多的奶牛涂上适合自己的防晒霜思路:将所有奶牛和防晒霜分别看成两个集合中的点,如果一头奶牛可以使用某个防晒霜,则在两个点之间连一条边,那么问题就变成二分图求最大匹配了;根据匈牙利算法的原理,如果一个匹配不存在增广路径,则该匹配是二分图的一个最大匹配。也就是使得最多的奶牛涂上了适合自己的防晒霜。贪心的策略是:将所有奶牛按照 minSPF 从大到小的顺序排序,然后依次考虑每头奶牛;对于每头奶牛,扫描当前所有能用的防晒霜,选择 SPF 值最大的防晒霜来用(这样能保证最后不存在增广路径,因为.原创 2020-09-16 15:34:45 · 313 阅读 · 0 评论 -
108. 奇数码问题
题意:类似我们小时候玩过的数字华容道,就是有一个缺的然后可以移动变成不同的样子,本题要你解决的是从状态一能否通过移动变到状态二。思路:一开始拿到题一看这不就八数码升级版吗,然后改了下八数码代码T了,其实结论做法很简单,但是如果没做过类似的题,可能想不到这里去,这道题需要用 奇偶性。奇偶性很神奇,对于一类问题,如果属于同种性质(奇偶性相同),那么它们就是完全相同(这个在某种意义上说)的。这道题在移动方块时会改变拉直(将所有的行都排在一行)(一些移动问题都可以弄成一维来看,环的话可以断成链来考虑)之后的.原创 2020-09-16 10:59:24 · 307 阅读 · 0 评论 -
106. 动态中位数
题意:依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数。思路:这道题出现在排序这个小标题下,一开始读完以为挺水的,但是分析复杂度发现每次都排个序取中间的复杂度(n2logn),并不可行,所以需要用到一个可以在线维护中位数的数据结构,就是堆啦,用大根堆和小根堆组成一个对顶堆,那么中位数就是两个堆种大的那个堆里的堆顶,当两个堆的数量不一致时将大的那个堆的堆顶弹出压至小的那个堆里遇到奇数就输出堆顶即可。这题注意输入和输出的格式,被卡了一发!AC代码:#inclu.原创 2020-09-14 21:39:46 · 370 阅读 · 0 评论 -
103. 电影
题意:给定n个人会的语言所属种类和m部电影的字幕和语音的语言所属的种类,听得懂语音会很开心,看得懂字母比较开心,问你看哪部电影很开心的人最多,相同时再让比较开心的人数最多?思路:每个人会的语言和所有电影具有的语言种类最多为2m+n(没有超出数组范围),所以我们可以将所有的语言种类排成从1到2m+n,就能用数组得出每种语言会的人数了,怎么将大范围的分布数据排成一个从1到n的紧凑排列,这不就是离散化吗!(其实后面看了别人题解用不重复map加二分查找就行了这个版本的代码也贴在后面了)。AC代码:#in.原创 2020-09-14 20:56:25 · 166 阅读 · 0 评论 -
F - Icebergs
题意:给定n个互不干涉的多边二维图形计算它们的面积之和。思路:关键在于求多边形的面积的方法,采用向量叉积的方法求面积,就是确定一点将他与剩下的顶点连接起来相当于分割成了若干个三角形,选取两边做叉积即可得出面积,向量带有方向计算出来之后记得取abs。这题可能还卡了精度。AC代码:#include<bits/stdc++.h>using namespace std;const int maxn =2e6+10;typedef long long ll;struct node {.原创 2020-09-12 12:40:42 · 184 阅读 · 0 评论 -
AcWing 95. 费解的开关
题意:给定一个5X5的灯阵,1表示灯亮着,0表示灯灭了,每次操作可以选择一盏灯并改变他的状态和他周围灯的状态(周围:上下左右)然后问你最少多少次能够使所有灯都变成亮着的状态,如果次数大于6则输出-1,否则输出最少的操作数。思路:我们可以从上往下不断的确定状态,使得除最后一行之外所有的灯变亮,最后再判断一下最后一行的灯是否都亮着,如果都亮着证明该方案可行,将答案取min更新。先来看第一行,总共有25种操作方案,所以我们全部枚举暴力不就行了吗(雾 。继续判断后面的行如果有熄灭的那么就改下一行的来达到目标.原创 2020-09-12 12:14:16 · 128 阅读 · 0 评论 -
最短Hamilton路径
题意:从0点开始走到n-1点,每个点经过且只经过一次,任意两点之间都有权值,最终的权值为所走路线权值之和,求最小的最终权值。思路:哈密顿回路的模板题,乍一看还以为最短路 ,用到了位运算和贪心,f [i][j](i是一个二进制数,表示这n个点的状态:1代表走过;0代表没走过)表示i状态下走到 j 的最小权值,那么我们要求的最终答案就是f[(1<<n)-1][n-1],每次更新时将当前的f[i][j]值与上一个状态加上到 j 的权值取min即可。位运算小课堂:(n>>k)&.原创 2020-09-10 15:52:22 · 1972 阅读 · 0 评论 -
2020暑期牛客多校第一场A:B-Suffix Array
题意:将字符串s的每个后缀化成B数组,然后对B数组进行字典序排序。题解:对于特定的后缀字符串ttt,其化成B数组的值时,第一个a的值为0,第一个b的值为0,在第一个a和第一个b之间的值为1。如t=“abbbabbba”t=“abbbabbba”t=“abbbabbba”,则B(t)=011102114B(t)=011102114B(t)=011102114,前半段为011100111001110。这样,每个后缀子串就都有一个TTT,B(T)=ADB(T)=ADB(T)=AD其中A=01…10A=01…转载 2020-07-12 21:06:29 · 948 阅读 · 0 评论 -
Codeforces Round #629 (Div. 3)题解
题意给你两个数a,b,你可以使a增大,求增大多少能使a整除bAC代码#include<iostream>#include<algorithm>using namespace std;int main(){ int t; cin>>t; while(t--) { int a,b; cin>>a>...原创 2020-03-28 11:19:26 · 1098 阅读 · 0 评论 -
E. Count The Blocks
题意给出一个n,求10n内(每个数有前导零)长度为1到n的块分别有多少个(从0开始数的)。块的含义是连续相同数字的长度。思路从 一 开始枚举,用a数组记录小于等于给定n的每种长度的块的长度,不难发现每种给定n的长度为n的块的个数都是一样的n=1同时长度为1的块:0,1,2,3,4,5,6,7,8,9(10个)n=2同时长度为2的块:00,11,22,33,44,55,66,77,88,...原创 2020-03-24 13:24:21 · 874 阅读 · 0 评论 -
Codeforces 1312C Adding Powers
题意能不能通过往初始值全为零的v数组中的每一位做操作使得他变成输入的a数组,操作有两种①加上K的i次方(i可以从0开始,i不能有重复)②什么都不做(就是说指定的a数组里面的0项不用管)思路将a数组中的所有非0项转成K进制,用一个数组存一下每一种 i 的系数的数量,因为同一个i不能用多次所以当这个值大于1时就输出no拿样例手动模拟一下3 90 59049 8100= 0*9^0+0*...原创 2020-03-10 22:38:09 · 197 阅读 · 0 评论 -
Codeforces Round #626 (Div. 2) B. Count Subrectangles
题意两个数组相乘后得n*m的矩形,求矩形中子矩形(仅包含1)面积为k的有多少个。思路面积算出来要是K的话那就有几种可能的矩形,这些可能的矩形的长和宽就是K的因子,再有一个我多画了几个后发现一旦有一个0他所在的那一行或者那一列就会都是0也就把n*m这个大的矩形分割了,因为只有0和1 ,所以在a数组中一段连续的1乘了b数组里的一位之后就会变成某一个分割开的子矩形的边(Ci,j=ai*bj),所...原创 2020-03-09 17:59:05 · 146 阅读 · 0 评论 -
Heavy Transportation
题目N个点,M条边,每条边有权值。求一条1号点到N号点的路径,要求使得路径中的边权最小值最大。Input多组输入,第一行给一个T。输入每一组第一行给两个数n和m。(1 <= n <= 1000)接下来m行,每行三个数u,v,w代表路径的两个端点与边权。(1 <= u,v <= n , 0< w <= 1e6)保证两点间只有一条边,该图为无向图。...原创 2020-03-01 19:08:51 · 360 阅读 · 0 评论 -
PTA7-8 哈利·波特的考试
描述哈利·波特要考试了,他需要你的帮助。这门课学的是用魔咒将一种动物变成另一种动物的本事。例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等。反方向变化的魔咒就是简单地将原来的魔咒倒过来念,例如ahah可以将老鼠变成猫。另外,如果想把猫变成鱼,可以通过念一个直接魔咒lalala,也可以将猫变老鼠、老鼠变鱼的魔咒连起来念:hahahehe。现在哈利·波特的手里有一本教材,里面列出...原创 2020-02-29 18:13:28 · 425 阅读 · 0 评论 -
PTA7-51 两个有序链表序列的合并
描述已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。输入格式:输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。输出格式:在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。输入样例:1 3 5 -12 4 6 8 10 -1输...原创 2020-02-29 17:37:18 · 350 阅读 · 0 评论 -
PTA7-9 旅游规划
描述有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。输入格式:输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N−1);M是高速公路的条数;S是出发地的城市...原创 2020-02-28 19:46:42 · 313 阅读 · 0 评论 -
PTA6-2 顺序表操作集
本题要求实现顺序表的操作集。函数接口定义:List MakeEmpty(); Position Find( List L, ElementType X );bool Insert( List L, ElementType X, Position P );bool Delete( List L, Position P );其中List结构定义如下:typedef int Positi...原创 2020-02-28 19:37:45 · 532 阅读 · 0 评论