自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(80)
  • 收藏
  • 关注

原创 次小生成树

**解题报告:**这还是个定理吧,就是说我们可以删掉最小生成树的一条树边,然后加上该点的树边,就能形成一个生成树,(如上图p2,绿色的边是两个点之间的最长树边,我们可以把他删掉,加上蓝色的边,这样并不影响它的连通性,所以他还是生成树)那么就一定有他的值是sum-l+w,为了让这个值最小并且比sum大,sum指的是最小生成树所有和,那么一定要找到a,b之间的最大树边(a,b指的是w边的两个顶点),...

2020-04-29 22:54:19 443

原创 AcWing 346. 走廊泼水节

解题报告:这题一开始没看懂,其实意思挺简单的,当然是看了题解以后 还挺容易的,主要是让你把一个树形图,变成一个完全图,(完全图就是边长数量=(n*(n-1)/2)n为点数),同时满足之前的那棵树还是唯一的最小生成树,通过图我们可以发现,在合并两个集合的时候,如果枚举的边小于等于该条边的长度w,是不行的,不满足唯一生成树,这样我们每次只需要加上(pq-1)(w+1)就是正解了,pq分别代表两个集...

2020-04-29 20:56:08 324

原创 1145. 北极通讯网络

网站解题报告:这道题实质上是在问满足存在k个连通块的最小d是多少。然而并不用二分,因为在kruskal算法的过程中本身联通块的数目就是递减的,从一开始的n到k然后记录最小值就能ac这道题了。#include<iostream>#include<cstring>#include<algorithm>#include<cmath>using ...

2020-04-29 19:41:13 259

原创 1143, 联络员

解题报告:应该把要选的都给选上,然后在从小到大选边。#include<bits/stdc++.h>const int N=31000;using namespace std;struct node{ int p; int a; int b; int c;}q[N];int p[N];int find(int x){ if(x...

2020-04-29 18:02:22 250

原创 最小生成树,所有连通边的最大值

我唯一想说的是:我卢本伟没有开挂 ,第二句话是个废话,让一个树连通,边的数量是定制n-1(n为点数)。#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<map>#includ...

2020-04-29 17:45:33 377

原创 (算法进阶指南)102. 最佳牛围栏(最大平均数)

解题报告:二分平均值,由于他限定要不小于l长度的平均值,我们可以用个数组记录a[i]减去二分的平均值,如果最大的连续子序列长度大于等于0就l=mid ,由于是浮点数,eps设置为保留位数+2就行了,这题就是5.同时最后要乘以1000,l和r都是满足题意的,因为是最大值用r来*1000下取整就行了,接下来要找最大长度大于等于连续子序列的和,可以i从l开始循环,记录一下i-l前缀和和min,最后每次...

2020-04-28 21:48:21 489

原创 113. 特殊排序

第一次做交互题,这种题只需要写一个函数就行了,返回要返回的,我们可以假设前面也排好序了,因为是单调递增的,我们可以二分出来要插入数的位置,二分出比他小的数的位置,然后从后面往前面依次交换放到该位置后面就行了,特判一下如果没有比他小的数,那就把它放到最前面。// Forward declaration of compare API.// bool compare(int a, int b);...

2020-04-28 21:43:20 309

原创 差分 100. 增减序列

只要满足从2开始到n的差分数组d为0就行了,总共有四种操作,其中第四种是无效的,第一种最有效,我们尽量去去选一正一负的来操作,这样可以消掉两个第二第三种做法只能消掉一个,那么我们算出正数差分总和,和负数差分的总和,两个的max就是操作的数量,然后最后有多少种结果呢,就是最大值-最小值+1,因为d1 可以从 0~max(p,q)-min(p,q)...

2020-04-28 21:39:14 345

原创 递归,找规律,坐标变换(算法进阶指南)

sqrt返回的是float形的所以不能用%lf输出(wa警告),仔细观察可以发现,该图可以转换为4个部分,其中第二个和第三个部分坐标变换是不变的,第一个是关于对角线对称,第四个是关于斜对角线对称,如果递归到了第0层就返回坐标{0,0},我们假设坐标是从0开始的,编号也是,所以递归的时候a-1,b-1,当递归到下一层的时候,当前的编号可不是下一层的编号,要模上四分之一改成所有的编号数(1<&...

2020-04-28 21:35:02 318

原创 字符串配对 qdu蓝桥训练

`#include#include#include#include#include#include#include#include#include#define IL inline#define x first#define y secondtypedef long long ll;using namespace std;char s[10010];int main(...

2020-04-28 20:31:00 223

原创 spfa判断负环+01分数规划

解题报告:二分他们的商值,把每条边变成t[i]-mid*w[i],然后看是否存在正环。#include<bits/stdc++.h>using namespace std;const int N= 1010 ,M=5010;int h[N],idx,e[M],ne[M];double t[N],w[M]; int n,m; int q[N]; double dis...

2020-04-28 14:12:26 275

原创 1165. 单词环

解题报告:这题可以用spfa判断正环的做法+二分来做,我们二分他的环的平均长度,看看能不能凑成环,如果暴力去把每个字符串变成一个点,总共会有1e5的点,可以优化一下,把整个字符串变成一条边,把前两个和后两个的单词字母映射成一个点,总共26*26个点,如果朴素去做会tle,那么要加个玄学优化,如果更新次数太多的话(十几倍左右)就暂且认为他是一个环,然后stl的queue太慢了,要用数组来模拟队列...

2020-04-28 12:53:05 256

原创 1131. 拯救大兵瑞恩

解题思路:题目大意是要到一个位置,但是图中会有对应的门,而且门的种类不同,需要不同种钥匙来打开,不同种的钥匙分别放在地图中的某个位置,问最多要多少步才能到。这道题的解题思路也是非常的取巧,他并没有告诉你每个点之间的边,这个需要我们去构造,并且还有墙,墙是不可逾越的,那么我们需要用一个set来维护两条边之间是否存在墙或者门,我们初始的dist一维数组是肯定不够的,要开第二个状态[j],这里的状态应...

2020-04-28 11:20:04 307

原创 单源最短路扩展:创建虚拟源点

解题思路:题目大致意思是求在题目给出的点中离s最近的距离,其实我们可以创建一个虚拟源点让各个点到他的路径是0,spfa 0 就行了。#include<bits/stdc++.h>using namespace std;const int N=1010,M = 50010;int e[M],h[N],idx,ne[M],w[M];int dist[N];bool st[N...

2020-04-28 11:05:23 380

原创 三分

解题报告:初学三分,大致思想其实和二分差不多,只不过二分区间是有严格单调的性质的,但是三分的话只能求类似二次函数一样的最值,思路就是把整个区间分为三段,然后比较三分之一点和三分之二点的顶点函数值的大小,然后求最小值,就往小的地方逼近。#include<iostream>#include<algorithm>#include<cstdio>#includ...

2020-04-28 10:53:54 206

原创 最长不递减子序列

解题报告:哎。。。我蒟蒻啊,这都没看出来,我以为是线段树的题,结果是dp题,就是算出最长非降序子序列的长度len,然后n-len就行了。#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include&lt...

2020-04-28 10:50:18 262

原创 矩阵快速幂

解题思路:原来是这么构造的,之前想了一个晚上都没有想明白,,哎。。。数组不开long long 也会wa哦#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<map>#inc...

2020-04-28 10:47:47 205

原创 E2. Three Blocks Palindrome (hard version)

解题报告:写这种题还是暴力香,虽然我也没有想到,现在懂了,然后二维前缀和可以不用memset,就因为这个tle的,这题做法就是维护前缀和(每个数在某段区间出现的个数)因为总共就200个数,然后把各个数的位置push进vector,每次对称着取两个位置加上中间的前缀和之差不断更新ans,就能解决这题啦!#include<iostream>#include<algorithm&...

2020-04-26 20:43:55 436

原创 数位dp 数位和

#include<iostream>#include<cstring>#include<vector>using namespace std;const int N=11;int f[N][N][110];int p;void init(){ for(int i=0;i<=9;i++) f[1][i][...

2020-04-24 20:38:55 459

原创 Windy数 数位dp

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<map>#include<vector>#include<queue>#include<se...

2020-04-24 20:12:29 252

原创 数位dp 度的数量

解题报告:这道题着实是数位dp的入门题了,不得不说yxc的新方法真的太好用了,我们可以构建一颗包含数位的一棵树,然后层层递归下去,设每一个数位是从0~an-1 -1 的,这些我们后面的数都可以随便选,层层递归下去,然后每个题目都不一样都要预处理出来数左边的每一个值,最后答案就是左边加上右边,就是该数本身的大小。#include<iostream>#include<cstr...

2020-04-24 19:46:22 358

原创 莫名的弱,dfs都写不出

解题报告:这种水题。我竟然想不到了,,直接dfs有炸弹的点,++cnt,然后一系列循环爆炸就行了。然后想想是最优解,其实无论怎么引爆答案都是固定的,这个和先后次序无关的。#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cma...

2020-04-24 14:31:46 287

原创 C. Nastya and Strange Generator

解题报告:这道题目是真的。。。一言难尽,以为很难,结果他这个p[i]指的是数i在排列中的位置,那就跟着它模拟就行了,然后判断是否有一个数比他大并且没用过,如果有就break输出no,如果没有就把当前的数插进去。#include<iostream>#include<algorithm>#include<cstdio>#include<cstring...

2020-04-24 10:11:27 319

原创 区间dp

解题报告:这题看了y总的解说是区间dp类型的题目,f[l][r]代表把l到r之间的多边形划分成三角形的最大方案。其中状态转移就是f[l][r]=min(f[l][r],f[l][k]+f[k][r]+w[l]*w[r]*w[k])(k<r&&k>l),然后再套一点大数模板就行啦。。#include<iostream>#include<cstr...

2020-04-23 10:47:49 252

原创 皇宫看守(树形dp)

解题报告:其实这题就是没有上司的舞会和战略游戏的翻版,,类似于状态机f[u][j] 以u为根节点,j有0,1,2,分别表示被父节点侦察到,被子节点侦察到,自己身上放守卫。#include<iostream>#include<cstring>using namespace std;const int N=1510;int f[N][3];int n;int ...

2020-04-22 21:10:48 593 2

原创 1074. 二叉苹果树

解题报告:这道题也是树形dp题,f[i][j]代表根节点是i的情况下留j条边的最大值的方案,最后要求的是以1为根最大值为q的方案,状态转移方程就是类似于分组背包问题,先从大到小枚举体积,再枚举给子树的体积.#include<iostream>#include<cstring>using namespace std;const int N=110;int h[...

2020-04-22 20:29:33 273

原创 Acwing 1075. 数字转换

解题报告:这道题其实就是树形dp的板子题,还掺杂着一点数论的气息,如果朴素去枚举每个数的最大公约数用试除法,o(n根号n),如果n大点就不行了,可以用线性筛的思想,去枚举每个公约数,把他的>=2倍都加上它,这样做法线性On的。然后dfs任意一个节点,找最大距离就可以了。#include<iostream>#include<cstring>using names...

2020-04-22 20:12:12 402

原创 AcWing 166. 数独

解题报告:其实这题我以前做过,但是我给忘记了怎么剪枝,刚好蓝桥杯训练到了这题,那就补一补吧,主要是要把行、列、3x3小矩阵这三个信息的状态压缩,然后某点x,y可选的值在他们状态相与的情况下才满足,然后每次搜索,搜索分支最小的搜索,还有个小优化就是lowbit运算,返回二进制最近的1的数值,然后还要预处理出来1<<i的值就可以了。#include<iostream>usi...

2020-04-22 19:11:02 213

原创 计蒜客(数学题)

解题报告:这道题还是要在草稿本上面好好演算一下的,把式子做一下等价变化,A[i+1]=2A[i]+2C[i]-A[i-1] 假设A[1]=0的情况下带进去,然后把最后真正的A[n+1]和假设出来的A[n+1]相减然后除以(n+1)就是答案。这里的n+1是通过规律看出来的。#include<iostream>#include<algorithm>#include<...

2020-04-22 17:16:16 340

原创 codeforce D. Constant Palindrome Sum (差分+思维)

这题看了大佬的博客,才明白是用差分做,差分的前缀和的下标代表a[i]+a[n-i+1]的值,我们只要预处理出来每个范围内的操作次数,最后利用差分思想前缀和就能做出这道题了,不过预处理区间的时候别忘了两数之和要特判一下。#include<iostream>#include<algorithm>#include<cstdio>#include<cst...

2020-04-22 14:31:14 300

原创 AcWing 1057. 股票买卖 IV

解题报告:这道题是个状态机模型的简单题吧,主要题目的细节是买入卖出加起来算是一笔交易,状态转移也不说了,注意一下j-1和j的区别,f[i][j][k]代表前i天的股票已经进行了j次交易,k为0代表当前手里没有股票,k=1时代表手中有股票,初始化把交易次数为0并且手中没有股票的方案都变为0,别的都是非法状态。AC代码:#include<iostream>#include<c...

2020-04-21 18:14:52 254

原创 kmp(字符串匹配)

解题报告:这道题好像是挺裸的kmp算法吧,我不太懂,之前学过hh,于是去回看了一遍y总的视频,可恶,然后明白了kmp的大致思路,如果暴力枚举字符串是否匹配的话挺难办的复杂度O(n^2),kmp的思路是预处理出来ne数组,ne数组的下标代表以它为结尾的,他的值代表的是最长前缀和后缀相等的部分,如果匹配不上把j更新成ne[j],注意一点就是如果匹配上了j也要更新成ne[j],用来方便下次匹配。这题...

2020-04-20 21:09:22 234

原创 320. 能量项链

解题报告:这道题和环形石子合并唯一的不同就是这道题枚举长度枚举到n+1,比如 2 3 4 5 这个样例, 实际上 他是 2 3 4 5 2 3 4 5,f[l][r]代表把l,r区间合并的最大值,枚举裂开的点,f[l][k]+f[k][r]+w[l]*w[r]*w[k],注意这里k不能和l或者r重合,不然没意义,枚举的长度从3开始比较好,1和2也没意义。#include<iostrea...

2020-04-19 23:07:19 200

原创 1068. 环形石子合并

解题报告:之前做过线形的石子合并,现在做这题看了y总的思路,可以通过扩增一倍的数组,枚举长度为n的合并值取最大值和最小值就行啦。#include<iostream>#include<cstring>using namespace std;const int N=410;const int INF=0x3f3f3f3f;int w[N],f[N][N],...

2020-04-19 22:59:04 203

原创 1073. 树的中心(树形dp)

大致题意:求出树上所有点的最远距离的最小值。解题思路:先找出每个点向下的最大值和最小值并且记录经过最大值的下一个节点编号,最远距离无非就是要么就是向下要么就是向上,向下的值就是d1,而向上的有两种,比如当前点是j上一个点是u,那要先加上u和j之间的距离,然后分情况,一种就是上一个点的向上最大值+这条边,另一种情况就是上一个点向下的最大值+这条边(如果经过j这个点就只能退而求其次找次大值)。两者取...

2020-04-19 15:56:16 554

原创 1648 问题 E: [蓝桥杯][算法训练VIP]求先序排列

给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度< =8)。输入两行,每行一个字符串,分别表示中序和后序排列输出一个字符串,表示所求先序排列样例输入BADCBDCA样例输出ABCD解题报告:之前不知道这个定义是怎么弄的,还挺有意思的,先序遍历就是先根再左儿子后右儿子,中序遍历先左中根后右,后序遍历先左中右后根。那么可以从后序遍历得出...

2020-04-18 23:47:53 287

原创 244. 谜一样的牛

题意:有n只牛,现在他们按一种顺序排好,现在知道每只牛前面有几只牛比自己低,牛的身高是1-n,现在求每只牛的身高解题思路:听了y总的课,他讲的是可以用树状数组+二分做,树状数组维护的是前i个比某头牛小的数量总和,初始状态下我们可以把每个高度都维护一下,千万不要跟我一样把tree数组一个一个变成1,那样是不行的,(没有理解树状数组的含义),简便方法就是tr[i]=lowbit(i),然后从后往前枚...

2020-04-18 23:39:22 282

原创 树形dp 求树的直径

题目描述:给定一棵树,树中包含 n个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值。现在请你找到树中的一条最长路径。换句话说,要找到一条路径,使得使得路径两端的点的距离最远。注意:路径中可以只包含一个点。输入格式第一行包含整数 n。接下来 n−1行,每行包含三个整数 ai,bi,ci,表示点 ai和 bi 之间存在一条权值为 ci 的边。输出格式输出一个整数,表示树的...

2020-04-18 23:05:30 519 3

原创 最小生成树(士兵招募)

Windy has a country, and he wants to build an army to protect his country. He has picked up N girls and M boys and wants to collect them to be his soldiers. To collect a soldier without any privilege,...

2020-04-18 11:15:23 426

原创 acwing 1064. 骑士

在 n×n 的棋盘上放 k 个国王,国王可攻击相邻的 8个格子,求使它们无法互相攻击的方案总数。输入格式共一行,包含两个整数 n和 k。输出格式共一行,表示方案总数,若不能够放置则输出0。数据范围1≤n≤10,0≤k≤n^2输入样例:3 2输出样例:16解题报告:f[i][j][k]对应的就是第i行状态为j,已经选了k个国王的方案的集合,状态转移方程,如果盲算,ijk*状态...

2020-04-17 23:45:03 353

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除