自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 牛客编程巅峰赛S2第3场 - 钻石&王者 ABC

A:简单的公式先看a:显然有a[2]=3*a[1];a[3] = 3 * a[2]; 显然能找到规律:a[n]=3*a[n-1];b同理。然后证明:a[n] = 2*a[n-1] + 3*a[n-2];若a[n-1] = 3*a[n-2] ,则a[n] = 3*a[n-1]; (带入上式可得)由于n<=2 时 a[n]=3 * a[n-1];所以这个关系可以递推到全部。b同理。class Solution {public: /** ...

2020-11-24 21:35:57 14

原创 剑指 Offer 37. 序列化二叉树 C++ ostringstream istringstream 的使用

这题是困难完全是因为输出和输出格式的问题。。具体用法见代码。。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Codec {public:

2020-11-24 16:20:45 9

原创 剑指 Offer 11. 旋转数组的最小数字&&154. 寻找旋转排序数组中的最小值 II 奇怪的二分

能退化的二分。。。这复杂度最坏是On的。看来跟ACM还是有点区别啊,实际中碰到的基本都是随机数据,在随机上跑的优秀就行,就像快排?class Solution {public: int findMin(vector<int>& numbers) { int n=numbers.size(); int l=0,r=n-1; while(l<r){ int m=(l+r)/2;

2020-11-24 15:49:49 9

原创 剑指 Offer 62. 圆圈中最后剩下的数字 约瑟夫环 倒着递推

分析过程在代码里了。约瑟夫环这种倒推思路好久不写,竟然没想出来怎么做。。class Solution {public: int lastRemaining(int n, int m) { /* 从最后一轮往前推, 倒数第i-1轮有i-1人,假设最后剩下的人再当前轮次的标号是index。 则倒数第i轮被杀的人的标号为:(m-1) % i, 其中标号为 m % i,的人是第i+1轮

2020-11-24 15:09:47 5

原创 面试题 16.25. LRU 缓存 && 146. LRU 缓存机制 双向链表 + hash_map

之前牛客多校用数组模拟链表写过一次100多行的。。。这次用链表写个简单点的:map里存链表对应key的迭代器class LRUCache {public: int cap; unordered_map<int ,list<pair<int,int> >:: iterator>cache; list<pair<int,int> >lt; LRUCache(int capacity) {

2020-11-22 16:53:54 12

原创 LeetCode 第 216 场周赛 1-4题题解

5605.检查两个字符串数组是否相等直接拼接用string判断即可class Solution {public: bool arrayStringsAreEqual(vector<string>& w1, vector<string>& w2) { string a,b; for(auto x:w1)a+=x; for(auto x:w2)b+=x; return a==b; .

2020-11-22 12:00:40 15

原创 剑指 Offer(第 2 版) 出现频率从高到低 休闲不定期更细

剑指 Offer 03. 数组中重复的数字遍历+mpclass Solution {public: int mp[100007]; int findRepeatNumber(vector<int>& nums) { for(auto x:nums){ mp[x]++; if(mp[x]>1)return x; } return nums[0]; }}

2020-11-22 11:15:56 20

原创 牛客编程巅峰赛S2第2场 - 钻石&王者 ABC

A牛牛切木棒任意三个不能构成三角形,一定是:1,1,2,3,5……斐波那契数列,刚好任意三个一定满足a+b<=cclass Solution {public: /** * * @param a long长整型 木棒的长度 * @return int整型 */ int stick(long long a) { // write code here if(a<=3)return 2; ..

2020-11-20 21:38:35 28

原创 休闲lc系列 42. 接雨水 前缀和

class Solution {public: long long ans; int hp[30007],hn[30007]; int trap(vector<int>& height) { int n=height.size(); hp[0]=hn[n+1]=0; for(int i=1;i<=n;i++) hp[i]=max(hp[i-1],height[i-1]); ...

2020-11-20 15:20:47 11

原创 剑指 Offer 24. 反转链表

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* reverseList(ListNode* head) { ListNode* tmp =N...

2020-11-20 11:53:51 11

原创 剑指 Offer 46. 把数字翻译成字符串 dp

dp一下即可class Solution {public: int d[110],sz; long long dp[110]; int translateNum(int num) { sz=0; while(num){ d[++sz]=num%10; num/=10; } reverse(d+1, d+1+sz); memset(dp,0,s

2020-11-20 11:37:20 7

原创 剑指 Offer 29. 顺时针打印矩阵

class Solution {public: int vs[110][110]; vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<int>ans; memset(vs,0,sizeof(vs)); if(matrix.size()==0)return ans; int nm=0; ...

2020-11-20 11:28:04 9

原创 剑指 Offer 38. 字符串的排列 dfs找全排列

class Solution {public: int vs[10]; string p,tmp; set<string>ans; void dfs(int x,int n){ if(x==n){ ans.insert(tmp); return ; } for(int i=0;i<n;i++){ if(!vs[i]){ ...

2020-11-20 11:19:32 7

原创 LCP 19. 秋叶收藏集 dp || 前缀和

方法一:dp[i][j],处理到第i片叶子,i叶子是状态j,最少交换次数状态0:前面全是red状态1:前面一段red,剩余是yellow状态2:前面一段red,再一段yellow,最后redclass Solution { int dp[100007][3];public:/*1 i j ns[i];前i个树叶有i个red(i-s[i]) +s[j]-s[i] +(n-s[n])-(j-s[j])i-s[i]+s[j]-s[i]+n-j-s[n]+s[j]i-

2020-11-19 18:30:19 5

原创 148. 排序链表 递归或迭代

如果要求O1空间则只能迭代,递归调用函数会浪费logn的空间。链表排序的大体思路:类比数组归并排序1、递归:每次用快慢指针找出链表中点,然后递归下去,每层归并排序。利用虚节点当链表首部,进行拼接链表,由于我们只是改变链表的引用,没有另外开辟空间,所有空间只是递归浪费的logn层空间。2、迭代:相当于搜索树上自底向上跑,倒数第i层一定是每相邻的 (1<<(i-1))归并排序。具体细节看代码。自顶向下递归 0logn空间/** * Defin..

2020-11-19 16:00:40 8

原创 912. 排序数组 三种常见排序记录

快速排序每次选择一个基准点,把区间小于基准点的元素放在左边,大于放在右边,基准点放中间。基准点若随机选择,则期望复杂度为nlogn,class Solution {public: int a[100007]; void qsort(int l,int r){ if(l>=r)return ; int L=l; for(int i=l;i<r;i++){ if(a[i]<a[r]){

2020-11-18 22:46:16 11

原创 牛客编程巅峰赛S2第1场 - 钻石&王者 ABC

RANK22A:Tree IV刚开始看错题目,以为n<=100000.。。直接写个二叉树遍历。。T了,然后快速改了下,分层等差数列统计即可。。这题浪费了10多分钟的罚时,不然就RANK10了 难受class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param n long长整型 表示标准完全二叉树的结点个数 * @return long长整型

2020-11-17 21:08:47 29

原创 lt 字节题库 —— LCP 18. 早餐组合

放松系列简单的枚举。。class Solution {public: int breakfastNumber(vector<int>& staple, vector<int>& drinks, int x) { int mod = 1e9+7; sort(staple.begin(),staple.end()); sort(drinks.begin(),drinks.end()); l

2020-11-17 11:45:00 9

原创 lt hot 100系列——2 两数相加

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(n...

2020-11-16 22:38:06 7

原创 lt hot 100系列——1. 两数之和

简单的map应用没啥可说的class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { int n=nums.size(); vector<int>ans; unordered_map<int,int>mp; mp.clear(); for(int i=0;i<n

2020-11-16 22:28:39 9

原创 两个链表生成相加链表

https://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b?tpId=117&&tqId=1008772简单的面试题,考察链表结构体的使用。/** * struct ListNode { * int val; * struct ListNode *next; * }; */class Solution {public: /** * * @param head1 L

2020-11-16 21:37:49 11

原创 CF 1423 J - Bubble Cup hypothesis 思维分析+函数转化

直接上讨论区老哥的解法!#include <bits/stdc++.h>using namespace std;typedef long long ll;#define re register#define ls (o<<1)#define rs (o<<1|1)//#define m (l+r)/2#define pb push_backtypedef pair<int,int> pii;const double PI= acos..

2020-11-06 22:40:28 23

原创 1423B - Valuable Paper 二分+最大流

在刷完24道网络流后,这种题随便切。。读题到AC不到25min但还是忘了输出-1wa了一次,还是要细心一点。。显然,二分图,这里的费用是取max,所以用二分建边跑最大流即可。若费用求和,则可用最小费用流。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 1000000+7;const int N = 20000+7;struct Dinic{ //N个点,M条

2020-11-06 21:31:38 31

原创 1427D - Unshuffling a Deck 思维构造

这类操作构造问题一般给的操作限制就是上界。也就是我们要n次换完。很容易想到一次换一个。由于是反转操作,我们可以i和n-i+1打包一起换。然后换n/2次即可。细节见代码#include <bits/stdc++.h>using namespace std;typedef long long ll;#define re register#define ls (o<<1)#define rs (o<<1|1)//#define m (l.

2020-11-06 19:57:33 20

原创 CF1427 C - The Hard Work of Paparazzi 优化DP

现在的DP题一般需要对题目分析,得出一些性质,然后利用性质和一些数据结构对暴力DP进行优化!这题先写出朴素DP:dp[i]:以第i个人为拍摄终点,最多的拍摄次数。显然有转移:dp[i]=max(dp[i],dp[j]+1); j<i && dis(i,j)<=t[i] - t[j];然后考虑优化:我们发现:r才500,也就是说当时间差大于1000时,一定可达任意点。而两个人出现的时间差至少大于1,所以我们可以暴力时间差1000内前面的人,10...

2020-11-06 11:18:30 23 1

原创 CF1428 E. Carrots for Rabbits 贪心+优先队列

n个数切成k份,求切出数的平方和的最小值.有个比较显然的结论:对于一个数x,把它分成y份,求平方和sm,使得sm最小的分法一定是均分。而把一个数分成y份,平方和与分成y-1份的平方和减量设为Cy,分成z份,平方和与分成z-1份的平方和减量设为Cz。显然有:if(y<z)则Cy>Cz。这里说明了我们可以贪心的分萝卜,当前最优一定是全局最优,因为后面的分块一定不优于当前分块sm的减量。于是便有了贪心:刚开始n个数,还需要分出k-n块。我们把每个数存到优先队列里,.

2020-11-06 10:24:17 24

原创 CF1428 D - Bouncing Boomerangs 思维分析+构造

构造题就是先分析性质,然后尽量简化过程,简单的进行构造。这题分析下可知:3后面必须要有1,或者2来与其构造。2后面只能跟1.所以就有了贪心构造:从前往后,记录前面2,3的个数。1优先跟2配对,然后2,3与3配对。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define re register#define ls (o<<1)#define rs (o&lt.

2020-11-06 09:51:39 41

原创 CF1442 D - Sum 思维分析 + 分治优化01背包

给你n个栈,你需要对于每一个栈,从前往后选择若干个,栈中每一个元素有一个贡献,问选择k个的最大贡献是多少。思路:首先可以想到:最终一定是选完若干个栈,最后剩一个栈选若干元素。证明:若最后存在两个栈未选完:栈a,b. a选到i,b选到j。假设a[i]>a[j],显然a[i+1]>a[j];完全可以不选a[j],选择a[i+1].所以最后一定至多有一个栈未被选完。然后:就有了做法:枚举是哪个栈最后未被选完,然后对其他栈打包做一个01背包。总复杂...

2020-11-05 20:34:24 34

原创 1433G - Reducing Delivery Cost 思维分析 + 预处理最短路

暴力枚举每条边免费再用dij求最短路复杂度为:n*m*k*logm;需要进行优化:我们发现:把边i(x -> y)免费后对于路径 a -> b只有三种情况: 1:原本i不在 a->b最短路上,免费后也不在。 2:原本i不在 a->b最短路上,免费后在。 3:原本i在 a->b最短路上,免费后也在。只需要判断下: ds[a][b] 与 min(ds[a][x]+ds[y][b],ds[a][y]...

2020-11-05 19:02:33 11

原创 CF1433 F. Zero Remainder Sum DP状态转移

经典的带余数DP转移。看到要求最后和整除K,就想到DP多开一维状态表示到当前状态下选的数和模K为多少。然后要求每行最多选m/2个,那么开一维状态表示每行选了多少数。然后再开两维表示选到第i行,第j列。总共四维DP,O(n^4) 滚动数组一下可以优化两维,这里我只优化了一维。具体看代码就行。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define re register#de.

2020-11-05 17:52:07 13

原创 CF1423K. Lonely Numbers 性质分析+埃筛

设a,b, x=gcd(a,b);题目可以转化为: a,b,x^2 组成三角形。设a<b,若a为质数,则b一定只能为a^2 , 否则无法构成三角形(证明比较简单略)若a为合数,则设b= z*y ,令a=(z-1)*y. 则 a,b,y^2 一定可以构成三角形。所以结论为:若一个数x是合数,则他不孤独。若一个数是质数,则如果他的平方也在,则他不孤独,否则孤独。#include <bits/stdc++.h>using namespace std;...

2020-11-04 22:51:28 10

原创 CF1436 E. Complicated Computations MEX性质分析+权值线段树维护区间种类

思维量比较大的一道题,如果之前做过类似的就很简单,但没做过的话真的有点难想。。首先一个比较容易想到的点:从1枚举到n+1,用某种方法计算最终的MEX序列是否出现i。对于一个子数组[L,R],若其MEX等于x,则其必须满足:区间内不包含x,且区间内包含所有1 - x-1的数。关键点在于这里如何进行维护。我们可以这样做:对于区间不好含x这个限制我们可以每次取区间:(lst[a[i]],i),这样区间一定不包含a[i],而包含1 - x-1的数可以考虑用权值线段树维护:从左往右..

2020-11-04 22:15:40 18

原创 CF1413 C. Perform Easily 枚举固定最大值+set维护

这种最大最小值不固定的题目,一般要枚举最大值/最小值。可以先求出 c[n][6] = b[i] - a[j];总共n行6列的矩阵,每行选一个数,选出n个数,求这n个数最大最小值之差最小是多少。我用的是枚举最大值:显然需要找每行小于当前最大值且最大的数是多少。如果枚举做的话就是n^2的了。但我们如果先预处理排序下的话,发现每次没必要枚举找每行的小于当前最大值的最大值。我们可以维护一个multiset表示每行当前情况下的最大值。每行的初值为:b[i]-a[1].这样维护,.

2020-11-04 17:01:00 53

原创 CF1437 C. Chef Monocarp 简单线性DP

比较简单的DP。。dp[i][j],第i个碟子,dij秒拿出来最少的结果。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define re register#define ls (o<<1)#define rs (o<<1|1)//#define m (l+r)/2#define pb push_backtypedef pair<int,int> p

2020-11-04 14:42:33 17

原创 CF 1443 E. Long Permutation 性质分析+逐段处理

很经典的思维套路。我们知道:长度为i的排列共有 i! 种,显然20!> 1e5*2e5所以其实无论怎么改变,最多修改不到20个数。我们可以类似于二进制的思想,从前往后修改。比如1 2 3 4 5,对于2号位置,其于其后面的4个数总共有4! = 24种排列,那么对于1号位置来说:其排列为24*5=120,即这五个数每个数放在最前面,后面都是4个数的排列。对于字典序从低到高来说:我们把2放在最前面,其余相对位置不变往后移变为:21345,这个排列是第25字典序小的排列(..

2020-11-04 10:45:52 134

原创 CF 1437 E. Make It Increasing 改动nlogn LIS + 序列性质分析

在做这一题之前先看一道题:给的一个长度为n的序列a,求最少需要改变a的数量,使得a序列非严格递增。显然结果为:n-LIS,(因为最后一定有些数是不变的,我们让不变的数尽量长,则必须让不变的数满足最终序列的性质即:非递减)如果把非严格改成严格递增呢?我们依然用上面的思路:让不变的序列尽量长,即满足最终序列,最终序列是严格递增序列,由于是整数,则对于:j>i,必须满足a[j]>a[i].且a[j]-a[i]>=j-i. 这样才能保证中间变化的数有解。为了方便我们对上面的式子

2020-11-04 09:07:59 18

原创 AtCoder Beginner Contest 181 A-F 全部题目解析

A:奇数输出Black,偶数输出White即可。。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define re register#define ls (o<<1)#define rs (o<<1|1)//#define m (l+r)/2#define pb push_backtypedef pair<int,int> pii;const doub

2020-11-03 21:30:16 48

原创 CF1442 C Graph Transpositions 分析图性质+分层图最短路

显然,一看到二操作自然而然就想到,一旦二操作进行20次以上,一次2操作就比m次1操作花费还多。比较容易想到分段处理,二操作20次一下可以用分层图最短路搞一下。即建20层图,第一层是原图,第二层是第一层进行一次二操作后的图,从第一层到第二层的代价是1.后面每层变换类似。最后求到每层点n的最短路。若有值,则取min就是答案。而操作20次以上有点难度:不过有个贪心显然:让二操作尽量少,若而操作一样。则让一操作尽量少。我刚开始准备以二操作为边权求出最短路后,再以一操作为边权求出剩余图的最

2020-11-03 19:46:11 263

原创 Codeforces Round #681 (Div. 1, based on VK Cup 2019-2020 - Final) A - B

A:简单分析可知:一定是从左往右和从右往左两个递减序列组成的;然后从前往后构造即可:前一个序列一定递减,后一个递增。显然又贪心:让前一个尽量大,后一个尽量小,这样后面的数构造更灵活。非法情况时break即可。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define re register#define ls (o<<1)#define rs (o<&l

2020-11-03 17:14:03 61

原创 String的常用方法

一下是B站尚硅谷网课 课件中总结的常用方法,后面配上我自己写的代码实现方便理解记忆。复杂度我看了下源码,基本都是On的。。。 int length():返回字符串的长度: return value.length char charAt(int index): 返回某索引处的字符return value[index] boolean isEmpty():判断是否是空字符串:return value.length == 0 String toLowerCase():使用默认语言环境,将

2020-10-30 15:45:46 21

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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