思维
陈末iiiiiiiiiiii
Retired
展开
-
Codeforces Round #718 (Div. 1 + Div. 2) D 棋盘步数回路 DP 动态规划 思维
给你一个大小N*M的棋盘网格,网格的每条线都有一条无向边,以及它的权值。要求求每个点出发走K步后回到起点的最小权值和。当K为奇数是必然回不到起点。特判。因为它是回路,我们只需求走k/2步的最小值再*2即可。然后就是DP状态定义F[i][x][y]从x,y出发走了i步的最小权值和。如何转移?因为无向边,所以我们走k步最小到达的点,必然我们可以反向的到达回去。相当于将状态等价为F[i][x][y]从未知点走了i步后到达x,y最小权值和。(这里很思维)这样我们就能很轻松的写出如下的转移方程。原创 2022-07-06 21:53:07 · 137 阅读 · 0 评论 -
Codeforces Round #611 (Div. 3) F 拓扑排序 构造树 思维
题目Polycarp 决定装饰他的房间,因为新年快到了。 Polycarp 将安装的主要装饰品之一是他将自己焊接的花环。由一根电线连接的几盏灯组成的简单花环对 Polycarp 来说太无聊了。他要焊接一个由 n 个灯和 n-1 根电线组成的花环。恰好一个灯将连接到电网,并通过电线将电力从它传输到其他灯。每根电线恰好连接两个灯;一个灯被称为该电线的主灯(从其他电线获得电力并将其传输到该电线的灯),另一个称为辅助灯(从该电线获得电力的灯)。显然,每盏灯最多有一根电线为其供电(此灯是该电线的辅助灯,而所有其他原创 2022-05-17 20:25:30 · 177 阅读 · 1 评论 -
Codeforces Round #791 (Div. 2) D 二分最小化最大值 拓扑排序 非联通图dfs判环
题目有一天,玛莎在公园里散步,在一棵树下发现了一张图表……很惊讶?你认为这个问题会有一些合乎逻辑和合理的故事吗?没门!那么,问题…Masha 有一个有向图,其中第 i 个顶点包含一些正整数 ai。最初,玛莎可以将硬币放在某个顶点。在一次操作中,她可以将放置在某个顶点 u 中的硬币移动到任何其他顶点 v,从而在图中存在有向边 u→v。每次将硬币放在某个顶点 i 时,玛莎都会在她的笔记本上写下一个整数 ai(特别是,当玛莎最初将硬币放在某个顶点时,她会在笔记本上写下这个顶点处的一个整数)。 Masha 想要原创 2022-05-16 19:41:36 · 124 阅读 · 0 评论 -
Codeforces Round #697 (Div. 3) F 01矩阵行列异或变换 套路题 暴力 思维
题目给你一个01矩阵再给你一个目标01矩阵。你可以进行任意次的整行异或或者整列异或。问当前矩阵是否能通过这两种操作转换成目标矩阵。题解思路以前见过这种题,套路满满。我们可以先使用列异或使得第一行符合全部条件,这样我们就只能使用行异或了,因为一旦使用列异或就会使得第一行不符合要求。直接打暴力就行了。套路题。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define原创 2022-05-05 16:14:12 · 335 阅读 · 0 评论 -
Codeforces Round #623 (Div. 2) D 优先队列 并查集 数据结构 思维
题目VK 新闻推荐系统每天为每个用户选择 n 个不相交类别之一的有趣出版物。每个出版物都属于一个类别。对于每个类别,我批处理算法选择 ai 出版物。最新的 A/B 测试表明,如果每个类别在每日推荐中的出版物数量不同,则用户阅读推荐出版物的积极性更高。目标算法可以在 ti 秒内找到第 i 个类别的单个有趣出版物。将出版物添加到批处理算法执行结果所需的最短总时间是多少,因此所有类别都有不同的出版物数量?您无法删除批处理算法推荐的出版物。输入输入的第一行由单个整数 n 组成——新闻类别的数量(1≤n≤2原创 2022-03-16 19:09:47 · 1731 阅读 · 0 评论 -
Educational Codeforces Round 124 (Rated for Div. 2) D 多源BFS 思维
题目在平面上给你 n 个不同的点。第 i 个点的坐标是 (xi,yi)。对于每个点 i,找到不属于给定 n 个点的整数坐标最近的点(根据曼哈顿距离)。如果有多个这样的点 - 您可以选择其中任何一个。两点 (x1,y1) 和 (x2,y2) 之间的曼哈顿距离为 |x1−x2|+|y1−y2|。输入输入的第一行包含一个整数 n (1≤n≤2⋅105) — 集合中的点数。接下来的 n 行描述点。其中第 i 个包含两个整数 xi 和 yi (1≤xi,yi≤2⋅105) — 第 i 个点的坐标。保证输原创 2022-03-13 13:49:38 · 1990 阅读 · 0 评论 -
Codeforces Round #776 (Div. 3) E 二分 贪心 分类讨论 边界处理 multiset
题目现在 Dmitry 有一个会话,他必须通过 n 次考试。会议从第 1 天开始,持续 d 天。第i次考试将在ai(1≤ai≤d)那天进行,所有ai-都是不同的。样本,其中 n=3,d=12,a=[3,5,9]。橙色——考试日。第一次考试前,Dmitry 休息 2 天,第二次考试前休息 1 天,第三次考试前休息 3 天。对于课程安排,Dmitry 考虑了一个特殊值 μ——所有考试的考试前休息时间中的最小值。例如,对于上图,μ=1。换句话说,对于日程安排,他精确地计算了 n 个数字——他在考试 i-1原创 2022-03-09 18:03:50 · 299 阅读 · 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 · 138 阅读 · 0 评论 -
Codeforces Round #772 (Div. 2) D 无限集 二进制枚举 思维
题面给定一个由 n 个不同的正整数组成的数组 a。让我们考虑一个无限整数集合 S,它包含所有满足以下条件之一的整数 x:x=ai 对于某些 1≤i≤n。x=2y+1 且 y 在 S 中。x=4y 并且 y 在 S 中。例如,如果 a=[1,2],则 S 中的 10 个最小元素将是 {1,2,3,4,5,7,8,9,11,12}。找出 S 中严格小于 2的p次方 的元素个数。 由于这个数字可能太大,所以以 109+7 为模打印。输入第一行包含两个整数 n 和 p (1≤n,p≤2⋅105)原创 2022-02-21 16:46:20 · 486 阅读 · 0 评论 -
牛客xb月赛43 F 寻找多源起点和图中其他点奇偶性相同 的 点 思维 BFS
题目题解思路根据题目意思,我们貌似就是要找到一个点,让多个起点对于这个点的最短路长度奇偶性完全相同。很容易想到,这个点到了之后可以在终点反复横跳,这样不会改变奇偶性。但是如何只有这个条件的话,这题还是很难做出来。更暴力的转化取一个点作为起点,跑bfs,让它确定到每个点具有的所有奇偶性即可。这种bfs属实巧妙,之前没有接触过。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queu原创 2022-01-21 16:28:36 · 252 阅读 · 0 评论 -
第十三届西南民族大学程序设计竞赛 G 并查集的运用 思维
题目题解思路讲每个列当成连通的边,将行作为连通的点。这样对每个行都有对应的坐标,进行降维处理。出现列的时候肯定是让上下的行连通,出现行的时候,即让左右的行连通。并查的时候查询是否已经是个连通块即可。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,int>#define ll long longusing name原创 2021-12-27 13:41:33 · 335 阅读 · 0 评论 -
Educational Codeforces Round 47 (Rated for Div. 2) D GCD 构造图
题目给你n个点m条边,问你是否可以构造出一个图,图里的每一条边相连的两个点的编号的gcd等于1。n < 1e5m < 1e5题解思路因为m很小,直接考虑暴力,因为我们可以一条一条的建,建满了直接弹出去就行了。再特判给的边能不能构成图即可。这题明显白给,就是不敢写。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,原创 2021-12-22 19:58:25 · 657 阅读 · 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 · 349 阅读 · 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 · 69 阅读 · 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 · 300 阅读 · 0 评论 -
Codeforces Round #760 (Div. 3) E 错位减 找性质 思维 二分爆longlong
题目有n个地方 每个地方的唱歌时间固定值为bi每个地方都有一个歌手ai,他在这个地方唱完后会去(i+1)mod n 的地方,并且时间加倍,也就是 ai 2ai 3ai …nai 。他会走完所有地方。求是否存在一个ai数组使得所有bi都成立。题解思路这种数列的部分和的题,第一步肯定是错位减减找性质。可以得到 sum(a[i]) - na[i] = 差值而sum其实是可以之前求出来的每个歌手都唱了ai 2ai … nai求和就是 (1 + 2 … n) sum(a[i]) ==原创 2021-12-15 19:09:09 · 1036 阅读 · 0 评论 -
Codeforces Round #760 (Div. 3) D 贪心 思维
题目给你有N个数的数组a ,定义操作任意取两个下标不同的数ai , aj ,将他们删除,并将 ai/aj 下取整加入所得分数。你只能进行k次操作,操作后,数组剩余的数需要加入得分中,求所得的最小得分。题解思路贪心为了保证最小,只考虑前2k的数来删除,删小的不如删大的,如果留下大的,就不能保证最小得分了。在2k个数中继续贪心。全局考虑,肯定有大有小,我们总是拿小的去除大的。但是当一个数出现的数量大于k,那这个数对面的数就不是比他大的数了,这样只能得到1。实力不够,心服口服。打ac原创 2021-12-15 14:11:04 · 1389 阅读 · 0 评论 -
Codeforces Round #759 (Div. 2) D 结论 求逆序数的个数
题目给你一个长度为N 的数组 ai给定一种操作你可以选择3个下标 i j k使得ai aj ak 的相对顺序改变成 ak ai aj求能否通过这个操作使得原数组呈升序。题解思路当 i j k 都不同的时候,这个操作可以减少偶数倍的逆序数。当存在两个相同的数的时候,就有点神奇了,他可以让其中那个不同的数任意走到其中某个位置,这样就可以不断选择这两个数,使得另一个数归位。总结当存在两个相同的数的时候,一定可以,当都不同的时候,必须满足逆序数为偶数倍才能操作出来。求逆序数的原创 2021-12-13 14:36:38 · 490 阅读 · 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 · 406 阅读 · 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 · 542 阅读 · 0 评论 -
AtCoder Beginner Contest 229 E 并查集 逆向思维建边
题目给你N点M边的完全图,每次按点的编号不断删除点(从1到n)。问你每次删除后有几个连通图。题解思路不妨从结果往前考虑。最终状态肯定是一个点都没有,0个连通图。我们从N往前加边加点。然后将可以连接的点并查起来即可。这样我们只需建小到大的单项边即可。大到小的时候,小的点被删除了。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<in原创 2021-11-28 13:16:05 · 411 阅读 · 0 评论 -
2021牛客寒假算法基础集训营2 G 差分前缀和的离散化 扫描线思想
题目题解思路一开始想直接差分然后直接前缀和,但是1e9开不了。但是题目只有1e5个,这就是这道题的突破口。将答题每个区间分成两个端点一个是从那个位置开始加,一个是加到的终点,分别赋值1,-1。这里和普通差分差不多,应该好理解。然后根据端点从左到右排序。根据扫描线来处理出答对某个题目数的人数。其中伴随了一个前缀和变量,记录扫描线跑到现在答对的题目数,并且每走一步更新人数(利用前后两个端点差即区间差)。这一步属实巧妙。后面处理人数应该不难。大佬题解AC代码#include <b原创 2021-11-17 21:49:23 · 72 阅读 · 0 评论 -
2021牛客寒假算法基础集训营2 E 双指针建图 BFS 思维
题目题解思路很容易看出这题就是裸的BFS,但是怎么建图呢?这里用到了双指针。用桶装每个高度,再将桶内的跷跷板从左到右排序。从最低高度开始从左往右从下到上建边。从左到右建图的话直接看是否满足题目条件即可。从下到上就有讲究了。你得先看看上面有没有点,其次要贪心的试探,上一层的这个位置点是否能建边,小了就往前跑,跑到可以建为止,并且建的时候也需要往前跑,跑到不能建的时候记得回溯(即从左到右的下一个点可能可以和前一个点的最后一个位置建边。)这样每个点最多只会被跑2次,时间复杂度是On的。建完了原创 2021-11-17 11:09:04 · 226 阅读 · 0 评论 -
2021牛客寒假算法基础集训营2 gcd + 贪心
题目题解思路根据题目规律,找出要相同的子串的长度。这里他们一眼出gcd(),我倒是看了很久,还是太菜了。当2*K < N的时候就是另一种情况,因为这个长度他不能拉伸。所以这时候重叠的子串长度就只有N - k 。当知道了重复的区间,我们要让修改的字母数最小,就枚举每个子串的每个位置的众数即可。这是小贪心。参考题解AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#原创 2021-11-16 21:07:27 · 95 阅读 · 0 评论 -
AtCoder Beginner Contest 226 E 图论 连通块中DFS判单环 思维
题目给你一个N个点M条无向边的图。没有自环和重边。确定每条边的方向,要求让每个点的出度为1。确定边的方向有几种情况。对998244353取模。题解思路当连通块N点M边。当N==M的时候就一定有一个自环。(满足连通就需要N-1条边)当N < M的时候就可能有多个环了。这样某点出度必然为2。小于时有某个点就出度为0了。所以,要让每个点出度为1那这个连通块必然就是环了。这样图里的连通块只能是环并且只有一个单环。这里在连通块里dfs判环也感觉有点陌生。贴大佬的话大佬的题解AC原创 2021-11-16 18:19:06 · 367 阅读 · 0 评论 -
AtCoder Beginner Contest 226 C dfs序 逆拓扑序
题目一个武术高手,可以学T种武术,但他只想学第T个武术,学每个武术有需要花费的时间和前置武术条件(即要先学会前置的武术)。求他学会第T个武术需要的最少时间。题解思路一开始想并查集什么的,没想太明白。如果从图论想的话,这题就可以解决了。如果正向建图的话,不容易得出答案的。因为起点难确定。而如果反向建图的话,从T点出发往回跑,跑到每个武术的最基础武术点(即无需前置武术的那种)。并且每个点只跑一次。记录出来的就是答案。帖大佬的一句话我们反向跑的时候当这个点以及被学过了,那就没必要再跑一遍了。原创 2021-11-16 15:57:43 · 703 阅读 · 0 评论 -
021牛客寒假算法基础集训营2 J 构造 斐波那契数列的运用 判断三角形成立的条件
题目题解思路首先 三角形成立的条件就是 任意两边之 和 大于第三边 我们取最坏的情况。最小的两边小于等于第三边。这样是不是有点斐波那契数列的感觉了。刚好就是等于前两项之和。看看行不行。这样我们需要让第一层循环在不少于进入log2n(40左右)的情况下,斐波那契数列在int范围内有46个左右。这样我们取前40个符合条件的数放入答案数组前面,后面取1即可。AC代码#include <bits/stdc++.h>//#include <unordered_map>原创 2021-11-13 17:32:35 · 141 阅读 · 0 评论 -
Codeforces Round #732 (Div. 2) C 思维 结论 找规律
题目给你一个数组Aai代表每个元素的值,并且他们还具有方向,一开始都是朝右。我们可以将相邻的数进行交换,但是每交换一次他们的方向会改变一次。要求在任意次操作的情况下,能否让数组变成非递减并且方向一致朝右的情况。题解思路性质(突破点) : 要使方向不变必然要让这个数被交换偶数次。要让这个数被交换偶数次。只能交换奇偶性质相同的点。那中间的数的方向是否能保证?例如3 2 1 交换 3 12 3 1 2 32 1 3 3 11 2 3 2 1中间的数也只会被交换偶数次。即这原创 2021-11-13 10:41:39 · 60 阅读 · 0 评论 -
Codeforces Round #613 (Div. 2) C 结论 爆搜 思维
题目给你一个数X , 求出两个数a b 使得lcm(a,b) == X 且 max(a,b) 最小 。题解思路首先 a b 肯定要互质 才能不含多的质因子来构成X,即相乘构成。这样我们直接用试除法 , 对X的所有质因子筛出,然后判断两边是否互质,因为试除法是根号级别的而且试除法中i在不断变大并且只到根号X,这样另一边就是不断变小的。所以符合条件的最后一个数就是答案。如果我们不知道这个结论就只能弄出所有质因子,将他们组合成答案。质因子不会很多,不超过50个。所以可以进行爆搜出最小的组合方式。原创 2021-11-12 19:38:57 · 384 阅读 · 0 评论 -
2021牛客寒假算法基础集训营2 I 筛法 dp 思维
题目题解思路肯定是要用前面的数的结果来递推后面的数的。因为欧拉筛是用最小质数来筛出每个合数的,所以一开始想着用最小的质数来放到数的最前面。但是后面的数可能会非常大而导致取模后无法判断长度。这样就会Wa。这样的话,不如将每个数最大的质数放到数的后面,这样的乘法过程就不会影响取模的正确性了。利用埃筛就可以实现的,埃筛就是按顺序把合数的质数从小到大来筛他的,这样就可以利用之前情况来递推后面的结果了。利用log10(来取出质数的位数-1。这样可以知道前面的数应该前进多少位。从而得出答案。AC代码原创 2021-11-11 19:06:39 · 89 阅读 · 0 评论 -
牛客xb月赛 H 二分 思维 经典任意区间问题
题目题解思路根据绝对坐标。这个 0 0 点 可以 转化成 执行命令区间 的前一个点 , 再预处理出达到这个点的所有操作的下标。在 L , R 中二分就出答案就行了。至于为什么可以二分,因为我们是往前走的预处理,一直保持了从小到大。两个二分函数调了好久,发现是没 + 1 ,麻了。AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#in原创 2021-11-05 18:21:42 · 76 阅读 · 0 评论 -
(AtCoder Beginner Contest 225 E 斜率区间离散化 求最大不相交区间
题目在第一象限给你N个 “ 7 ” (即由 (x-1,y) (x,y) (x,y-1)构成的7字型 )的x , y 。要求删除一部分的7,使得从原点看可以看到尽可能多的7 。链接题解思路难点在于根据题目意思抽象出区间,以及区间离散化 。画图可以知道,每个7带来的影响就是两个斜率((x-1,y) 和 (x,y-1) 分别与原点构成的斜率 )包含的7不能被看到了。这样我们将每个7的两个斜率化为区间,左右,再根据求最大不相交区间的方法就可以过了。但是斜率由于精度会变得非常难处理(趋于正无穷少原创 2021-11-03 21:46:52 · 122 阅读 · 0 评论 -
力扣407. 接雨水Ⅱ 最短路迪杰斯特拉 优先队列 + 贪心
题目题解思路学长讲的真的好把高度看成最短路,最短的点延申出的必然是最短路。AC代码#define PII pair< int, pair<int ,int > > class Solution {public: int trapRainWater(vector<vector<int>>& heightMap) { int n = heightMap.size() , m = heightMap[0].siz原创 2021-11-03 18:34:36 · 241 阅读 · 0 评论 -
Codeforces Round #753 (Div. 3) D 区间处理
题目给你长度为N数组,每个元素都具有一种颜色,一共有两种颜色,蓝色使这个元素能自我减少,红色使这个元素能自我变大。要求判断数组N能否成为1—N的序列。例如N= 41 3 4 21 2 3 4题解思路将每个元素看成一个区间,蓝色赋为1-a[i],红色赋为a[i]-N。将区间左右端点都从小到大排序。再从小到大判断1-N的数。看看是否每个数都有区间能放下它。这样看起来是对的思路。实际上需要特判负数。元素为负数的时候,如果为蓝色,这个数组必然不能变成序列,红色时,这个元素可以变成1-n的所原创 2021-11-03 09:47:24 · 129 阅读 · 0 评论 -
力扣260. 只出现一次的数字 III 通过两数异或合寻找两个数
题目题解思路通过异或整个数组,我们可以得到那两个只出现一个的数的异或合。再通过这个数的的必然存在的二进制位的1。(这样的话有一个数必然包含这个1,另一个数必定不包含)将原数组分为两部分,分布异或出答案。AC代码class Solution {public: vector<int> singleNumber(vector<int>& nums) { vector <int> ans (2,0) ; int原创 2021-11-02 15:13:18 · 140 阅读 · 0 评论 -
456. 车站分级 拓扑排序 N 对 N 建边 虚拟节点优化 贪心
题目TP题解思路建立有向边来表示差分约束。会大一级就建1边 。站点之间不建边。使得答案最小。(贪心)这样图的最长路就是答案了。而拓扑序利用边权来更新最大值,就可以满足答案是最长路(根据拓扑排序的定义理解)。再这样再跑一遍拓扑序来得出答案。这样车站之间建边可能会变成nn , y总用虚拟点优化使得只需2n条边即可。AC代码#include <iostream>#include <cstdio>#include <cstring>#include原创 2021-10-28 18:19:05 · 115 阅读 · 0 评论 -
Codeforces Round #674 (Div. 3) D 任意区间问题 前缀和相同 表示某区间为0 贪心 哈希
题目题解思路和去年省赛的一道题目有点类似。都是通过前缀和来差出区间为0的情况。我们对这个数组进行在线处理前缀和,不断将前缀和放入哈希表键值表示存不存在,如果某个前缀和之前就已经出现了,那么他们之间的区间和必然是0。我们可以之间在这个区间里加一个无限大的值(此时自增操作数 ),使得区间不能为0了,这样之前囤积的区间就要clear()掉,因为他们有潜在的可能和后面的数构成0的区间。这样哈希表里的数就全部要重新开始。但是我们加上一个无限大的数,他们就没有这个潜力成为最大的区间了。这样在线处理就能得出原创 2021-10-27 18:11:56 · 82 阅读 · 0 评论 -
牛客xb月赛39 H 贪心 前缀 后缀和
题目题解思路如果没有魔法,就从1开始有多少斩多少。斩到最后全部结束就是答案。但是有魔法的存在就不好处理了。我们必须贪心出最优的魔法攻击位置。一开始想着最大的地方,但是这个地方可能有很多个。这里用了类似dp 的思想。定义两个前缀后缀和,代表 从 1 到 n 和 从 n 到 1 的最小斩击数 k1[] k2[]。如果我们在i处使用魔法。那么答案就是 k1[i-1] + k2[i+2]这样我们只需从1开始走一遍取最小的ans即可。类似dp 的贪心。AC代码#include <原创 2021-10-26 16:00:25 · 75 阅读 · 0 评论 -
3956. 截断数组 前缀和 枚举 unordered_map 思维
题目题解思路坑点map的count只返回0或者1,不返回权值。很容易想到用前缀和,枚举每个能等于总和1/3的总前缀和(sum)(只有这些才有可能切出3块)。找到在尾部之前是否存在1/2sum的前缀和。如果存在就可以拼接出答案,但是,可能存在不止一个这样的值。这样我们好像只能往后搜查出答案,但是这样是有可能超时的。想了一会,想到了一个在线map的方法。我们存一个map来保存i到i之后的每个前缀和值的个数。这样我们只需直接mp[sum*2]]就能找到后面有几个数可以划分出。当我们处理完这个数原创 2021-10-21 18:34:55 · 147 阅读 · 0 评论 -
2020ICPC 江西省大学生程序设计竞赛 E.Color Sequence 二进制 异或位运算 传递1 思维
题目给你长度为N的序列,序列里的数只包含0到20。表示第i个位置的颜色。要求计算出满足要求的子序列总数子序列的含有的每个颜色数的总和都是偶数。题解思路比赛的时候想着什么暴力双指针一条路走到黑都没写出来。这里颜色数很少,所以我们可以直接用21位的二进制数表示出来。即0表示含偶数或者0个,1表示奇数个。这样我们就能表示1到n的所有状态了。用异或运算传递一下之前状态的结果。再判断这个状态的是否含奇数个这个颜色。如果是就变成这个位数就0,减去对应的幂次。不是就加上对应的幂次。这样我们就好像原创 2021-10-19 21:54:25 · 257 阅读 · 2 评论