![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
技巧
陈末iiiiiiiiiiii
Retired
展开
-
Educational Codeforces Round 32 G. Xor-MST 启发式合并字典树、Boruvka求最小生成树 + 最小异或字典树、分治
来与完整的作差,因为完整的肯定包含所有情况(有点可持续化的最终版本减之前的版本的感觉),利用差值判断其他连通块是否含有这个点。而字典树本身是能和连通块一样进行合并的,每颗字典树就相当于点,利用并查集找出他归属的树根节点,并查集本身又能记录每个连通块的。这里利用之前可持续化的一种思想,我们可以另外建一个完整的字典树(既有全部元素)。这样我们每次需要求出这个连通块和除了他本身处在的连通块中的元素能异或到的最小值,以及下标,并且把他们合并了。要求求出利用数组构成的生成树的最小的权值和。官方题解中给出了利用。...原创 2022-08-17 16:33:44 · 543 阅读 · 1 评论 -
2019银川区域赛 K题 Largest Common Submatrix 子矩阵(单调栈,悬线法两种解法)
给你两个矩阵矩阵内的数字为N*M的排列。找出两矩阵的子矩阵能相等的最大大小。N,M原创 2022-07-03 17:47:01 · 279 阅读 · 2 评论 -
AcWing 4481. 方格探索 双端队列bfs 最短路
如果我们能表达出到达每个点最小的向左数以及向右数,那么这个题目就很容易写出来了。试探看看有没有性质(也就是向右数和向左数有没有关系)我们先假设最小向右数为tp,最小向左数为tp2。当我们走到的格子纵坐标为 j , 起点纵坐标为 sy 。向右可走xx,向左可走yy 。可以推出此时的向左数为 tp3 = tp - ( j - sy ) 。根据单调性可得tp2==tp3.所以我们只需求出到达每个点的向右走的最小值即可。由于是01费用的路径。直接使用双端队列bfs,有费用放队尾,无费用放队头。很巧原创 2022-06-27 09:24:46 · 114 阅读 · 0 评论 -
AcWing 4487. 最长连续子序列 单调栈上二分 数组模拟栈的好处
首先讲公式化简为sum[r] - 100r > sum[l] - 100lsum为前缀和。这一步是很容易想到的,这样就只有一个变量了。然后就是怎么通过枚举一个i来确定前面的数小于自己且最远的数是什么。想了很久没想出来,y总这里使用了单调栈上二分来处理,之前没有见到过这种操作。先使用一个降序的单调栈来保证单调栈上的每个数都是最远的(手模理解)。如果这个数比栈顶还小,那肯定取不到答案,我们将它入栈。(如果一个数能取到答案,我们肯定不入队,因为在它前面肯定有更小的数)如果比栈顶大,说明存在答案。原创 2022-06-26 17:45:34 · 293 阅读 · 0 评论 -
Codeforces Round #697 (Div. 3) G 线性dp 调和级数 数论
题目Polycarp 在街上发现了一个包含 n 个元素的数组。Polycarp 发明了他的阵列美感标准。如果每对不同的索引 i≠j 必须满足以下条件中的至少一个,他就称数组为美数组:ai 可被 aj 整除;或 aj 可被 ai 整除。例如,如果:n=5 and a=[7,9,3,14,63],则a数组不美观(对于i=4 and j=2,以上条件都不满足);n=3 且 a=[2,14,42],则 a 数组很漂亮;n=4 且 a=[45,9,3,18],则 a 数组不美观(对于 i=1 和 j=原创 2022-05-05 17:25:11 · 812 阅读 · 0 评论 -
AtCoder Beginner Contest 247 E 双指针维护固定最大最小值区间的数量 状压DP
题目给你一个大小为n的数组A,以及一个X和Y。要求求出满足最大值为X且最小值为Y的区间数量。数据范围题解思路很久没写双指针题了,有点不太行,所以一直没自己补出来,一开始看的dls的状压dpdp[i][0/1][0/1] 定义为以i为右端点的连续区间中 有或者没有最小值Y有或者没有最大值X的数量。再通过此时的a[i]值来更新到这个点的数量。每次取dp[i][1][1]即可。梦中把这题用双指针补了。结果思路真是对的,官方题解也讲了双指针,可惜我看不懂英文。所以才只能自己推。我们只需维原创 2022-04-14 14:05:42 · 674 阅读 · 0 评论 -
Educational Codeforces Round 126 (Rated for Div. 2) D 线段树维护差分数组
题目给你一个数组A,每次可以指定一个大小为K区间L,R。使得从L到R的每个数分别减1,2,3,4,5…k。问至少需要多少次才能让数组的全部数变成非正数。题解思路参考pzr佬参考ygg佬可以直接贪心的正向考虑,从a1开始这个数肯定要变成非正数,所以我们直接使用a1次将它改变,每次只减1所以得k次。但是k个区间里的数都要减去对应的数,我们可以都减去1来求前缀(因为上面那个很明显是个公差为1的等差)。我们还得消除这个前缀给之后的点带来的影响,所以得在R+1加上K来抵消影响。要使用区间加减法可以用原创 2022-04-11 17:12:53 · 890 阅读 · 0 评论 -
AtCoder Beginner Contest 245 E 贪心 multiset 二分
题目你有n个巧克力和m个盒子,巧克力和盒子都是矩形,所以每个巧克力有对应的长宽,盒子也是同理。一个盒子只能装一个巧克力。问所有巧克力是否都能被装下。题解思路贪心策略。每个巧克力肯定是在大于等于自身长度的盒子中选择一个盒子。选择的盒子的宽度肯定要是大于等于自身宽度的最小的一个。不妨先满足一个条件,我们将盒子与巧克力一起按长度排序。逆向处理,从宽度最大的往前遍历,如果是盒子加入能选择的集合中,如果是巧克力,就二分出情况来。利用multiset就能处理二分宽度以及每个盒子选择完的删除还有重复情原创 2022-03-30 19:21:30 · 1023 阅读 · 0 评论 -
AtCoder Beginner Contest 244 F 多源BFS 状态压缩 位运算 动态规划
题目给你N个点M条无向边的图,每个路径可以被定义为一个序列,AAi,表示路径经过这个点的奇偶性只有1 (奇)0(偶) ,特别的经过0次时属于偶。要求求出序列A的每种情况(即一共2的N次方种情况)的最短路径大小的总和。N <= 17题解思路因为数据范围小,考虑状态压缩,当这个状态的点经过一条边变成另一种状态的时候,就是将两种状态进行异或处理。这样我们只将所有起点状态放入队列中跑bfs,即多源bfs,就能处理除其他状态的最短路径大小。每个状态又必须又对应的边来转移,所以我们的dis数组需原创 2022-03-22 16:30:11 · 927 阅读 · 0 评论 -
Codeforces Round #623 (Div. 2) D 优先队列 并查集 数据结构 思维
题目VK 新闻推荐系统每天为每个用户选择 n 个不相交类别之一的有趣出版物。每个出版物都属于一个类别。对于每个类别,我批处理算法选择 ai 出版物。最新的 A/B 测试表明,如果每个类别在每日推荐中的出版物数量不同,则用户阅读推荐出版物的积极性更高。目标算法可以在 ti 秒内找到第 i 个类别的单个有趣出版物。将出版物添加到批处理算法执行结果所需的最短总时间是多少,因此所有类别都有不同的出版物数量?您无法删除批处理算法推荐的出版物。输入输入的第一行由单个整数 n 组成——新闻类别的数量(1≤n≤2原创 2022-03-16 19:09:47 · 1641 阅读 · 0 评论 -
第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京)F 三分 几何分布求期望
题目传送门题解思路之前只听说过三分,这是第一次写三分的题目,没想到是在区域赛真题上。根据期望公式二阶导推断出是凹函数,三分求凹点。铜牌题就几十行。公式以及三分算法参考这个博客AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,int>#define ll long longusing namespace std;原创 2022-03-13 15:16:44 · 241 阅读 · 0 评论 -
Codeforces Round #769 (Div. 2) D 区间gcd st表 二分 贪心
题目长度从1到n的每个区间都需要求最小的操作数。题解思路首先区间gcd(l,r)定住一边的话是具有单调性的。定住l增大r,因为出来的gcd肯定是不增的,也就是降序。其次,利用st表,可以O1得出某段区间的gcd。之前的st表题目为什么可以用呢?因为只要我们的gcd能正确包括整个范围,不论有些地方重复覆盖了,也一样可以得出正确的gcd。这和最最大值是一个道理。因为答案固定了1到n的区间,所以我们定住右端点r。往有可能的地方进行二分搜索出有可能等于区间大小的部分。如果等于区间大小那么我们可原创 2022-02-24 20:34:56 · 115 阅读 · 0 评论 -
340. 通信线路 二分枚举答案 最小化最大值 最短路里套二分
题目题解思路性质如果存在答案,那么答案必然是某条1到n的路径中边的第k+1大值。且这条路径的第k+1大值最小,(大于答案的边只有k条,即最小)。二分答案维护每条路径中最小的大于答案的边的数量。(满足上述性质的最小)当答案大时,此时大于答案边的数量小于k,因为它不是第k+1大值了。反之大于。另外这题因为取01最短路,可以利用双端队列O(n+m)来手动维护单调性。AC代码#include <bits/stdc++.h>//#include <unordered_ma原创 2022-02-23 20:59:55 · 132 阅读 · 0 评论 -
Codeforces Round #766 (Div. 2) D 数论 调和级数 log
题目你有一个数组 a1,a2,…,an 由 n 个不同的整数组成。 您可以对其执行以下操作:从数组 ai 和 aj (i≠j) 中选择两个元素,使得数组中不存在 gcd(ai,aj),并将 gcd(ai,aj) 添加到数组的末尾。 这里 gcd(x,y) 表示整数 x 和 y 的最大公约数 (GCD)。注意每次操作后数组都会发生变化,后续的操作都是在新数组上进行的。您可以对数组执行操作的最大次数是多少?输入第一行由一个整数 n (2≤n≤106) 组成。第二行由 n 个整数 a1,a2,…,a原创 2022-02-22 20:29:00 · 115 阅读 · 0 评论 -
牛客xb月赛43 F 寻找多源起点和图中其他点奇偶性相同 的 点 思维 BFS
题目题解思路根据题目意思,我们貌似就是要找到一个点,让多个起点对于这个点的最短路长度奇偶性完全相同。很容易想到,这个点到了之后可以在终点反复横跳,这样不会改变奇偶性。但是如何只有这个条件的话,这题还是很难做出来。更暴力的转化取一个点作为起点,跑bfs,让它确定到每个点具有的所有奇偶性即可。这种bfs属实巧妙,之前没有接触过。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queu原创 2022-01-21 16:28:36 · 246 阅读 · 0 评论 -
AcWing 1952. 对map 的 差分 + 离散化 利用map 超级暴力
题目题解思路一开始枚举温度 排序二分去了,仔细思考发现并不能保证另一边的情况。所以不能二分。N只有20万个。我们可以直接差分,即对每个温度区间的情况都差分。然后就能直接枚举出答案。这里能直接利用map来离散化。超级暴力。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,int>#define ll long lon原创 2022-01-20 20:24:42 · 876 阅读 · 0 评论 -
Codeforces Round #605 (Div. 3) D 最长连续上升子序列 变式 预处理前缀后缀 枚举
题目给你一个长度为N的数组A,要求只能删除1个或者0个元素,使得原数组的最长连续上升子序列最长。n < 1e5题解思路读了假题,一开始以为是最长上升子序列的模板题,结果是连续的,想太多了。处理这样删除问题的经典处理方法,预处理出两边不变的部分(前缀后缀),再枚举要删除的数,求最值即可。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair&l原创 2021-12-29 16:27:56 · 427 阅读 · 1 评论 -
4202. 穿过圆 bitset 位运算去重 STL
题目时限0.3s题解思路因为我们可以走任意路径到达,所以只需要穿过,包含这个点但是不包含另一个点的圆。可以预处理出每个点被几个圆包含了。这样然后进行对两个预处理的值去重操作即可。想set去了卡了好久。没想到是bitset来异或去重。属实巧妙。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,int>#define原创 2021-12-27 17:25:06 · 241 阅读 · 0 评论 -
4198. 最长合法括号子串 括号匹配 栈 DP
题目题解思路y总提供了一种画图来方便理解的方法。( + 1) - 1两个相同高度的点直接如果没有比他们更小的点,那么这段区间就是合法的。为了方便计算,我们可以将两个点之间的合法括号消除掉,即出栈。当合法匹配后,我们可以更新答案,此时栈顶的元素,就是与这个点相同高度的点。作差就是此时合法括号的长度。dp写法 类似与最长上升子序列 ,这里不多说了。AC代码#include <bits/stdc++.h>//#include <unordered_map>/原创 2021-12-22 12:13:02 · 470 阅读 · 0 评论 -
Educational Codeforces Round 119 (Rated for Div. 2) E 逆向思维 链表 数据结构
题目给你一个正整数数组a一开始是空的有q次操作1 x代表将x放入数组末尾2 x y代表将当前数组中的x全部替换为yq < 5e5x , y < 5e5问q次操作后,输出数组。题解思路两种解法一种是用5e5个链表来处理,维护好连接的数,已经断开连接即可。最后通过遍历链表元素获取原数组。时间复杂度也是O(n)。贴了代码这里主要讲第二种我们逆向 从后往前 处理数据。我们只需维护当前这个数要变成什么数,因为前面的操作只会影响前面的数,我们后面的数是不被影响的。原创 2021-12-21 21:40:27 · 344 阅读 · 0 评论 -
Educational Codeforces Round 119 (Rated for Div. 2) C 组合数学 构造字符串 字典序 爆longlong小技巧
题目给你一个长度为 n 只含a和*的字符串。其中 * 可以变成 0 到 k 长度的只含 b 的字符串 。在原字符串可以改变的所有情况中求出字典序第x小的字符串。n < 2000k < 2000x < 1e18题解思路肯定是从后面的星来往前加b来维持字典序最小。我们考虑每两个a之间的*能在字典序的多少位。并且字典序还受到之前的数的影响。可以在首位末位加入a来更好的控制b的数量。即下面这个图的规律。我们使用这个乘法法则构造出每两个a之间位置满位的最大字典序。原创 2021-12-21 19:25:16 · 63 阅读 · 0 评论 -
第四届“传智杯”全国大学生IT技能大赛(初赛B组) D 位运算 贪心
题目题解思路贪心 策略将每个素数的首个二进制1累加,这样x的每个1都有可能异或出那个素数。为什么呢,首个二进制1保证了这个素数一定小于等于x。由于这一位另一个数的这个位置肯定是0,并且在这个位置之前的1一定相同,另一个数只能通过调整之后的位数来让异或出来的数等于素数,但是素数首位还是0,所以异或出来的数肯定也小与x。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#de原创 2021-12-20 20:21:38 · 288 阅读 · 0 评论 -
AtCoder Beginner Contest 232 E 线性DP 组合数学
题目有一个H*M的棋盘,起初小车在x1 , y1 ,小车要到达x2 , y2 。小车每次操作只能到达棋盘中同行或者同列的某个位置。要求计算小车从起点到达终点,并且恰好使用K次操作的方法数。答案对998244353取余。题解思路这种问题可以先想想将行列分开考虑。我们可以根据最后一个不同点来划分,即小车到没到达目标的行或列。以横坐标为例即dp[ i ] [ 0 ] 表示小车走了 i 步 走完后不在 目标的列 ,1 表示在目标的列 的所有合法方案 。根据这个条件 , 很容易得原创 2021-12-20 17:33:45 · 456 阅读 · 2 评论 -
AtCoder Beginner Contest 231 F 离散化 树状数组
题目有N个种礼物,你必须选择两个礼物(可以是相同的种类)分别送给两个人。A和B都对礼物每个礼物有期望值ai bi。他们都不希望对方的礼物的期望值大于送到自己的礼物(期望值是相对自己而言)。问在N平方种方法中有几种分配方法能让满足他们的要求。题解思路正向反向考虑应该都行。我这里用的是正向考虑。我们将礼物的期望值带编号排序,这样我们往前遍历的过程中,之前的点就可以满足一个人的要求了,这样问题就变成了,前N个物品,找出有几个大于等于bi的。可以想到利用树状数组的存编号来继续快速前缀和判断(类似求原创 2021-12-12 19:05:28 · 292 阅读 · 0 评论 -
AtCoder Beginner Contest 231 E 贪心 DFS 记忆化搜索
题目有N种货币,每种对应ai元,a1一定等于1,且ai-1一定是ai的倍数。求出完成一笔X元的交易所需的最小货币数。即支付钱加找钱所需的货币数加起来最小。题解思路贪心策略用这个付完,即不找零。要么用这个多付钱(前提是本来有多,否则就是白费的搜索)然后求最小的找零数。在这两种情况中取min因为a是从1开始的,所以必然能取到数。这题复杂度一言难尽,居然能这么暴力。AC代码#include <bits/stdc++.h>//#include <unordered_map原创 2021-12-12 16:34:06 · 353 阅读 · 0 评论 -
4195. 线段覆盖 差分 离散化 遍历map
题目题解思路直接差分即可。我的做法被卡常了,这里利用map的自己排序的特性,节省时间。最后遍历map出答案。这题其实是简单题,但是我写的很复杂,甚至蠢到用哈希表去了,明明会大概率哈希错误(大于1e8)。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int ,int>#define ll long longusing n原创 2021-12-12 15:25:35 · 381 阅读 · 0 评论 -
Codeforces Round #758 (Div.1 + Div. 2) 思维建图 DFS
题目有N个人有两种能量 ai bi 。比赛被定义为随机挑选两个人随机选择一种能量,这种能量大的人获胜。问N个人中ai是否有机会获胜如果有输出1否则为0题解思路将每种能量排序,建出能量小到能量大的有向边。这个人有可能获胜必然是某种能量大于了一种能量为最大的人或者间接大于(某种能量大于了 大于一种能量最大的人 的人 )了这个人。我们建出图后,从能量最大的终点往回跑。能到达的点就是可以获胜的点。AC代码#include <bits/stdc++.h>//#include <原创 2021-12-12 13:15:16 · 387 阅读 · 0 评论 -
牛客xb月赛34 D 贪心优先队列 思维 经典技巧
题目题解思路这样贪心使得我们每次只查询了有可能成为新的值的情况。属实巧妙。如何将这个两个数组的方法延展成N个数组的。我们先处理出a数组的初始情况,再将a数组逐一和之后的每一个数组使用这个方法,将记录出的前N大的数再次更新进a数组,之后可能N大的值必然从这N个情况中改变。参考这个题解AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<i原创 2021-12-10 14:12:43 · 537 阅读 · 0 评论 -
1069. 凸多边形的划分 区间DP + 高精度 贴个高精模板方便以后用
题目题解思路参考这个图形,即我们可以通过两个边来确定图形的形状。dp的题解真的很难写 ,可能时我的理解还不到位,看大佬的题解吧。参考彩签大佬的题解这题样例就爆longlong了。所以得高精或者int128主要是为了贴个高精模板AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,int>#define LL long原创 2021-12-09 11:54:36 · 164 阅读 · 0 评论 -
Educational Codeforces Round 41 (Rated for Div. 2) D 计算几何 判断共线 逆向思维
题目二维坐标面上给你N个点,试判断,能否用2条线把N个点都连上。题解思路从结果逆向出发,如果1 和2 且 1 和 3 不共线那么 2 3 必然共线。如果不满足则不可能用2条线连上。思维拉满。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,int>#define ll long longusing names原创 2021-12-07 15:41:16 · 399 阅读 · 0 评论 -
牛客xb月赛41 E 双条件限制的BFS迷宫问题 标记处理小细节
题目题解思路到达这点的时候,能更新这个点的条件不一定是之前就到达或者没到达。被卡了好久。血多的时候同样需要更新这个点,否则就不满足最优了。所以这个标记应该填上之前到达这个点的血量值,在血量高的情况下,这个点才更有潜力到达终点。找了挺久的终于de出来了。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,int>#def原创 2021-12-07 09:55:18 · 179 阅读 · 0 评论 -
AtCoder Beginner Contest 230 E 整除分块的结论
题目题解思路由之前的结论只有2根号n个数我们只有让算出每个答案数的左边右边相乘出答案即可。 for (long long i = 1 ; i <= n ;) { long long v = n / i ; //求左边i带来的数 long long r = n / v ; //求右边的数 r = min(r,n) ; //防止越界。 cout << r << " " <<原创 2021-12-06 14:34:19 · 218 阅读 · 0 评论 -
AtCoder Beginner Contest 228 D 并查集 并查集的抽象维护点之间的关系
题目题解思路参考大佬的博客如果不想重复+1寻找-1的操作,就必然让这个数能在log级别查询出下一个-1的位置。可以想到用并查集来记忆化维护这个情况,我们用并查集实现出节点之间指向最近的-1。当这个-1被写入时,我们将它和下个节点合并。当不是-1时,我们让它的根节点写入值,并将根节点和根节点下一个点合并。这样使得每个点不会被重复访问。这里被取模WA了,注意下就行了。AC代码#include <bits/stdc++.h>//#include <unordered_ma原创 2021-12-01 18:51:40 · 906 阅读 · 0 评论 -
2021牛客寒假算法基础集训营4 E 折半枚举 dfs 字符串hash优化空间 字符串哈希的巧妙运用
题目题解思路子字符串只有40个,如果我们枚举每次枚举20个,再用枚举后的结果进行匹配,时间复杂度显然是够的,用STL内置的哈希表哈希string再匹配,交了一发mle了。只能用自己的写的哈希来优化了。利用字符串哈希,我们可以O(1)的获取某个连续子串的哈希值,在用A中的小字符串来拼接大串的部分,通过前一半和后一半的组合来得出答案。这里用dfs显然更优,我们判断可行性后再进入分支,如果用2进制枚举的化需要知道每个小字符串组合的哈希值,这东西也很大的。2^40我们用dfs判断进入了某段长度后,再试探原创 2021-12-01 10:01:07 · 123 阅读 · 0 评论 -
2021牛客寒假算法基础集训营4 D 二分枚举答案 双指针维护区间
题目题解思路因为亲密度是第一键值,所以所有亲密关系,可以根据亲密度的情况来分类,并且每个亲密度下的关系有序(编号从小到大)。即存在一个亲密度,它的亲密关系 + 之前更小的亲密度的关系 刚好 大于等于 K。这里就有点分界点的意思了,所以我们尝试二分亲密度,看看能不能在On级别处理出这个亲密度以及一下的所有关系总数。枚举出P为此时的亲密度。这里双指针也太顶了,我们可以先处理出两个指针之间大小为P的区间的数的情况,即用哈希表统计每个数的情况。再用一个cnt来记录这个区间内和首指针不同的数的个数。首原创 2021-11-30 20:14:28 · 391 阅读 · 0 评论 -
2021牛客寒假算法基础集训营4 F 并查集 贪心 思维建边
题目题解思路贪心能拿提升能力大就必须拿,先不考虑给谁。当相同关系的武器但提升能力少的时候,肯定是拿大的。思维建图将武器的分配看成一种关系,即 将两个人连接的桥梁(单人的时候自环即可)。利用并查集让两个人组成一个连通块。即装备可以在这两个人之间选择。当有新装备加入的时候,将连通块扩大,即N-1个装备,肯定在这N个人中选择N-1个人拿装备。有1个人将拿不到装备。当并查集出的两个人已经在同一个连通块中时,即N个人都有装备了,在连通图中表现为自环连通块。当有其他连通块与自环的连通的时候,其他连通原创 2021-11-30 17:08:09 · 504 阅读 · 0 评论 -
Codeforces Round #756 (Div. 3) e1 + e2 通过前序后序遍历 处理 树的多源最短路
题目W要邀请他的K个朋友去他家玩捉迷藏,他家里有N个房间标号为1…N。房间之间有N-1条通道,保证所有房间都是可以直接或者间接互通的。一开始W在1号房间。所有人,每个时间T都可以移动一个房间,也可以不移动。当W走到只有一条通道的房间并且不是1号房间的时候,W赢,如果朋友能在他走到那个房间时间碰到他,朋友获胜。双方都有最优的方案。e1问W是否能获胜e2问朋友在保证W失败的前提下至少需要动多少个人。否则输出-1。题解思路只有一条通道并且不是根节点的房间就是叶子节点。最粗暴的思路就是处原创 2021-11-30 11:48:28 · 491 阅读 · 0 评论 -
Codeforces Round #756 div3 D 有根树的权值分配 贪心 模拟
题目给你N个节点的父节点Ai,当父节点和自己相同的时候就是根节点。再你一个权值数组,要求节点到根的路的所有边加起来的权值dist,按权值数组的要求的大小关系存在。当 P = 3,1,2,5,4 时 ,要求3节点最小,1节点第二小…以此类推。要你提供一种合法的权值分配方案。即给每个节点到父节点的边赋值。没有合法方案输出-1.题解思路树的题写的太少了,也挺怕这种题的。一开始就想什么dfs。结果可以暴力的,我们按顺序给节点从小到大赋值即可。儿子节点的值肯定比父节点大。所以他的顺序也必须在父节点后原创 2021-11-29 21:53:01 · 277 阅读 · 0 评论 -
Deltix Round, Autumn 2021 ( Div. 1 + Div. 2) C 双指针 模拟 余数块问题
题目给你一个长度为N的数组A给你 一个 数 K 。让你确定有几个 ( i , e ) 组合 使得这个K连续的乘积为一个素数。题解思路第二次碰到这种问题,其实按乘积连续,其实就是用他对K的模数继续分块。这样能保证每个点只进一次。先筛出素数。要组成素数,肯定是前面一堆1加一个素数加后面一堆1。这里堆也可能是0个。所以对每个素数,我们处理出他前面有几个1,后面有几个1。然后进行组合就行。利用双指针来处理。记得开longlong,因为,这里是有相乘的运算,所以很可能会爆。AC代码#in原创 2021-11-29 15:22:08 · 202 阅读 · 0 评论 -
Codeforces Round #756 (Div. 3) F 类滑动窗口的双指针 模拟 尺取法
题目有N个人在AMT机前,ATM机内有S元,每个人会存Ai元或者取-Ai元,取决于Ai的正负号。当ATM机钱不够下个人的时候就会关闭。请你选择一个连续的区间,使得ATM机能服务最多的人。题解思路很明显,找一个最长的连续区间使得区间和 sum + S >= 0 。利用双指针来维护区间,时间复杂度是On的。将每个头指针都延展到能延展的最大长度即可。记尾指针。更新答案,并且将这个头指针往前,并将头指针值弹出。再用记忆了的尾指针继续往后探。这样每个点最多被访问2次。上次写过类似的,这次原创 2021-11-27 11:46:44 · 616 阅读 · 0 评论