刷题记录
Belief_7
这个作者很懒,什么都没留下…
展开
-
P1419 寻找段落(单调队列+二分)
欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;增加了 图片原创 2021-05-08 22:30:00 · 119 阅读 · 0 评论 -
POJ 1201 Intervals (差分约束)
题目链接思路:令dis[i]表示0到i这个区间内至少要选出dis[i]个数,那么对于每个[ai,bi],有dis[bi] - dis[ai-1] >= ci,建ai-1 -> bi权值为ci的边同时隐含的一个条件是0 <= dis[i+1] - dis[i] <= 1:dis[i+1] - dis[i] >= 0 可建i -> i+1边权为0的边dis[i+1] - dis[i] <= 1 ===> dis[i] - dis[i+1] >= -原创 2021-09-17 21:02:12 · 98 阅读 · 0 评论 -
POJ 3169 Layout (差分约束)
题目链接思路:由题意得求差分约束最大值,用spfa求最短路,建图:对于喜欢的人dis[r] - dis[l] <= w,直接建l -> r权值为w的边;对于不喜欢的人dis[r] - dis[l] >= w化为dis[l] - dis[r] <= -w,则建r -> l边权为-w的边;求最短路dis[n]等于INF时说明n点不可达,就代表n点没约束到位置就可以任意值返回 -2,当图中存在环的话永远无法求出最短路,则答案不存在返回-1。代码:#include &原创 2021-09-17 21:59:43 · 61 阅读 · 0 评论 -
POJ - 3264 Balanced Lineup(线段树维护最值)
题目链接思路:线段树模板题,只要维护两个线段树,一个维护最大值,一个维护最小值即可代码:#include <iostream>#include <queue>#include <cstring>#include <algorithm>#include <cmath>#include <iomanip>#include <set>#define fastio ios::sync_with_stdio(fa原创 2021-09-22 22:17:49 · 70 阅读 · 0 评论 -
HDU - 3974 Assign the task(线段树 + dfs序)
题目链接思路:裸的线段树,唯一难点就是建树。dfs序:作用就是将树上的问题转化为区间问题,用线段树处理区间问题,注意建树前要将dfs序搜出来,dfs_order[i].first为in[i]左端点,dfs_order[i].second为out[i]右端点建树:Build(1,1,len);单点查:Query(1, dfs_order[x].first);区间改:Update(1, dfs_order[x].first, dfs_order[x].second, y)注意:像这种单点查询的原创 2021-09-22 22:07:02 · 86 阅读 · 0 评论 -
HDU - 1698 Just a Hook(线段树区查区改)
题目链接思路:线段树区查区改模板题,就是忘记开流加速在hdu上超时了n发,记住输入数据大概大于等于1e5时就要用scanf了代码:#include <iostream>#include <queue>#include <cstring>#include <algorithm>#include <cmath>#include <iomanip>#include <set>#define fastio io原创 2021-09-22 22:14:37 · 152 阅读 · 0 评论 -
HDU - 4614 Vases and Flowers(线段树+二分查找)
题目链接思路:将该花盆中无花看成1,有花看成0,因为叶子结点只有0/1两种情况,直接修改节点值即可,操作1:因为ln-1区间中,r为区间中的点,lr区间值递增,所以可以二分+Query函数,找到以输入l为起点区间值为1的st点,和st起点区间值为num的ed点,再更新即可。操作2:区查区改即可。代码:#include <bits/stdc++.h>#define fastio ios::sync_with_stdio(false), cin.tie(NULL), cout.t原创 2021-09-22 22:00:29 · 78 阅读 · 0 评论 -
HDU - 4027 Can you answer these queries?(线段树)
题目链接思路:1.查询:区间查询板子2.修改: 要将线段树区间修改稍微改一下,因为每次区间修改都把该区间所有的数修改为向下取整的原值开根号,所以一个1e18次方的数修改超过50次(我猜的)大概就会变成1,而 1修改的话值不变,所以当修改区间的所有值都为1时就不用再修改该区间了直接return,我判断所有值为1的条件是节点的值w等于区间长度,也可以用区间最大值来判断。注意:输入的区间值不保证l <= r,要判一下;还有就是每组样例之间要有一个空格。代码:#include <bits/s原创 2021-09-26 10:54:33 · 63 阅读 · 0 评论 -
HDU - 1540 Tunnel Warfare(线段树 + 二分)
题目链接思路:前提:0表示未摧毁,1表示摧毁1. D操作单点修改即可,R操作将删除的点存入栈每次恢复栈顶的点2. Q操作就是要查询x点往左的第一个删除点l_del和往右走第一个删除点r_del,删除点即为值为1的点,ans = del - r_del - 1;当x为1或n时要特判,用两个不同的二分分别查询l_del和r_del即可。3.二分的check即为Query(区间值查询),当区间值大于0区间必有被摧毁的,往里面分,当区间值等于0就可以跳过了。复杂度大概是O(lognlognm)代码:原创 2021-09-26 10:58:47 · 103 阅读 · 0 评论 -
ZOJ - 1610 Count the Colors(线段树区间颜色更新)
题目链接思路:先建树,lazy延迟数组,ans记录每个数字颜色出现次数,-1表示无色,-2表示多色,>=0表示有颜色。Bulid函数只是将左右节点固定了,PushUp更新父节点函数:当两个子节点颜色不同,则更新为-2,若相同则更新为子节点颜色,PushDown更新子节点的lazy数组,子节点的lazy和tree.w值都更新为父节点的lazy,父节点lazy变为无色-1。Update:1.节点的左、右区间在修改区间之内,直接更新tree[idx].w和lazy[idx]为k2.若此时不是1原创 2021-09-22 19:27:36 · 95 阅读 · 0 评论 -
POJ - 2528 Mayor‘s posters(线段树染色问题 + 插点离散化)
题目链接线段树 + 离散化,为什么要在相邻数字只差大于1之间插入一个大于前小于后的数?大概就是就是找一个数代替alls相邻数字之间所缺的一段区间。离散化后就是染色问题了,w代表此时该点最上面的画,也可以理解为一种颜色,w为0无颜色,-1有多种颜色,大于 0有颜色代码:#include <iostream>#include <algorithm>#include <iostream>#include <string>#include <原创 2021-09-22 23:00:44 · 91 阅读 · 0 评论 -
POJ - 2502(恶心建图 + 朴素dijkstra)
题目链接思路:思路就是求最短路,最恶心的就是如何建图,建图思路:1.图上的点数 = 起点 + 终点 + 车站数,同一个地铁路线的点按地铁速度算,其他不在同一路线上的点按步行算,要将所有点的距离都算出来。2.先将相同路线地铁站之间耗费时间算出来,在将所有点之间步行耗费时间算出来即可最后输出时要用(int)(ans + 0.5)对ans进行四舍五入代码:#include <iostream>#include <algorithm>#include <iostre原创 2021-09-30 20:52:12 · 175 阅读 · 0 评论 -
POJ - 1797(求路径最小边最大值)
题目链接题意:求1 ~ n路径中最小边的最大值思路:dis[i]记录从1到达i点的最小边,最开始先将与1有边的点dis更新,修改dijkstra,枚举n-1次,每次找出dis[i](即从1 ~ i点边的最小值)的最大的一个t,用dis[t]更新其他点的dis -> max(dis[j], min(dis[t], a[t][j]));(关键一步)感觉这题又是一种记录路径中的某些元素的最短路题代码:#include <iostream>#include <cstrin原创 2021-09-22 23:09:38 · 342 阅读 · 0 评论 -
POJ - 1847(朴素dijkstra)
题目链接思路:由题意得只有第一个方向不要转距离为 0,其他方向要转距离都为 1,已知起点和中点,朴素dijkstra即可,感觉最短路的问题很多有建图思路大概就会写了。样例为答案为 0 的情况解释 :2 -> 3 -> 1代码:#include <iostream>#include <algorithm>#include <iostream>#include <string>#include <stdio.h>#in原创 2021-09-30 20:48:01 · 127 阅读 · 0 评论 -
POJ - 1860(spfa判断正环)
题目链接思路:spfa求最长路,cnt[i]记录从s到达i点的路径上点的数量,当到达某个点路径的点数cnt[i]大于n时,代表在求最长路时用到了正环从而得出有正环。代码:#include <iostream>#include <queue>#include <cstring>#include <vector>#define fastio ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(原创 2021-09-22 23:11:37 · 264 阅读 · 0 评论 -
POJ - 1062(超级源点 + dijkstra或spfa)
题目链接思路:建图:1.以S = 0 为超级源点,所有的点到由S到该点的距离等于其本身的价格,2.每一个物品可以由替代还品 + 优惠价得到,也就是替代品->原物品的距离为优惠价最后再枚举满足长等级的所有区间跑dijkstra取最小值代码:#include <iostream>#include <algorithm>#include <iostream>#include <string>#include <stdio.h>原创 2021-09-30 20:50:29 · 147 阅读 · 0 评论 -
POJ - 2240(spfa判断正环 + map映射)
题目链接思路:干开始将所有的数组都改成了map集合,还因为c++版本原因交了半天的re,不re后变成运行超时,然后重写代码,将货币名称映射到1~n的数字中,按照spfa判正环的思路就过了。后面还因为"Yes"写成"YES" wa了好几发。代码:#include <iostream>#include <map>#include <queue>#include <cstring>#define fastio ios::sync_with_stdi原创 2021-09-30 21:00:47 · 110 阅读 · 0 评论 -
HDU - 4725 (堆优化dijkstra + 虚拟点建图)
题面链接思路:一开始以为所有的点所在的层都不同,就一直wa,后面改成存每一层的点,再算每一层的点与上下两层点的距离,结果显然会超时,看了题解后才了解了一个神奇的建图方法可以大大降低算法复杂度。建图思路:对于每一层可以抽象为一个点,为了避免与给出点冲突第 i 层抽象为为第 i+n 点,每一层到达本层点的距离都是 0,层中每个点到达上一层点或下一层点的距离都为 c,这样就可以通过虚拟出来的层点实现每个点 i 到达上或下一层任一的点的操作,然后再将额外边加入,跑一遍堆优化的dijkstra即可代码:#原创 2021-09-30 20:35:16 · 185 阅读 · 0 评论 -
POJ - 3169 Layout (差分约束)
题目链接思路:由题意得求差分约束最大值,用spfa求最短路。建图:1. 对于喜欢的人dis[r] - dis[l] <= w,直接建l -> r权值为w的边;2. 对于不喜欢的人dis[r] - dis[l] >= w化为dis[l] - dis[r] <= -w,则建r -> l边权为-w的边;求最短路dis[n]等于INF时说明n点不可达,就代表n点没约束到位置就可以任意值返回 -2,当图中存在环的话永远无法求出最短路,则答案不存在返回-1,无环且dis[n]可原创 2021-09-30 21:23:01 · 114 阅读 · 0 评论 -
LightOJ - 1074(spfa求最短路和判负环)
题面链接思路:先将所有边求出来,有负边权spfa求最短路即可,图中可能有负环,当存在负环时所有可达点都变成了负无穷,但是这样写确过不了,改成遇到负环就return但是前面求的最短路不变成负无穷就过了代码:#include <iostream>#include <algorithm>#include <iostream>#include <string>#include <stdio.h>#include <algorithm原创 2021-09-30 20:39:25 · 138 阅读 · 0 评论 -
POJ - 3268(反向建图+dijkstra)
题目链接题意:n头牛先从各点出发到x点,再从x回到出发点,求往返花费时间最长的牛的时长思路:1.从x点回来:直接跑一遍从x点出发的最短路就能获得x点到其他所有点的最短路。2.各点出发去x点,也可以看成从x点倒退会各点最短路,因为边时有向的,所以输入时再多加一个反向建图的数据,从x出发跑一遍方向建图的数据即可获得各点到x点的最短路。代码:#include <iostream>#include <cstring>#define fastio ios::sync_wit原创 2021-09-30 21:06:39 · 181 阅读 · 0 评论 -
HDU - 6438 Buy and Resell(买卖贪心)
[题目链接](http://acm.hdu.edu.cn/showproblem.php?pid=6438Buy and Resell)思路:由题意得每个地点只能买一次或卖一次,所以不用加while循环,if_else判断即可,用一个最小堆存未购入商品的价格,遍历输入的商品价格a[i]:1.当最小堆为空,a[i]直接入堆。2.当此时最小堆q.top()的价格小于a[i],就可以假设购买了q.top再将其以a[i]的价格卖出,此时get += a[i] - q.top(),因为这时的a[i]代替了q原创 2021-09-28 09:15:55 · 104 阅读 · 0 评论 -
HDU - 3038 How Many Answers Are Wrong (带权并查集)
题目链接思路:由题意给定几组判断,如果与前面的相悖则为错误ans++,如果与前面不相悖则加入维护,用带权的并查集维护给出的条件,l~r和为s,可以看成d[r]-d[l-1]==s和前缀和类似。代码:#include <bits/stdc++.h>#define fastio ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)#define debug(a) cout << "debug : " <&原创 2021-10-03 22:21:28 · 86 阅读 · 0 评论 -
POJ - 1182 食物链 (带权并查集)
题目链接思路:按照带权并查集的思路,用到根节点的距离判断类型,因为是三类,所以可以将三类分为d[i]%3,x吃y就是d[x] = d[y] + 1,然后不在同一棵树上就合并,在同一棵树上就通过d值判断,与前面相悖则ans++。为什么x吃y的w值为 1?因为合并时是将x所在树的树根加入到y所在的树下,所以x在树上的位置在y之下,所以是1代码:#include <iostream>#include <algorithm>#include <iostream>原创 2021-10-04 20:53:24 · 82 阅读 · 0 评论 -
POJ - 1456 Supermarket (并查集或优先队列贪心)
题目链接刚开始确实想不到并查集去,就莽写了一个贪心过了思路大概也就O(n),跑了63s,并查集的思路是晚上查到的跑了43s,下面提供贪心和并查集的思路和代码贪心思路:按时间倒着来卖,这样没有卖出去的加入的堆中,堆中的对于前面的时间都可以卖,如果此时idx指向的商品没有堆顶大就卖堆顶的价值,将此时卖的加入堆中,反之则直接idx指向的商品,因为一天只能卖一个,所以卖了一次后后面时间也是now的直接也加入堆中,最后商品遍历完后要根据now清空堆中元素,也就是堆中在剩余的天数中卖出。代码:#include原创 2021-10-06 11:12:33 · 112 阅读 · 0 评论 -
POJ - 1733 Parity game(带权并查集 + 离散化)
题目链接思路:带权并查集维护 + 离散化,当l~r区间1的个数为odd奇数时可以看成((d[r] - d[l-1])%2)==1,当l~r区间1的个数为even偶数时可以看成((d[r] - d[l-1])%2)==0,然后所有的数据还要加个离散化就差不多了,找出第一个与前面相悖的答案break即可。开始把n看成一格数了卡了半天,后面思路对了又因为if判断中的多项表达式的符号优先级wa了好多发,以后if中的多项表示还是全加括号的好。代码:#include <iostream>#inc原创 2021-10-06 15:28:42 · 128 阅读 · 0 评论 -
POJ - 1984 Navigation Nightmare(带权并查集维护两个d值)
题目链接思路:带权并查集维护两个权,此时有两个距离需要维护,dx表示横坐标距离,dy表示纵坐标距离,东为x方权值 +w,南为y方向 +w,西为x方向 -w,北为y方向 -w,因为题目要求的查询是依据前c行的并查集构建程度查询的,所以可以先把所有构建并查集数据和查询数据输入存起来,将查询数据以c的大小升序排序,遍历m行并查集构建数据,当此时idx指向的查询数据c与i相等时就查询并记录答案,最后将查询数据按输入顺序降序排序输出即可。神奇的一A了,但是那个abs函数编译器不知为啥一直报错代码:#incl原创 2021-10-06 20:48:37 · 144 阅读 · 0 评论 -
POJ - 2492 A Bug‘s Life(带权并查集板子)
题目链接思路:带权并查集板子题,将种类分为两类,对2取余为0的一类,取余为1的一类,对于每组输入数据维护带权并查集关系,遇到与前面相悖的就直接flag更新,这组数据后面的就不用考虑了。代码:#include <iostream>#include <algorithm>#include <string>#include <stdio.h>#include <cstdlib>#include <cstring>#inc原创 2021-10-10 10:39:53 · 145 阅读 · 0 评论 -
L3-007 天梯地图(最短路)
题目链接思路:用dijkstra求两次最短路,一条是以时间为第一基准,长度为第二基准的最短路,另一条则是以长度为第一基准,经过点数量为第二基准的最短路。分别写两个最短路记录一下路径即可,注意点是从 0 开始,没仔细读题这里wa了一发。代码:#include <bits/stdc++.h>#define fastio ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)#define debug(a) cout <原创 2021-09-22 12:41:51 · 129 阅读 · 0 评论 -
L3-015 球队“食物链”(dfs + 剪枝)
题目链接思路:dfs + 剪枝,按字典顺序dfs所有状态,当遇到第一个符合题意得答案就直接输出,后面的就全部剪掉, 题目第一四个测试点需要再加一个剪枝:若未添加的队伍中没有一个能战胜第一个队伍则直接剪掉。代码:#include <bits/stdc++.h>#define fastio ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)#define debug(a) cout << "debug : "原创 2021-09-26 09:43:10 · 134 阅读 · 0 评论 -
L3-017 森森快递(线段树 + 贪心)
题面链接思路:区间活动选择贪心 + 线段树区改、维护区间最小值。区间贪心:区间的r值越小越先修改,当区间r值相同l越小越先修改,用一个结构体储存排序即可。注意:区间修改时父节点的修改不是长度*k值,是直接+=k,因为区间维护的是最小值,INF要大于int类型,INF=0x3f3f3f3f有一个点wa了,改成INF = 1e15就过了。代码:#include <bits/stdc++.h>#define fastio ios::sync_with_stdio(false), cin原创 2021-09-28 15:02:41 · 306 阅读 · 0 评论 -
L3-016 二叉搜索树的结构
题目链接思路:插入法建二叉树搜索树,用一个map记录每个值在tree中的索引,几个判断借助其值在tree中索引即可。只有一个判断是否在一层上要多写点:先找出输入第一个点所在的二叉树层数,在用改层的tree索引值范围判断第二个数是否在该层。代码:#include <bits/stdc++.h>#define fastio ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)#define debug(a) cout &原创 2021-09-26 16:59:29 · 110 阅读 · 0 评论 -
L2-036 网红点打卡攻略
题目链接思路:邻接表存图,用path数组存待判路径,然后对每条路径dfs即可,当时一直把dfs中的 x 看成了点,其实x是路径数组中点的索引,后面又因为题意没看清,以为是到达过所有点就满足,但题意是所有点景点到达一次代码:#include <bits/stdc++.h>#define fastio ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)#define debug(a) cout << "de原创 2021-09-15 19:38:51 · 229 阅读 · 0 评论 -
L3-008 喊山(bfs)
题目链接思路:开始太冲动直接写了个dfs发现不对,当一个地方发声则与该地点有边的点必定能听到了,直接dfs的话最远长度可能会变大,所以要用dfs一层一层标记完,当某个点的可达点都被标记完不能再向下标记时,该点就是此时最远的点,最远的点可能有好几个要比较保留最长的,长度相同则保存序号小的。代码:#include <bits/stdc++.h>#define fastio ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)原创 2021-09-22 16:58:35 · 95 阅读 · 0 评论 -
L3-010 是否完全二叉搜索树
题目链接思路:插入数据建立二搜索树,再用bfs获取二叉树的层序遍历,再判断二叉完全:遍历tree数组1 ~ n若有点值为-1则代表不是完全二叉树。代码:#include <bits/stdc++.h>#define fastio ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)#define debug(a) cout << "debug : " << (#a) << " = "原创 2021-09-23 13:45:38 · 96 阅读 · 0 评论 -
L3-013 非常弹的球
题目链接思路:经过一系列公式的每次到达最高点时s = E / mg,还有下坠所以每隔一次落地有两次要乘以2得 s = 2E / m*g。代码:#include <bits/stdc++.h>#define fastio ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)#define debug(a) cout << "debug : " << (#a) << " = " <&原创 2021-09-26 09:46:43 · 80 阅读 · 0 评论 -
L3-002 特殊堆栈
题目链接思路:用multset维护两个堆l、r,l存前半段数字,r存后半段数字,当栈中数字个数为奇数l.size() == r.size,当栈中元素数为偶数时l.size() == r.size + 1,*(–l.end())即为中位数,注意:每次判断时都要先验证堆或栈中是否为空。代码:#include <bits/stdc++.h>#define fastio ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)#de原创 2021-09-18 20:02:07 · 229 阅读 · 0 评论 -
L2-040 哲哲打游戏
题目链接思路:简单模拟读懂题就会了。代码:#include <bits/stdc++.h>#define fastio ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)#define debug(a) cout << "debug : " << (#a) << " = " << a << endlusing namespace std;typedef原创 2021-09-17 10:48:19 · 117 阅读 · 0 评论 -
L3-001 凑零钱(dfs)
题目链接思路:开始数组a排好序,搜索是对数组a中每个数有 加/不加两种状态,先dfs加状态,再dfs不加状态这样就符合搜到的数组递增,当搜出第一个和为m的数组其排序也是所有符合条件数组中最小的,当已经输出了符合条件的数组后,后面的搜索全部剪枝return掉。还有个坑点就是所有货币加起来可能不够 m,所以该情况要特判输出No Solution。代码:#include <bits/stdc++.h>#define fastio ios::sync_with_stdio(false), c原创 2021-09-18 13:50:06 · 216 阅读 · 0 评论 -
L3-003 社交集群(并查集)
题目链接思路:并查集 + unordered_set先初始并查集f数组,再输入将每人的爱好id加入到各自的set集合中,从前往后遍历每个人为 i,再遍历 i 后面的人 j,若有与 i 相同的兴趣爱好的 j 则合并sz(维护并查集大小)和set(并查集所含爱好id)然后break。这里有个小优化:当某个元素 j 已经被前面的某个 i 合并过后,就可以不用再当 i 了,因为已经跟着前面的 i 去过后面一次了。当然这里是维护并查集大小,所以不能重复加入并查集,要判断f1 != f2,这里wa了一发。原创 2021-09-20 23:30:21 · 188 阅读 · 0 评论