- 博客(62)
- 收藏
- 关注
原创 H. The Boomsday Project
题意:租共享单车,每次r元,可以买卡,卡的有效期为d天,可用次数为k次,费用为c元,每次买新卡会覆盖旧卡,现有n种买卡的方案,m天需要骑车,其中这m天,第pi天需要骑车qi次。问最小费用。题解:关于第i天可能使用的骑车方案不是同一种,所以,干脆不要看每一天用哪一种方案了,而是每一次骑车用哪种方案。#include <algorithm>#include <deque>#include <iomanip>#include <iostream>#inc
2021-11-08 21:51:10
213
原创 2021CCPC华为云挑战赛 卷业务模型分析
卷业务模型分析题目链接写的时候根本没有想到是最小二乘法,把高中知识全忘了,害知道是最小二乘法后,那么|B[i]-(k*A[i]+b)|<=10,就可以等价于找到由A1与B ,A2与B所得到的两条直线的离差平方和最小的那个,直线方程位B[i]=k*A[i]+b,常数10说实话没用,因为有他没他都a了.图一图二求的是回归方程,图三是求的离差平方和。#include <algorithm>#include <deque>#include <iomanip&g
2021-08-21 17:22:43
278
原创 E. Polycarp and String Transformation
E. Polycarp and String Transformation题目链接首先这个题的字母的删除顺序可以先确定下来,最后删除的字母最后出现,倒二删除的字母倒二出现......然后可以根据删除字母的顺序找到原串,因为第一个删除的字母肯定是原串该字母的个数,第二个则是两倍,第三个则是三倍,以此类推,然后最后再按照题意模拟,看看最后可不可以得到初始串。#include <algorithm>#include <deque>#include <iomanip&g
2021-08-20 15:15:45
219
原创 [SDOI2009]HH的项链
题目链接个人感觉这是一道很精妙的写法,首先如果在线求的话不好求,那么考虑离线,离线的话,肯定要排序,那就得看按左端点排序还是按右端点排序,这里按右端点排序,至于为什么等下就知道了。我们要找的是区间内不同数的个数,因为按照右端点排序了,所以根据贪心的想法,如果一个数在一个一直往右扩张的区间中,出现多次那么我们只要算最右边的那个数的贡献就好了,所以我们找出每一个数的上一个数是多少然后使得该位置贡献-1(原来是1),然后现在这个位置+1然后算答案的时候是sum(a[i].r)-sum(a[i].l-1)
2021-08-20 11:09:22
66
原创 D2. Too Many Segments (hard version)
D2. Too Many Segments (hard version)题目链接这是一道贪心题目,每次枚举左端点,然后删除的话是离左端点最远的那个点,可以用set维护。#include <algorithm>#include <deque>#include <iomanip>#include <iostream>#include <map>#include <math.h>#include <queue>
2021-08-18 21:39:17
78
原创 2021“MINIEYE杯”中国大学生算法设计超级联赛(8)Counting Stars
Counting Stars官方题解是这样的题目类似于求根号的和,就是对于第一种操作每一个数最多减少lon(a[i])次,那么总体用线段树单点修改的话就只要修改n*lon(a[i])^2次,对于第二种操作,只对最高位有用,所以可以考虑开两个线段树来维护最高和除了最高位的其他数,最高位可以区间修改,最低为位单点修改。#include <algorithm>#include <deque>#include <iomanip>#include <iost
2021-08-12 21:42:23
101
原创 Codeforces Round #734 (Div. 3)
E. Fixed Points题目链接看完题解挺简单的一道dp题目题意:给你一个数组,每次可以删除一个数,让你求出删数的个数最少的次数,使得a[i]==i的个数大于等于k。题解:设dp[i][j]为前i个数保留j个数,然后如果第i数保留的话那么就得a[i]==j才能使得dp[i][j]更新(dp[i][j]=max(dp[i-1][j-1]+1,dp[i][j]),如果第i个数不保留的话,那么就是dp[i][j]=max(dp[i][j],max(dp[i-1][j-1],dp[i-1][j])
2021-07-25 10:46:54
83
原创 Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2)
E. Permutation Shift本题的题意是:你有种操作是让排列(原排列为1,2,3....n)循环,你循环k次则原来的排列变为a[(i-k+n)%n],例如k=2,就变成了n-1,n,1,2,3,....n-2。现在问你,给你一个排列b[n],让你找出从(1,2,3,...n)有多少种k,以及循环k次后最多可以任意交换两个数m次,使得这个排列变为b[n]。首先我们先找出b[n]中每一个数对应的循环多少次vis[(i-a[i]+m)%n],然后枚举每一种k的可能,因为m最多是n/3,所以最多
2021-07-23 11:32:54
75
原创 AcWing 276. I-区域
题目超链接题意中文题目没啥好说的首先得知道这是一个dp题,然后再求解,至于怎么知道,还是写题少,菜鸟的悲伤,呜呜呜。知道是dp后,接下来就是分析了,对于左边分析,肯定是先扩张,然后可能会缩减,而且一旦缩减就不会在扩张了,这样是吧为了保证图形是凸型,对于右边也是一样的,然后就是看怎么保证是扩张还是缩减了,那么就要知道前一行的某个状态的l到r的状态,然后在本状态再根据是扩张还是缩减来定义本状态的l和r的值。所以就有下面几个需要维护的:到第几行了,有多少个格子了,本状态的l,本状态的r,左边的扩张还是
2021-07-16 23:13:43
94
原创 Codeforces Round #731 (Div. 3) F
F. Array Stabilization (GCD version)本题大概题意是:给你一个数组,每次变换为a[i]=gcd(a[i],a[i+1]),而且是一个环状的,即a[n]=gcd(a[n],a[0]),每次操作遍历一遍数组,问经过多少次操作是得a[1]==a[2]==a[3]==....a[n].思路是:第一次操作后a[1]=gcd(a[1],a[2]),a[2]=gcd(a[2],a[3]),a[3]=gcd(a[3],a[4])...第二次操作后 a[1]=gcd(a[1],g
2021-07-15 15:09:18
112
原创 Codeforces Round #731 (Div. 3) G
G - How Many Paths?本题的题面意思大概是:如果一个点不可以从1开始到达那么输出0如果一个点可以从1到达且路径有且仅有一条输出1如果可以从1到达且有多条路径则输出2如果有无数条路径到达则输出-1本题需要注意的是存在自环大概思路肯定是优先找-1,因为-1其实很好找,就是找环,找环(强连通块)的方法有几种:拓扑排序,tarjan,拓扑排序应该也是可以做的吧,我看很多人都是用tarjan做的。找到环中的这些点后,由这些点扩张出来的点一定也是-1。然后就可以开始找1,2了,从
2021-07-15 11:24:02
78
原创 Codeforces Round #686 (Div. 3)F
题目链接这一题看完的唯一想法就是RMQ其他别无想法,但是仔细一想,如果是1到n中只放一个点然后来查找的话,然后要查找是否存在一个点为分界线使得左边的最小值等于右边的嘴大值时是满足单调性的,因为越往右移动最小值也越小,最大值也越小所以是满足单调性的,这里是中间有两个点,所以我们可以固定左边界,然后二分再查找是否有满足题意的点。不过二分的边界情况有点难搞,仔细理一下就好了。//#include<bits/stdc++.h>#include<iostream>#include<
2020-11-27 20:50:17
75
原创 牛客小白月赛29 D 种树
D 种树很久没来水博客了,来水一下博客这个题目一开始还不知道怎么写但是仔细想了一下我们用max次数越多,那么最后的结果就越大,而最后的结果显然和最多能取多少次最大值,还有想要取的那个数的深度有关,如果最大值的深度小于可以取最大值的次数,那么就能取到,如果最大值的深度小于可以取最大值的次数,那么最后的结果就是最多能取最大值值的深度的最大值和以及这之外的最小值的最大值取max;(其实就是找到一个想要的值当深度小于可以取max的的时候一直取max,其他取min,找到所有情况然后取所有情况的max)#i
2020-11-17 10:17:43
142
原创 2020 China Collegiate Programming Contest Qinhuangdao Site
比赛链接F. Friendly Group题意,给你n个点,m条边,求从中选k个点,这k个点被z条线连起来,求最大的z-k。首先如果加入一个点,那么这个值是不会变的,所以能加点就加点,然后每次边时如果这条变加不加都已经构成联通图了。那么就记录一下,最后求出所有(联通图的贡献-1)(因为并查集是构成圈时才开始加数)之和。#include<iostream>#include<stdio.h>#include<math.h>#include<string
2020-10-28 20:21:56
311
1
原创 《算法竞赛进阶指南》
91. 最短Hamilton路径 该题为状压dp,先说状态转移方程再解释dp[x][y]表示到达y这个点后状态为x的最小路程。那么设i为起点,j为起点i的状态,k为终点;那么转移方程为dp[j|(1<<k)][k]=min(dp[j|(1<<k)][k],dp[j][i]+a[i][k]);j|(1<<k)的意思是在起点的状态下转移到终点的状态那么此时到达的对应位置为k,所以是dp[k][j|(1<<k)],所以这里要判一下j时k这个位置是否走过,
2020-10-22 09:30:23
1389
原创 P1126 机器人搬重物
P1126 机器人搬重物这是一个比较坑的题目,虽然很容易写,但是容易踩坑,这个坑我也踩了一个晚上,刚刚在讨论区看见后恍然大悟,就是他走三步的时候可能越过墙,然后产生结果偏小,比如样例答案计算出来为6,解决这个问题后就很容易ac了。#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<string>#include<vecto
2020-10-06 21:04:31
143
原创 2020牛客国庆集训派对day1
ABB 本题意思就是求出添加最少的字母使得该字串成为回文字串,很明显的可以用马拉车算法,只是我一开始不会用马拉车算法,也不理解马拉车,然后就想着用kmp,发现还是不会,然后就花了一个小时学了马拉车,不是很懂,但是写这个题目还是绰绰有余的我学马拉车博客的链接正文:首先你要知道的是样例 murderforajarof 的回文字串是包含最后一个字母的,所以只要添加6个字母就好了,如果把这个样例改成 murderforajarofw后那么他的回文子串不包括最后一个字母,那么如果要变成回文字串就要加他的长度-
2020-10-02 20:58:02
211
原创 P2782 友好城市
P2782 友好城市1本题隐晦的说这个题目是一个最长上升子序列,先对南边或者北边排个序,然后再求最长上升子序列,我也不知道自己怎么想出来的,可能就是我最近一直在写dp有关的题目吧#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<string>#include<vector>#include<queue>
2020-09-29 20:18:09
79
原创 P1107 [BJWC2008]雷涛的小猫
P1107 [BJWC2008]雷涛的小猫这可能是我最近没看题解自己写的第一个简单dp问题吧这个题目我也不知道我当时怎么想的,看着看着就有了方向,一开始我是这样想的dp[i][j]表示到达第i颗树高度为j时的最优解,那么转移方程就是dp[i][j]=max(dp[i][j+1],dp[k][j+delate])+a[i][j](a[i][j]表示第i颗树高度为j有多少柿子),然后我就想是不是用单调队列优化,结果写不出来,又仔细的想了一下dp[i][j]我只要找到他高度为j+delate时的最大值就好了,
2020-09-29 17:23:56
128
原创 P1439 【模板】最长公共子序列
P1439 【模板】最长公共子序列这个题目我是没想到反正我感觉十分的神奇先写一下我在洛谷题解区看见的一个很好理解的题解对于样例 3 2 1 4 51 2 3 4 5我们可以把第一个数组编号位a b c d e。。那么第二个数组就变成了c b a d e现在对于第二个数组的最长上升子序列就是答案,因为首先每个数只出现一次,其次相对于abcde来说其就是一直上升的,所以对于第二个数组来说其上升的序列必然是第一个的子序列,所以说答案就是最长上升子序列。代码如下#include<iostr
2020-09-27 20:18:01
176
原创 P1404 平均数(二分)
P1404 平均数(二分)这是一个很常见的二分题目可能题目正解不是二分是单调队列,而这题呢 我之前一直被几组数组卡到怀疑人生,01数规划嘛就是让a[i]-mid,然后加起来如果>=0那么就满足条件,然后我就想着长度为m的一定是最大的,但是数据教我做人,等下看代码就知道了。#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<stri
2020-08-15 16:52:14
216
原创 Can you answer these queries? HDU - 4027(线段树)
Can you answer these queries? HDU - 4027本题是一个看起来像是区间修改的单点修改线段树,因为区间修改不好维护。这个也太难为我了,我想了想好像我不会这种题目,只能暴力求解了,但是问题来了,单点修改的话,绝对超时,但是我不信,写了一发,wa的很开心,然后就想怎么减枝,仔细想了想发现当一个区间的最大值小于等于1的时候就不用修改的,那就很舒服,因为每次是开根号,所以很快就会变成1或0了,时间复杂度是O(能过),值得注意的是x和y的大小是不确定的#include<i
2020-08-14 16:03:05
82
原创 Codeforces Round #664 (Div. 2) C
害,这个题目被hack掉了,真难受啊,害的我掉了60多分,菜鸡如我到现在还没有上蓝,我太菜了。这个题目的做法就是暴力枚举,首先得预处理出每个ai和每个bi&的值,然后就开始暴力枚举答案从0到(1<<9);如果满足题意就输出一定是最小的。为什么可以枚举呢?假设a|b=c那么c>=a&&c>=b,所以如果枚举的答案是k那么k|ci<=k#include<iostream>#include<stdio.h>#include&.
2020-08-14 14:18:53
100
原创 D - Denouncing Mafia Gym - 102346D(树形dp)
我还是不会写树形dp之类的题目,这个题还是不是自己写出来的看了题解,不过好在看了题解一下就会写了,也算是一种小小的提升吧。这道题求k条路经最多可以覆盖多少个点,这个的话最长的那条边肯定是要选的,选了最长的那条边之后,这个数就变成了一个森林了,那么现在就是再到这个森林里找最长的那条边,这种找法很容易就想到了优先队列维护,所以这个题的关键还是树形dp我们可以在dfs中也加上一个优先队列,每一次找到他的从儿子节点回溯回来之后加入优先队列,儿子全部遍历完之后,再把最长的那条链赋值给这个点,剩余的优先队列里的值减.
2020-08-13 20:11:00
150
原创 Mayor‘s posters POJ - 2528
Mayor’s posters POJ - 2528这是一个线段树的题目,不过要离散化,而离散化是一个板子,但是这个离散化和之前的离散化有点不一样,这个离散化后还要处理离散化后的结果,我就不解释了,直接上大佬们的链接,反正我也是看他们的代码打的,我化石太菜了,每天自己再打一遍,不看别人的代码再打一遍,看看还能不能打出来。大佬的题解链接下面是本菜鸡的菜鸡程序,几乎照着大佬的代码打的我离散化的板子,感觉挺好用的vector<int>v;int getid(int x){ r
2020-08-12 21:54:49
96
原创 P4017 最大食物链计数(简单的树形dp)
P4017 最大食物链计数由于数据不存在环,所以一定能找到食物链的起点,那么就可以由食物链的起点记忆化搜索直到终点然后返回1,说明有一条食物链,然后就没了,具体看代码理解吧#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<string>#include<vector>#include<queue>#
2020-08-12 20:01:22
291
原创 背包dp加路径搜索
P1759 通天之潜水首先不难看出这是一道背包dp加路径搜索,只是不知道怎么求而已,背包dp比较好求,和以前做的背包dp差不多,只是由一个限制条件变成了两个而已,那么我们就可以直接三重for求解,路径搜索的话,我从大佬那里学到了一种新的求解方法,用string 记录路径,这也太强了,这个直接看代码吧#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#incl
2020-08-12 17:30:41
145
原创 E 地、颜色、魔法
题目戳我本题开字符串数组肯定开不出二维的,所以考虑开一个vector数组存,1表示.,0表示#,然后就是dfs了,因为是其他点到边界,然后如果我们枚举其他点到边界的话绝对要超时,所以要转变思想。从边界枚举出去,然后如果这个点可达那么他的ve[x][y]++;这样时间复杂度就降下来了,但是还是不够的,那么现在就要减枝叶了,如果ve[x][y]>1的话说明已经有边界可达了,那么就直接return ,如果该点是#也就是说ve[x][y]==0,那么也continue;在这里插入代码片#include
2020-08-11 21:53:30
104
原创 Food Delivery ZOJ - 3469(区间dp)
害,一道简单简单题居然搞了我一下午,我还是改不了不喜欢动笔的毛病,天天就想着能看出答案,我太难了,这个毛病一定要改,一直看着题目思维贼混乱,一混乱就不想写题目。这题的题意也很有意思v是代表的是走1m所需要的时间现在来解释一下这个区间dp的题,首先你得对坐标从小到大排个序吧?排序的时候得把餐厅加进去,套路,然后很容易想到的是dp[i][j]从i到j,但是转移的时候又不好转移了,因为dp[i][j]你不知道是从i+1转移来的,还是从j-1转移来的,所有就要考虑加一维数组了,dp[i][j][0/1],dp.
2020-08-10 20:38:05
117
原创 F - Ants CodeForces - 318D
题目戳我早训的cf题目,当时一直没写出来但是知道怎么写一直调不出来就很烦,因为可能是负数,所以我们把(0,0)变成(1000,1000)结合题目给定的蚂蚁数量就再也不可能有负数出现了,先bfs预处理出所有蚂蚁的位置就很舒服了,可是细节不到位,写撮了。#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<string>#includ
2020-08-07 14:21:07
883
原创 疯狂刷dp中
数字游戏这是一个很好的区间dp题,个人感觉,容易想到,但是不容易写出来,边界处理很强,预处理出,前缀和,最小值需要初始化,破坏环成为两倍的大小的数组,细节很多。#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<string>#include<vector>#include<queue>#include&
2020-08-07 09:48:58
147
原创 P1020 导弹拦截
题目链接第一问求的是最长不下降子序列,第二问求的是最长上升子序列,o(nlogn)可以求出,其实第二问为什么是最长上升我自己也有点懵逼,只是之前写过一个类似的题才知道的。#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<string>#include<vector>#include<queue>#inc
2020-08-06 15:46:50
80
原创 P2766 最长不下降子序列问题
题目链接本题的第一问贼好求,第二问看了题解后也好求,第三问就有点坑了,写了半天还是错的一直wa,后来发现是没有考虑最长不下降子序列是1的情况,我也是醉了,第一问不说,第二问网络流,把长度为1的dp值放在左边,dp值为len的放在右边,中间的线段按照dp值放#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<string>#inc
2020-08-05 22:04:48
158
原创 The Tower of Babylon UVA - 437
题目链接很经典的一个转化题目,我感觉这种转化成求图的最长路径的操作是真的骚,#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<string>#include<vector>#include<queue>#include<algorithm>#include<deque>#
2020-08-05 19:38:49
92
原创 P2770 航空路线问题
题目戳我本题有一个套路,就是来回一个圈从a到b在到c可以看成从a到b和c,因为这题是网络流所以考虑建图,像这种网络流建图一个点只能通过一次的图,一般情况下都是要拆点的.然后拆点后就要考虑边的容量和cost的分布了,边的容量那么终点和起点都是2其他都是1,cost都为1,因为都是一个点,最后答案再减去2以为起点和终点都经过了两次。如果最后求得的流量是2,说明有两条路径,如果是1的话可能存在1直接到n这种情况,特判一下就好了,其余的都无法到达,具体看代码吧。#include<iostream>
2020-08-05 16:37:10
664
原创 购物
题目戳我每天至少要吃一颗糖,一天买k个糖的花费为糖的钱加上k*k,可储存,问最少需要多少钱.首先要想到是dp,我也没想到,惭愧啊,然后就是dp的注意事项了,一共有n天那么最少花费一定是n天吃了n个糖。由这两个状态可以得到dp方程的形式为这样dp[i][j]到第i天一共买了j个糖(i<=j)因为每天要吃一个;#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>
2020-08-05 14:47:16
142
原创 P2426 删数
题目链接好久没有来水博客了,来水一道区间dp吧。这道题应该不难看出是区间dp,而且很简单,所以我就拿来水一篇博客.#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<string>#include<vector>#include<queue>#include<algorithm>#inc
2020-08-02 11:34:08
185
原创 P1537 弹珠(多重背包问题)
很简单的一个题,只是我最近很少自己写出来过题。自己写出了个dp题很爽,所以写篇博客。就贴个代码算了,明天还有大事#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<string>#include<vector>#include<queue>#include<algorithm>#incl.
2020-07-30 20:38:57
204
原创 Network UVA - 315
题目戳我本题就是一个求割点的裸题,是割点需要两个条件之一1.如果是根节点那么他的儿子节点要大于等于二2.如果不是根节点,那么先假设他的父亲节点是v,本身是i,那么low[i]>=dfn[v];当然如果是桥的话low[i]>dfn[v];#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<string>#incl
2020-07-29 11:41:58
113
原创 P1412 经营与开发(多重背包二进制写法,单调队列待补)
题目戳我为什么可以用二进制写这种题呢?因为二进制可以表示任何一个数。先给一个二级制拆分的模板 for(int i=1;i<=n;i++) { for(int j=1;j<=a[i].m;j<<=1)//j表示这次拆分的个数 { a[i].m-=j;//减去拆了的数量 b[++tot].v=j*a[i].v;//重新分配后新物品的价值 b[tot].w=j*a[i
2020-07-29 11:29:21
112
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人