Acwing寒假每日一题2022
分享关于ACwing寒假每日一题2022的题解
MangataTS
一个爱折腾的Coder
展开
-
AcWing 1738. 蹄球(特殊基环树)
题目链接https://www.acwing.com/problem/content/description/1740/思路经过分析我们发现,对于每一个点来说,我们有至多两个入度以及必定有一个出度,那么这个图最终一定会构成一个基环图,而且是特殊的基环图,对于这个特殊的基环图,我们细分下来其实只有两种,一种是仅由两个点构成的环,并且没有其他入度,那么对于这个环图,我们只需要给其中的一个牛牛踢球就好了,如果是环上还由其他的入度,说明这个环挂了一个树,那么对于这样一个树,我们至少需要这棵树的所有叶子节点的元原创 2022-02-23 11:43:09 · 624 阅读 · 0 评论 -
AcWing 1750. 救生员(差分+暴力枚举)
题目链接https://www.acwing.com/problem/content/1752/思路因为N的范围很小,我们先将所有的救生衣的时间区间用差分统计,然后枚举一下每一个救生衣可能被开除的情况,然后找到被开除的可能中最长的时间区间即可代码#include<bits/stdc++.h>using namespace std;const int N = 1e2+10;pair<int,int> a[N];int n,d[N*10];int slove(in原创 2022-02-22 15:44:17 · 477 阅读 · 0 评论 -
AcWing 1762. 牛的洗牌(暴力)
题目链接https://www.acwing.com/problem/content/1764/思路因为我们要做三次它的排序,那么我们初始状态的话每个位置上的编号就是本身,然后我们定义一个b数组表示的是最后排出的结果,那么每次我们更新b数组的值的时候需要用到我们上一个状态的值,所以我们定义一个c数组存储b数组上一个状态的值即可,最后我们按照我们b数组顺序将字符串映射到对应的地方即可,详情请看代码代码#include<bits/stdc++.h>using namespace std;原创 2022-02-22 14:56:44 · 222 阅读 · 0 评论 -
AcWing 1776. 牛的基因组学(STL+枚举)
题目链接https://www.acwing.com/problem/content/1778/思路我们只需要枚举每一列的基因然后判断一下普通牛的基因里面是否有斑点牛基因即可,如果有的话说明不能以当前这一列作为基因判断,否则的话说明可以,我们可以用map存储一下当前这一列斑点牛的基因元素即可,然后再与下面的正常牛的每一个基因做一个比较代码#include<bits/stdc++.h>using namespace std;const int N = 1e2+10;int n,m原创 2022-02-22 14:21:53 · 154 阅读 · 0 评论 -
AcWing 1801. 蹄子剪刀布(思维+暴力)
题目连接https://www.acwing.com/problem/content/1803/思路开始我们不难想到一个比较暴力的想法就是我们枚举1、2、31、2、31、2、3的所有状态也就是都可能当石头or剪刀or布那么大概要六次循环,也能接受,但是我们想一下这个游戏无非就是赢了、输了和平局,对于平局的情况无论如何变化都不会改变,那么我们的赢和输其实就构成了互补的关系,所以无论我们怎么去选择每一个数字对于什么关系,我们在赢的次数和输的次数中选一个maxmaxmax就好了代码#include<原创 2022-02-22 12:53:36 · 2900 阅读 · 0 评论 -
AcWing 1813. 方块游戏(暴力枚举)
题面链接https://www.acwing.com/problem/content/1815/思路每次读入两个字符串的时候我们只需要将其中每个字母较多的一方计算入ans中即可,因为不会发生同时翻牌的情况代码#include<bits/stdc++.h>using namespace std;int n;map<char,int> a,b,ans;string l,r;int main(){ cin>>n; while(n--){原创 2022-02-22 12:20:46 · 2709 阅读 · 0 评论 -
AcWing 1826. 农田缩减(思维+枚举)
题面链接https://www.acwing.com/problem/content/description/1828/思路因为只用去处一只奶牛,所以这只奶牛肯定尽可能远离大部分牛群,所以我们很容易想到去除四个角然后计算剩下的牛群能围成的面积是多少就好了,所以我们定义四个数组,然后不同的方式排序就好了代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define原创 2022-02-06 20:55:00 · 298 阅读 · 0 评论 -
AcWing 1843. 圆形牛棚(暴力+枚举)
题目链接https://www.acwing.com/problem/content/description/1845/思路因为n的范围很小(只有100),我们枚举每个点作为奶牛的进场点即可,然后因为只能走到下一个牛棚,所以我们只需要循环一次就好啦,单次查找复杂度O(N)O(N)O(N),总复杂度O(N2)O(N^2)O(N2)代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------原创 2022-02-06 20:54:10 · 225 阅读 · 0 评论 -
AcWing 1855. 愤怒的奶牛(枚举+暴力)
题目链接https://www.acwing.com/problem/content/1857/思路直接模拟每个点都是爆炸点,然后向左向右模拟即可,详情请看代码代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#define mod 1000000007#define endl "\n"#define PII pair原创 2022-02-06 20:53:33 · 455 阅读 · 0 评论 -
AcWing 1875. 贝茜的报复(数学+暴力枚举)
题目连接https://www.acwing.com/problem/content/1877/思路我们顺着不太好计算,所以我们反着计算,计算出所有满足条件的奇数个数,然后相乘就好了,复杂度为O(N4)O(N^4)O(N4),代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#define int long long#d原创 2022-02-06 20:52:48 · 189 阅读 · 0 评论 -
AcWing 1884. COW(前缀和)
题目连接https://www.acwing.com/problem/content/1886/思路对于一个COW单词,因为不要求连续,所以我们只需要对C求一个前缀和,W求一个后缀和,然后循环一边,遇到的是一个O的时候我们就将O的前缀和乘上W的后缀和就是我们当前O能组成的所有单词数量代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long原创 2022-02-06 20:51:44 · 219 阅读 · 0 评论 -
AcWing 1904. 奶牛慢跑(单调栈)
题目连接https://www.acwing.com/problem/content/1906/思路如果一个牛比前面的牛跑的还慢那么就可以把这两个牛合并,如果相同的话就不要合并了,所以我们最后构造的就是一个速度非严格单调递增的序列#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#define mod 1000000009#d原创 2022-02-06 20:50:58 · 198 阅读 · 0 评论 -
AcWing 1913. 公平摄影(前缀和+STL)
题目连接https://www.acwing.com/problem/content/1915/思路对于这个牛牛的位置和不同牛牛我们可以用一个pair存储,然后我们实际上要求的答案是连续同种牛牛的最长距离连续荷斯坦牛的最长距离连续根西岛牛的最长距离连续两种牛牛但是两种牛牛的数量都是相同的因为位置是乱序的,所以我们先把牛牛按照位置信息排个序那么对于第一种情况,我们直接O(N)扫过去即可,对于第二种情况,我们先对当前得序列求一个前缀和,我们假定H牛牛是正数、G牛牛是负数,那么我们在循原创 2022-02-06 20:49:32 · 267 阅读 · 0 评论 -
AcWing 1922. 懒惰的牛(前缀和 or 双指针)
思路因为数据范围很小,所以我们可以直接用前缀和的方法做,当然也可以用尺举法,后面补上前缀和因为x的数据范围就是1e6,那么我们直接把对应地点的值加上去就好了#include<bits/stdc++.h>using namespace std;#define ll long long#define mod 1000000009#define endl "\n"#define PII pair<int,int>int dx[4]={0,-1,0,1},dy[4]={原创 2022-02-06 20:47:37 · 194 阅读 · 0 评论 -
AcWing 1929. 镜子田地(DFS)
题面连接https://www.acwing.com/problem/content/description/1931/思路因为光路可逆,那么对于每一个点的方向就是固定的,也就是入射角和反射角,那么对于每一个点的走向我们都是可以提前预知的,所以我们直接对每个外圈点进行DFS搜索即可,只不过需要注意一点我们要有一个变量d来表示朝向,因为光在不同的方向入射,那么其出射方向也不同,我们这里用0表示向上、1表示向右、2表示向下、3表示向左,那么我们会发现,如果下一个点是 '/'的话入射方向是0那么出射方向原创 2022-02-06 20:46:25 · 186 阅读 · 0 评论 -
AcWing 1934. 贝茜放慢脚步(二路归并)
题目链接https://www.acwing.com/problem/content/description/1936/思路题目的标签是二路归并,其实就是贪心,可以对比我们之前学习归并算法那里,我们现在有两个参照轴,时间轴和坐标轴,我们现在就是需要将这两个轴上发生的事件(减速)有序合并起来,我们可以计算当前哪个事件先发生,先发生的就先执行,也就是归并排序的归操作,将左右区间有序合并,所以我们先对T和D排序,然后逐步选择最先发生的事件归并即可代码#include<bits/stdc++.h&g原创 2022-02-05 23:51:23 · 438 阅读 · 0 评论 -
AcWing 1945. 奶牛棒球(枚举+二分)
题目链接https://www.acwing.com/problem/content/1947/思路因为第三头牛和第二头牛的间距是在[2Y-X,3Y-2x]以内的,所以我们可以对第三头牛进行二分搜索,然后将得到的左右区间长度的贡献加在ans上面,详情请看代码代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#define原创 2022-01-26 23:41:03 · 262 阅读 · 0 评论 -
AcWing 1952. 金发姑娘和 N 头牛(离散化+差分)
题目链接https://www.acwing.com/problem/content/description/1954/思路因为对于每一个牛牛来说都有三个不同的舒适度区间,那么我们最终要求的一个最佳总舒适度点也可以看作一个区间,然后将三部分区间在map上面维护一个离散化的差分数组最后求一个前缀和的最大值即可,这里对于最左边的区间和最右边的区间我们可以定义一个INF=0x3f3f3f3f来表示维护代码#include<bits/stdc++.h>using namespace std;原创 2022-01-26 23:39:44 · 193 阅读 · 0 评论 -
AcWing 1960. 闪烁(状态压缩+枚举)
题目链接https://www.acwing.com/problem/content/1962/思路这题如果用一个数组的话是会炸空间的,所以我们采用状态压缩,因为每个灯的状态只有0和1,那么我们直接定义一个状态表示的是当前的状态,然后由于这个长度是16,所以我们最多能有2162^{16}216种开关灯的状态,我们直接用一个int即可,然后我们发现关于灯的开关状态其实就是那当前这一位和前面一位(环形)做一个异或操作,由于数据一定会出现循环,所以一旦我们发现了循环的地方就直接取模然后继续往后走余下的步数即原创 2022-01-26 23:38:06 · 133 阅读 · 0 评论 -
AcWing 1969. 品种邻近(滑动窗口+枚举)
题目链接https://www.acwing.com/problem/content/1971/思路我们从id较大的点往id较小的点进行遍历操作,然后找出一个满足条件的id就直接输出然后return 0,否则循环完后直接输出-1代码#include<bits/stdc++.h>using namespace std;#define ll long long#define mod 1000000009#define endl "\n"#define PII pair<in原创 2022-01-26 23:36:44 · 154 阅读 · 0 评论 -
AcWing 1978. 奶牛过马路(前缀和)
题目链接https://www.acwing.com/problem/content/1980/思路我们将这个二元组进行排序后就可以得到一个a升序序列,然后将问题转化为判断当前位置的奶牛是否合法,如果合法的话,那么当前奶牛的前面所有奶牛的b点应该都小于当前这个奶牛的b,后面所有奶牛的b都应该大于当前奶牛的b,再进一步转化为前缀最大值和后缀最小值问题即可轻松解决代码#include<bits/stdc++.h>using namespace std;#define ll long l原创 2022-01-26 23:31:38 · 243 阅读 · 0 评论 -
AcWing 1987. 粉刷栅栏(离散化+差分)
题目链接https://www.acwing.com/problem/content/1989/思路通过map进行差分处理,每次处理到前缀和从大于1变到小于等于1的时候就进行一次区间长度统计,每次从前缀和小于等于1变到大于1的时候就更新左区间的位置代码#include<bits/stdc++.h>using namespace std;#define ll long long#define mod 1000000009#define endl "\n"#define PII原创 2022-01-26 23:30:16 · 317 阅读 · 0 评论 -
AcWing 1996. 打乱字母(贪心+二分)
题目链接https://www.acwing.com/problem/content/1998/思路我们开四个string数组,然后前两个分别存储的是升序字符串序列和降序字符串序列,然后第三四个同理,然后对前两个进行sort排序,排完序后我们根据之前的c、d数组对a、b数组进行二分搜索,当然可以直接使用lowerbound或者upperbound,当然也可以自己手写,我这里直接用的STL,详情请看代码代码#include<bits/stdc++.h>using namespace s原创 2022-01-26 23:28:33 · 232 阅读 · 0 评论 -
AcWing 2005. 马蹄铁(DFS)
题目链接https://www.acwing.com/problem/content/2007/思路由于这个题目数据范围很小,所以我们可以进行暴力搜索,从左上角1,1点开始回溯搜索,注意的是,由于要形成题目中括号的格式,所以我们能发现左括号能走到左括号或者右括号,而右括号只能走到右括号代码#include<bits/stdc++.h>using namespace std;#define ll long long#define mod 1000000009ll ksm(ll a原创 2022-01-26 23:26:43 · 195 阅读 · 0 评论 -
AcWing 2014. 岛(离散化+差分)
题目链接https://www.acwing.com/problem/content/2016/思路离散化后利用差分的性质,也就是相邻岛之间的高度差,详情请看代码注释代码#include<bits/stdc++.h>using namespace std;#define ll long long#define endl "\n"#define PII pair<int,int>#define mod 1000000009ll ksm(ll a,ll b) {原创 2022-01-26 23:24:57 · 304 阅读 · 0 评论 -
AcWing 2019. 拖拉机(双端BFS)
题目链接https://www.acwing.com/problem/content/2021/思路一个有0代价和1代价边权的最短路,我们用双端队列将0和1边权用一个双端队列分开存储,然后进行一个类迪杰斯特拉的最短路即可,值得注意的是,这个二维平面是无限大的,但是我们只需要多使用一层(这一圈都是空的)就好了,因为效果都一样,详情请看代码代码#include <bits/stdc++.h>using namespace std;const int N = 1e3+10;bool原创 2022-01-26 23:23:06 · 244 阅读 · 0 评论 -
AcWing 2060. 奶牛选美(DFS)
题目链接https://www.acwing.com/problem/content/2062/思路先DFS染色,将这两部分分开,分别用1和2标记,然后对于第一堆的每个元素直接用BFS跑一个最短路即可代码#include<bits/stdc++.h>using namespace std;#define endl "\n"const int N = 100;char mp[N][N];int a[N][N];int n,m;int dx[4]={-1,1,0,0};原创 2022-01-25 20:48:09 · 354 阅读 · 0 评论 -
AcWing 2041. 干草堆(差分)
题目链接https://www.acwing.com/problem/content/2043/思路因为我们前面有k个区间修改操作,最后求出中位数,由于是静态的,所以我们直接使用差分维护就好啦,然后最后求一个前缀和恢复一下修改后的每个位置的值即可代码#include<bits/stdc++.h>using namespace std;const int N = 1e6+10;int a[N];int n;int k,A,B;int main(){ cin>原创 2022-01-25 20:46:46 · 270 阅读 · 0 评论 -
AcWing 2058. 笨拙的手指(暴力枚举)
题目链接https://www.acwing.com/problem/content/2060/思路因为二进制和三进制有一位是错误的,那么我们直接二重循环枚举每一位,看更改后是否满足相等,如果是的话那么这就是答案,否则继续枚举代码#include<bits/stdc++.h>using namespace std;#define ll long long#define endl "\n"ll ans;bool fg(string a,string b) { int原创 2022-01-25 20:43:37 · 261 阅读 · 0 评论