随笔分类 -  ACM / 思维

摘要:原题链接 考察:思维 思路: 比较明显的是要用单调队列,在一段区间内,可以挑选一些数字变化符号.我们求的最大和只有两方式:尽量将负数变正数,尽量将正数变负数. 在枚举一段$len$区间,求最小的$k$个负数的绝对值和,然后剩下的数相加.每移动一位,和要做相应变化.所以需要记录左端点属于绝对值还是普通 阅读全文
posted @ 2021-09-16 23:53 acmloser 阅读(42) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:思维 思路: 每一个.代表了一个$boss$下属关系的声明结束.对于每一个$.$对比最后一个字符串和前面所有储存的字符串,如果相同$ans++$ ##Code #include <iostream> #include <cstring> #include <string> using 阅读全文
posted @ 2021-09-16 01:05 acmloser 阅读(32) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:思维(?) 思路: 我的做法略笨.先以第一行第一列为起点看最多能占几个.然后再枚举以第一行的点为起点的最多跳跃数.同理枚举第一列的点为起点的最多跳跃数.需要记录最大的行列能取到哪,因为枚举到$(1+s,1+s)$的位置. ##Code #include <iostream> #inc 阅读全文
posted @ 2021-09-13 13:27 acmloser 阅读(24) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:思维 思路: 属于同一数列的点与基准点位置无关.比如 \(2\quad3\quad5\quad3\) 第$1,2,4$个数同一数列,所以不论哪个为基准点,其余点都不用修改.可以发现这些数-位置$i$的差相同(\(i<=mid\)).因此求出最多不用修改的点,就是答案. ##Code 阅读全文
posted @ 2021-09-12 09:44 acmloser 阅读(31) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:dfs,思维 思路: 实际答案最大是2.因为如果存在拐角的正方形,那么可以去掉包围它的两个正方形.如果不存在,答案就是1.假设当前正方形数$<3$,那么答案就是$-1$. ##Code #include <iostream> #include <cstring> #include < 阅读全文
posted @ 2021-09-11 22:23 acmloser 阅读(29) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:拓扑排序,思维 思路: 2-->1的时间等同于1-->2 >3的时间,也就是说往回走与正向走耗时相同.说明我们可以按1-->2-->3 >1的顺序走即可.枚举起点,再用拓扑排序算时间 ##Code #include <iostream> #include <cstring> #inc 阅读全文
posted @ 2021-09-01 02:13 acmloser 阅读(54) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:栈,模拟 模拟栈匹配,不匹配的留入栈里.然后栈里都是不匹配的坐标,相邻之间都是匹配的. #include <iostream> #include <cstring> using namespace std; const int N = 100010; char s[N],res[N] 阅读全文
posted @ 2021-08-30 22:23 acmloser 阅读(27) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:思维 错误思路: 暴力模拟,但是步骤没有统一的规矩. 思路: 递归思想.因为需要将每个棋子放在主对角线以下.那么首先保证最后一列无$1$,那么再交换有$1$的行和最后一行,这样怎么也不会换到对角线上.然后可以发现最后一行,最后一列可以去掉,再重复上面的步骤 ##Code #inclu 阅读全文
posted @ 2021-08-27 02:17 acmloser 阅读(39) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:贪心+思维 思路: 首先明确抹去字符不能改变$s1$在$s2$的位置.也就是不存在$"你中有我,我中有你"$的情况.所以如果$s2[i]$在$s1[i]$出现位置比$s2[i+1]$晚,那么$ans++$. 两层$for$循环明显需要优化,所以预处理$s1$的情况.$f[i][j]$ 阅读全文
posted @ 2021-08-24 11:01 acmloser 阅读(48) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:思维 思路: 假设时间$c$后,以$1$为开始的细菌$>=t$.此后$n-c$就是以$t$为起始到达$z$的时间.但是如果$>t$就需要将$ans+1$ #include <iostream> #include <cstring> using namespace std; typed 阅读全文
posted @ 2021-08-09 10:09 acmloser 阅读(25) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:st表+贪心 or 枚举+剪枝 ###思路一: 枚举+剪枝.枚举左端点,在枚举$>i$的每一个$j$.求两个值,以$i$为起点的和,与以$i+1$为起点的或和.如果两个值是一样的说明没必要$a[i]$没必要在此区间存在. #include <iostream> #include <c 阅读全文
posted @ 2021-08-09 00:52 acmloser 阅读(25) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:思维+数论 思路: 如果存在,则所有选中点间距相等边的长度*边的条数 = \(n\).也就是边的长度是$n$的倍数.时间复杂度是$O(\sqrt(n)*n )$ ##Code #include <iostream> #include <cstring> using namespace 阅读全文
posted @ 2021-07-29 14:41 acmloser 阅读(33) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:思维+计算几何 思路: 预处理所有点的度数,存在一个最小角的包含所有的点,那么必然存在最大的相邻点之间的角度没有包含所有的点. 反三角函数的返回值是弧度,详情看此篇GO ##Code #include <iostream> #include <cstring> #include <c 阅读全文
posted @ 2021-07-29 10:06 acmloser 阅读(29) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:组合数学+思维 思路: 如果只考虑一行的和是比较容易想到的:假设该行对应的$s$为$x$,如果$a%x==0$,那么求出$sum = \frac$的个数即可.如果有多行,就统计多行的和$x$.我们直接统计和的个数即可. 特判$!a$的情况,此时只要一个因子为0,其他任意值. ##Co 阅读全文
posted @ 2021-07-27 09:47 acmloser 阅读(47) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:枚举,思维 思路: 不论怎么取,都存在一个间隔点:左边的都是左手拿的,右边的都是右手拿的,枚举间断点,可以发现根据取的个数不同,由于贪心是尽可能间隔取,然后再计算连续的附加值. ##Code #include <iostream> #include <cstring> using n 阅读全文
posted @ 2021-07-26 09:51 acmloser 阅读(31) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:思维 思路: 设和为$sum$,每次减少$n-1$,最多进行$\frac{sum+n-2}$次.但是存在$a[i]$彼此相差悬殊的情况.此时答案为$max(a[i])$. ##Code #include <iostream> #include <cstring> using name 阅读全文
posted @ 2021-07-24 00:10 acmloser 阅读(39) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:思维 or 搜索 错误思路: 二分模拟,精度爆炸 正确思路一: 搜索....我是fw 正确思路二: 双指针设置$l = 1,r = n$,如果$s[i]==l$,说明右边不会在有人,$s[i]==r$左边不会在有人. ##Code #include <iostream> #inclu 阅读全文
posted @ 2021-07-23 09:44 acmloser 阅读(28) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:思维 思路: 类似RMQ的思想,对于每个点求往左,往右不减最远能到达处.求是否和会大于区间长度. ##Code #include <iostream> #include <cstring> using namespace std; const int N = 100010; int 阅读全文
posted @ 2021-07-22 11:59 acmloser 阅读(35) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:思维 思路: 制造$n$个$d$位互不相同的数字,$dfs$即可 ##Code #include <iostream> #include <cstring> #include <vector> using namespace std; typedef long long LL; co 阅读全文
posted @ 2021-07-21 08:34 acmloser 阅读(41) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:思维 看题目:woc好复杂 看大佬题解:我果然zz 思路: 如果要想的话需要分解到每一位考虑,第i位有几种可能,然后累乘.可以发现第i位的可能数就是第i位字母种数. ##Code #include <iostream> #include <cstring> using namespa 阅读全文
posted @ 2021-07-18 19:41 acmloser 阅读(28) 评论(0) 推荐(0) 编辑