
刷题-题解
在各大oj网站上刷的题
Shanhj
无
展开
-
HDU1561 树形背包dp+边界优化 0ms过题
主要介绍了如何优化,没有涉及题解原创 2022-07-30 10:19:33 · 320 阅读 · 1 评论 -
凑零钱(动态规划)
题面:韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。原创 2022-07-06 17:19:55 · 561 阅读 · 0 评论 -
森森美图(计算几何+限界最短路径)
PTA上森森美图这道题的做法以及一点计算几何的知识原创 2022-07-06 15:13:12 · 404 阅读 · 0 评论 -
POJ2019 二维ST表
题目要我们求一个块内的最值,可以把块分成多行,每行求一次RMQ即可,因此也要对每一行建一个ST表。#include <algorithm>#include <cmath>#include <cstdio>#define fre(f) freopen(f ".in", "r", stdin), freopen(f ".out", "w", stdout)#define inf 0x3f3f3f3fconst int N = 255;using namespac原创 2022-03-05 17:21:40 · 358 阅读 · 0 评论 -
POJ3368 Frequent values ST表 优化查询
这题问的是给定一个区间,给出这个区间中出现最频繁的那个数的出现次数,并且给定的是一个升序序列。在用ST表预处理时会遇到一个问题,如果一个区间中出现次数最多的数位于两侧该怎么办?解决方法是将一个查询区间的左侧相同的数全部单独计算,然后取剩余区间的RMQ即可。为了正确的查询,F[i][0]保存的是a[i]在[0,i]区间里出现的次数。AC代码的思路是按照书上来写的,但是在一些极限的数据下还是容易超时,比如所有的数字都是一样的,那么每次统计a[l]出现的次数时都要将此区间完整的遍历一遍,查询复杂度为O(n)。原创 2022-03-05 16:36:19 · 279 阅读 · 0 评论 -
POJ3264 Balanced Lineup ST表简单应用
创建两个ST表,分别保存区间最大值和最小值,对于每次查询,找出最大值和最小值相减即可。这题时间卡得比较死,如果写得不好可能还会TLE#include <algorithm>#include <cmath>#include <cstdio>const int N = 5e4 + 5;using namespace std;int n, m;int h[N], lg2[N], p2[20], stmax[N][20], stmin[N][20];void原创 2022-03-05 14:57:09 · 146 阅读 · 0 评论 -
POJ2431-Expedition 题解 优先队列
对于卡车可以到达的最远距离,我们将沿途的所有加油站都入队,只要是能够到达的加油站,只要选择加油量最大的那个即可,与加油站的位置无关。每次加完油后将沿途能够经过的新的加油站入队,如何再从中选择一个加油量最大的,不断重复直到可以到达终点。#include <algorithm>#include <cstdio>#include <queue>#include <vector>using namespace std;struct node{ i原创 2022-03-03 16:37:29 · 195 阅读 · 0 评论 -
POJ3253 Fence Repair 题解 贪心+优先队列
锯木头的花费取决于要锯的那段木头的长度,为了将花费控制到最小,我们自然会想到每次锯的时候尽量让锯出来中较长的一段木头的长度尽可能的短一点,换句话说也就是让锯出来的两段木头的长度尽可能的接近。题目给的是最终每段木头的长度,反过来想,也就是将木头拼回去,每次花费是两段木头的长度和。那么按照锯木头时的想法,每次拼木头的时候要找两段长度尽可能接近的木头进行拼合,也就是找出最短的两段木头。所以只要用一个优先队列来维护最短的木头长度即可。我们可以发现,这种做法和哈夫曼树的构造有着惊人的相似之处。其实这道题就是哈夫曼原创 2022-03-03 15:06:31 · 277 阅读 · 0 评论 -
POJ1182-食物链,POJ1703-Find them, Catch them 题解
如果只是用普通的并查集,表示两个动物是同类的时候还比较容易,但是对于x吃y这种情况就有点困难。因为并查集是把同类归到一起,对于不同类的处理就没那么容易了,那么我们不妨思考怎么把x吃y的这种情况转化成类似a和b是同类的情况?思路:x和y虽然不是同类,但是x吃的类和y是同类,y吃的类和吃x的类也是同类,那么我们就可以将x加上n 表示被x吃的类 x加上2n表示吃x的类,对于y同样处理。那么对于x吃y这种关系我们就可以这么表示:f[x+n]=f[y] f[x+2n] = f[y+n] f[x]=f[y+2n]原创 2022-03-03 14:33:54 · 134 阅读 · 0 评论 -
POJ1988-Cube Stacking 题解
用到了并查集的一道题目用 dis 数组来记录一个一个点到堆顶的距离,sz 数组来记录一个堆有多少个点,那么某个点下方的点数为 sz[fx]-dis[x]这样看起来还是要做很多步,比如每次合并的时候下面的堆所有的点的 dis 都要更新,复杂度可能会到O(n*n),其实利用并查集的特性,我们可以只在询问到这个点的时候更新,这样就可以大大减少更新所花的时间了。为了后续查询的时候能正确更新,每次合并只需将下方堆顶到上方堆顶的距离更新即可。// Cube Stacking#include <iostre原创 2022-03-03 13:43:07 · 429 阅读 · 0 评论 -
POJ-1011 Sticks 一道经典的剪枝题
记录了三处比较重要的剪枝原创 2022-02-23 15:35:15 · 519 阅读 · 0 评论 -
Constructing Roads 最小生成树 消除已经建过的路的影响
为了消除已经建过的路对结果的影响,将没有路的长度设置为-1,已经建过路的村庄之间的路长度为0原创 2022-02-20 17:07:45 · 474 阅读 · 0 评论 -
Minimax Triangulation-uva1331 紫书P280计算几何动规
vjudge上的题目链接首先要明确为什么是用动态规划解这道题?在分割多边形的题目中动规是一种比较常见的做法,本题的多边形经分割后的多边形显然还是一样的子问题,并且子问题的状态表示较为容易。怎么写状态转移方程?将输入的点人为地从1开始进行编号,dp[i][j] 表示点 i~j 形成的多边形的最佳分割结果。这种dp的表示方式有一个需要解释的点:如果多边形的点不是连续的该怎么办?比如由点1、3、5、7构成的多边形。其实不用管这种情况,因为在计算由点1、2、3、4、5构成的多边形的时候会计算到1、3、5原创 2021-09-06 17:47:15 · 115 阅读 · 0 评论 -
紫书P269-uva1347题解,结合紫书解析加入了一些个人理解
在紫书的动态规划那一节看到了这道题。结合刘汝佳的解析,在代码里加了一些个人的理解,已经提交UVA通过。//将问题看做两个人从起点出发,不能走重复的点,计算两个人到达终点时走过的距离和#include <bits/stdc++.h>#define mem(a, b) memset(a, b, sizeof(a))#define scf(a) scanf("%d", &a)#define scf2(a, b) scanf("%d%d", &a, &b)using原创 2021-07-28 17:43:05 · 119 阅读 · 0 评论 -
Brackets sequence-uva1626 紫书P278 较复杂动规
首先要明确为什么是用动态规划解这道题?这个问题是否可以分成更小的子问题?答案是显然的。只要两个字串互不干扰即可,比如样例的 ([(] 就可以分为 ( 和 [(] 两个子问题,而 [(] 又等价于 ( ,因此找出子问题的最优解就可向上递推最佳结果。符合了动规的两大基本特点:分裂成子问题,寻找子问题的最优解。因此本题是可以用动规来解的。此外动规的复杂度一般在O(n^3),因此对于数据规模也有一定的要求,本题最多输入100个符号,可以保证不会超时。解决了能不能用动规的问题后就是怎么写状态转移方程?dp[i原创 2021-09-05 16:07:15 · 83 阅读 · 0 评论 -
Cutting Sticks-uva10003 紫书P278 动态规划+四边形不等式优化
个人认为动态规划的难点有两个:什么时候能用动态规划?状态转移方程怎么写?首先要明确为什么是用动态规划解这道题?分析这道题:当我们把木棒从某点切割时,还要继续切割剩下的两段木棒。我们当然希望剩下的两段木棒在切割时花费是最少的,那么在继续切割的时候我们仍然希望新切割出来的木棒是花费最少的,那么在切割大段木棒的时候会用到小段木棒的切割结果,也就是说我们需要先确定小段木棒的最佳结果来推出大段木棒的最佳结果,这里就用到了动规的思想。解决了能不能用动规的问题后就是怎么写状态转移方程?如图,将左右端点人为地定义原创 2021-09-04 14:37:49 · 135 阅读 · 0 评论 -
POJ2749 2-SAT+二分
题目链接一个谷仓要么连S1,要么连S2,很显然是2-SAT问题。建边:先把hate和friend关系的边建好。然后枚举一个最远距离k,比较每个谷仓与其他谷仓的距离(两个谷仓分别连接S1S1,S1S2,S2S1,S2S2四种情况),如果超过了k就建边。AC代码://AC 625MS//2021/10/09#include <cmath>#include <cstdio>#include <cstring>#include <vector>原创 2021-10-10 13:19:19 · 121 阅读 · 0 评论 -
POJ2723 2-SAT+二分
一对钥匙里面二选一,又是一个很明显的2-SAT问题特征。分点:一把钥匙根据选不选分为两点,n把钥匙就是2n个点建边:首先根据给定的钥匙进行建边,选了其中一个另一个就不能选。然后二分,枚举通过门的数量k,建边建到第k个门过,门上的钥匙必须要有一把,因此建边的根据是一个钥匙不选那么另一个就一定要选。AC代码由于前面两道例题的模板和这个一样,注释就不写了,如有疑问请参考 2-SAT简介//AC 64MS//2021/10/09#include <iostream>#include原创 2021-10-09 16:50:57 · 113 阅读 · 0 评论 -
POJ2296题解 2-SAT+二分
题目链接每个城市都要在lable边的中点处,且lable要么朝下,要么朝上,很明显的2-SAT问题特征。因为每个lable的边长都要相同,且范围给定,因此可以用二分进行枚举。分点i2表示i城市的lable朝下,i2+1表示i城市的lable朝上,一共2n个点建边根据枚举的lable长度length,有三种情况:前提是两个城市的x相差小于length,不然怎么都不会影响1.两个城市的y相同,那么必须是一上一下2.两个城市的y相差小于length,必须是下面的城市朝下,上面的城市朝上3.两个城原创 2021-10-09 16:43:42 · 138 阅读 · 0 评论 -
POJ3648 2-SAT基础
题目链接题目有两个限制条件:1.一对夫妻不能坐在同一边2.有奸情的两人不能坐在新娘对面(但是可以坐在新娘的同侧)分点:有n对夫妻,那就有2n个人,每个人坐在左侧还是右侧又可以分为两种情况,一共是4n个点。i2+1表示第i对的丈夫,i2表示第i对的妻子,在此基础上*2表示在左,*2+1表示在右。建边首先对所有的夫妻根据限制1建边,然后根据输入的奸情信息进行限制2的建边。然后判断有没有矛盾即可。AC代码//AC//2021/10/07#include <iostream>#i原创 2021-10-09 16:29:31 · 111 阅读 · 0 评论 -
A Busiest Computing Nodes 线段树+二分法
题目大意:第一行给两个数n,m,表示有n个结点(编号为0,1,2,…)和m个任务。接下来i行(i=0,1,2,…,m-1)每行给出两个数,分别为任务的开始时间和持续时间。原创 2021-09-21 17:40:15 · 172 阅读 · 0 评论 -
UVa-11992 Fast Matrix Operations 快速矩阵运算
题目链接因为矩阵最多就20行,所以可以建立多棵线段树。对于标记set和add要注意优先级。//Time:309ms#include <bits/stdc++.h>#define fre freopen("in.txt", "r", stdin)#define MAXN 500005#define inf 0x3f3f3f3fusing namespace std;int row, column, q;struct node{ int l, r; int su原创 2021-09-10 21:08:44 · 125 阅读 · 0 评论 -
Complete Binary Search Tree(浙大数据结构课后练习题,完全二叉搜索树,层序遍历)
Input Specification:Each input file contains one test case. For each case, the first line contains a positive integer N (≤1000). Then N distinct non-negative integer keys are given in the next line. All the numbers in a line are separated by a space and a原创 2021-07-21 17:56:38 · 152 阅读 · 0 评论 -
PTA-那就别担心了
输入格式:输入首先在一行中给出两个正整数 N(1<N≤500)和 M,分别为命题个数和推理个数。这里我们假设命题从 1 到 N 编号。接下来 M 行,每行给出一对命题之间的推理关系,即两个命题的编号 S1 S2,表示可以从 S1 推出 S2。题目保证任意两命题之间只存在最多一种推理关系,且任一命题不能循环自证(即从该命题出发推出该命题自己)。最后一行给出待检验的两个命题的编号 A B。输出格式:在一行中首先输出从 A 到 B 有多少种不同的推理路径,然后输出 Yes 如果推理是“逻辑自洽”的原创 2021-08-06 16:34:51 · 1105 阅读 · 1 评论 -
PTA插入排序还是归并排序
一开始想着把插入排序和归并排序产生的所有序列都保存下来,然后将给定的序列与其进行比较,找到相同的中间序列,然后输出下一个序列,但是提交一直错误,也不知道哪里有问题。看了其他人的做法,只能换了一种直接进行判断的方法。插入排序的特点是前面是有序的,后面的序列和原序列保持不变,而归并排序会改变所有位置的序列,所以可以先根据插入排序的特点进行判断,找到非有序序列的第一个位置,然后与原序列进行比较,如果剩下的序列都是一样的,那就是插入排序,否则就是归并排序。如果是归并排序,首先要找出小序列的长度,然后再进行下一步原创 2021-08-07 14:56:42 · 982 阅读 · 0 评论 -
LA3938 Ray, Pass me the dishes! 线段树前后缀和
题目链接这题的线段树结点要存储的信息有:最大前缀和-pre、最大连续和-max、最大后缀和-suf、区间和-sum、区间左端点-l、区间右端点-r。首先是建树对于结点node[n],前缀和的伪代码为:node[n].pre = max(node[left_son].pre, node[left_son].sum + node[right_son].pre);在左子树的前缀和,左子树的区间和加上右子树的前缀和中取最大的。后缀和的做法相同。对于最大连续和,伪代码为:node[n].max = m原创 2021-09-09 17:56:26 · 128 阅读 · 0 评论 -
UVa 1235 Frequent values
题目链接大致意思就是给定一个非降序的序列,查询某个区间中出现最多的数字的出现次数。分析:既然是非降序的序列,那么相同的数字会出现在一起,所以直接记录相同的一段的起始和结束位置,比如一个序列:-1,-1,1,1,1,2,2,2可以用[1,2] [3,5] [6,8] 来记录,表示这三个区间的数字是一样的,区间长度就代表了数字出现的次数。查询的时候先判断查询区间的左右端点位于哪一个区间,因此需要再定义一个数组pos来记录某个位置的数字属于哪个区间,pos[i]=j表示位置i是在第j个区间。对于一个查询原创 2021-09-09 15:54:35 · 144 阅读 · 0 评论 -
PTA森森快递 线段树维护区间最小值+贪心
参考了一下这位博主的文章,自己在此基础上稍做了修改大概思路体现在代码注释中了//贪心加线段树,每次选择订单都将订单所经过路上的最小重量作为运输重量//选择重量后将所涉及的区间做lazy标记,减去相应的重量//并且优先选择区间小的,保证结果的和最大#include <bits/stdc++.h>#define inf 0x3f3f3f3f3fusing namespace std;typedef long long ll;inline void scf(int &a) {原创 2021-08-09 15:52:00 · 401 阅读 · 0 评论 -
百练oj:最佳加法表达式,超过了long long范围,用自定义Bigint类解决
题目链接:http://cxsjsxmooc.openjudge.cn/2021t2summer/014/按照老师的思路写了代码,思路详见代码注释#include <bits/stdc++.h>#define mem(a, n) memset(a, n, sizeof(a))#define max_len 52 //bigint类中最多储存位数+1using namespace std;//只支持正数和加法操作class bigint{private: //数字采用右对原创 2021-07-17 15:12:56 · 420 阅读 · 0 评论 -
Palindrome Pairs(回文字符串统计)
After learning a lot about space exploration, a little girl named Ana wants to change the subject.Ana is a girl who loves palindromes (string that can be read the same backwards as forward). She has learned how to check for a given string whether it’s a p原创 2021-07-19 20:14:32 · 367 阅读 · 0 评论 -
HDU万进制算大数阶乘
题目描述:给定一个数,输入这个数的阶乘,n的范围为0~9999直接算肯定不行,模拟乘法的话可以试试,但是还有一种更方便的办法就是用万进制。既然是万进制,那么就要有一万个符号来表示一个位的大小,一位字符表示一个符号显然是不够用的,因此用字符串表示符号(但是在存储的时候还是用数字),0000表示0,0001表示1…9999表示9999,与数字相比只是0的个数不同。使用万进制算这题的阶乘有个好处就是较小的乘数只有一位(因为小于一万),那么在模拟乘法的时候就比较方便了。举个例子:将100101100转化为万原创 2021-07-19 18:12:15 · 141 阅读 · 0 评论 -
HDU1497(Simple Library Management System) 用类来实现
Problem DescriptionAfter AC all the hardest problems in the world , the ACboy 8006 now has nothing to do . One day he goes to an old library to find a part-time job .It is also a big library which has N books and M users.The user’s id is from 1 to M , and原创 2021-05-30 15:47:45 · 112 阅读 · 0 评论 -
Cup(HDU2289) 二分法
Problem DescriptionThe WHU ACM Team has a big cup, with which every member drinks water. Now, we know the volume of the water in the cup, can you tell us it height?The radius of the cup’s top and bottom circle is known, the cup’s height is also known.In原创 2021-05-29 14:07:53 · 190 阅读 · 0 评论 -
Rightmost Digit(HDU1061) 两种方法 快速幂、打表
Problem DescriptionGiven a positive integer N, you should output the most right digit of N^N.InputThe input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.Each test原创 2021-05-29 13:36:25 · 327 阅读 · 0 评论 -
Find a way(HDU2612) 两次BFS
Problem DescriptionPass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year, yifenfei have many people to meet. Especially a good friend Merceki.Yifenfei’s home is at the countryside, but Merceki’s home is in t原创 2021-05-26 23:25:51 · 78 阅读 · 0 评论 -
More is better(HDU1856) 简单并查集
Problem DescriptionMr Wang wants some boys to help him with a project. Because the project is rather complex, the more boys come, the better it will be. Of course there are certain requirements.Mr Wang selected a room big enough to hold the boys. The boy原创 2021-05-25 21:57:29 · 105 阅读 · 0 评论 -
Beat(HDU2614) DFS+回溯
Problem DescriptionZty is a man that always full of enthusiasm. He wants to solve every kind of difficulty ACM problem in the world. And he has a habit that he does not like to solvea problem that is easy than problem he had solved. Now yifenfei give him原创 2021-05-25 17:16:45 · 111 阅读 · 0 评论 -
免费馅饼(HDU1176) 背包问题
Problem Description都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了,所以gameboy马上卸下身上的背包去接。但由于小径两侧都不能站人,所以他只能在小径上接。由于gameboy平时老呆在房间里玩游戏,虽然在游戏中是个身手敏捷的高手,但在现实中运动神经特别迟钝,每秒种只有在移动不超过一米的范围内接住坠落的馅饼。现在给这条小径如图标原创 2021-05-24 23:56:51 · 79 阅读 · 0 评论 -
拨钟问题(三重循环枚举)
描述有9个时钟,排成一个3*3的矩阵。现在需要用最少的移动,将9个时钟的指针都拨到12点的位置。共允许有9种不同的移动。如下表所示,每个移动会将若干个时钟的指针沿顺时针方向拨动90度。输入9个整数,表示各时钟指针的起始位置,相邻两个整数之间用单个空格隔开。其中,0=12点、1=3点、2=6点、3=9点。输出输出一个最短的移动序列,使得9个时钟的指针都指向12点。按照移动的序号从小到大输出结果。相邻两个整数之间用单个空格隔开。样例输入3 3 02 2 22 1 2样例输出4 5 8原创 2021-05-22 21:06:09 · 3007 阅读 · 1 评论 -
HDU5248(序列变换)二分法加贪心
Problem Description给定序列A={A1,A2,…,An}, 要求改变序列A中的某些元素,形成一个严格单调的序列B(严格单调的定义为:Bi<Bi+1,1≤i<N)。我们定义从序列A到序列B变换的代价为cost(A,B)=max(|Ai−Bi|)(1≤i≤N)。请求出满足条件的最小代价。注意,每个元素在变换前后都是整数。Input第一行为测试的组数T(1≤T≤10).对于每一组:第一行为序列A的长度N(1≤N≤105),第二行包含N个数,A1,A2,…,An.序列原创 2021-05-22 20:38:30 · 302 阅读 · 1 评论