Acwing
Freeman Z
都柏林理工大学博士录取
巴黎高等电子学院工程师录取
李莫瑞克大学硕士在读(主持爱尔兰软件研究中心)
重庆2022优秀毕业生
展开
-
[ACwing]896. 最长上升子序列 II
算法标签 贪心 二分题目简叙思路维护一个单调栈,如果是大于栈末尾元素就插入,形成单调栈,否则就找到第一个大于的元素进行替换,通过这种方式计算最长子序列的长度代码#include<iostream>using namespace std;int n;const int N=1e5+10;int stk[N];//模拟单调栈int arr[N];//数据int cnt;int find(int x){//找到第一个栈里数据大于X的 int l = 1, r =原创 2020-08-04 22:51:33 · 202 阅读 · 0 评论 -
[模板题]最长上升子序列
来源: 模板题算法题:动态规划,线性DP,最长上升子序列给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。#### 输入格式第一行包含整数N。第二行包含N个整数,表示完整序列。#### 输出格式输出一个整数,表示最大长度。#### 数据范围1≤N≤1000,−1e9≤数列中的数≤1e9#### 输入样例:73 1 2 1 8 5 6#### 输出样...原创 2020-03-12 23:08:25 · 451 阅读 · 0 评论 -
[AcWing]898. 数字三角形
算法标签 线性DP题目简叙思路当前的状态由左上或者上方的两个点决定代码#include<iostream>using namespace std;int n;const int INF=1e9;const int N=5e3+10;int f[N][N],a[N][N];int main(){ cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=i;j++)原创 2020-08-04 16:45:05 · 220 阅读 · 0 评论 -
[Acwing]AcWing 841. 字符串哈希
算法标签 哈希,字符串哈希题目简叙思路依据经验,我们使得数值尽量重复时需要限定:1.p最好是131或者133312.对数值%(226),我们刚好采取unsigned long long 溢出时的状态也是一致的这样几乎没有可能重复从而冲突将字符串的前缀转换为数来存值由于每位的权值是不一样的 所以每个前缀值都对应着唯一的一种字符串所以相减后的值也应该是唯一的 从而利用相减后的值可以判断字符串的区间段是否相等字符串str="ABCD"字符串前缀对应h[1]="A"h[2]="AB"原创 2020-07-31 18:14:50 · 310 阅读 · 0 评论 -
[Acwing]840. 模拟散列表
算法标签:哈希表题目简叙思路拉链法:数组加链表使用映射的方式把109映射到105的范围之内这样有可能多个数据在同一地址下,我们只需要把对应地址做成链表形式进行查询和插入即可注意:1.映射值为k=(tmp%N+N)%N;,为了避免tmp%N是负数所以+N,然后为了避免溢出再%N2.%N中N的数据最好是范围数据的第一个素数,这样在数学期望的角度上数组内重复的概率最小图显:插入与查找两种情况单链表可以参考[模板题]单链表代码#include<iostream>#inc原创 2020-07-31 16:08:06 · 171 阅读 · 0 评论 -
[AcWing]837. 连通块中点的数量
算法标签 并查集题目简叙思路合并集合的变体一、初始化for(int i=0;i<n;i++)p[i]=i,cnt[i]=1;p[i]=i表示这是一个树根,一个祖节点cnt[i]=1表示是这个集合初始化只有它一个元素二、找根节点int find(int x){ if(p[x]!=x)p[x]=find(p[x]); return p[x];}三、合并连通块 if(op=="C"){ cin>>a>>b;原创 2020-07-27 18:10:05 · 216 阅读 · 0 评论 -
[AcWing]143. 最大异或对
算法标签 Trie字典树贪心来源 《算法竞赛进阶指南》题目简叙思路使用二叉树的结构来表示整个插入和查询过程:代码#include<iostream>using namespace std;const int N=1e5+10;int tree[N*31][2];int idx,p;void insert(int x){ p=0; for(int i=30;~i;i--){//这里是30的原因是因为限制从0到30,我们采用高位优先,这样可以从大值直接判原创 2020-07-27 17:10:07 · 203 阅读 · 0 评论 -
[Acwing]836. 合并集合
算法标签 并查集题目简叙思路并查集:1.将两个集合合并2.查询两个元素是否在同一个元素当中基本原理:每个集合用一颗树来表示,树根的编号就是当前集合的编号。每个节点存储它的父节点,p[x]表示x的父节点问题1;:如何判断树根:if(p[x]==x)这里非常重要的是:我们从一开始把所有p[x]=x了,这样一来,就可以用p[x]==x来判断是否是一个树的根节点问题2:如何求X的集合编号:while(p[x]!=x)x=p[x];如果不是根节点,就一直指向下一个,直到指向根节点为止问题3:如原创 2020-07-27 15:06:57 · 271 阅读 · 0 评论 -
[AcWing]835. Trie字符串统计
算法标签 Trie,字典树题目简叙思路多叉树存储字符串利用公共前缀提高效率如图,参照代码看:思路不知道怎么写,都贴代码上了代码#include<iostream>#include<string>using namespace std;const int N = 2*1e4+10;int tree[N][26];//多叉树,N表示总数,26表示子节点共有26个字母多个,值存储idx int cnt[N];//记录对应字符的出现的次数int idx;/原创 2020-07-26 20:57:00 · 220 阅读 · 0 评论 -
[Acwing]154. 滑动窗口
算法标签 单调栈 滑动窗口题目简叙思路模拟队列 利用单调队列的思路来控制队列放的是原本字符串的下标查询最小值每次检查数值是否小于队尾元素,如果是,则循环删去队尾,直到新元素比前一个元素更大这样我们就营造了一个递增的单调序列,最小值永远是队头然后返回队头即可代码#include<iostream>#include<vector>using namespace std;int n,k,tmp;const int N=1e6+10;int a[N];i原创 2020-07-26 15:56:55 · 212 阅读 · 0 评论 -
[AcWing]830. 单调栈
算法标签:单调栈题目简叙思路单调栈的概念是栈内所有数据都是单调递增或者递减这里我们只需要构造一个单调递增的栈,然后反复查看栈顶,此时的栈顶元素必然为栈内最大元素,如果栈顶比目标值大,就弹出该元素,直至栈顶元素比目标值小这样我们栈内的元素必然是单调递增的这样我们就可以获得左边第一个比它小的数代码#include<iostream>using namespace std;const int N = 1e5+10;int stk[N],tt;int main(){原创 2020-07-23 21:45:00 · 208 阅读 · 0 评论 -
[AcWing] 829. 模拟队列
算法标签 队列题目简叙思路后进先出的原则我们用 st,ed两个变量表示队列的对头和队尾push queue[++ed]=tmpn;插入时,队尾开始移动并添加数据pop start++;弹出队头数据时,我们用指针略过当前数据表示弹出于是队头++,这样我们就不会扫描到队头元素,相当于弹出empty cout<<queue[start]<<endl;直接查询队头元素query cout<<(start>ed?"YES":"NO")&原创 2020-07-23 21:00:11 · 177 阅读 · 0 评论 -
[Acwing]828. 模拟栈
算法标签 栈题目简叙思路push stk[++tt]=tmpN; pop tt--;query cout<<stk[tt]<<endl;empty if(tt>0)cout<<"NO"; else cout<<"YES";代码数组模拟#include<iostream>#include<string.h>using namespace std;const int N = 100000+原创 2020-07-23 20:21:35 · 171 阅读 · 0 评论 -
[Acwing] 803. 区间合并
算法标签:贪心 区间和并题目简叙思路合并区间可能遇到以下的三种状态:我们维护了一个区间来进行判定我们每次可以维护的长度lens(start,end)如果是状态1:lens不发生改变如果是状态2:lens中的end进行更新扩展else end = max(end,item.second);//状态1 维护并延长区间如果是状态3:保存lens的状态,同时lens更新,lens.count++ if(end<item.first){//状态2 更新到新的区间原创 2020-07-23 18:04:55 · 180 阅读 · 0 评论 -
[Acwing]802. 区间和
算法标签:离散化题目简介思路无限长的数轴n次操作 位置X添加值Cm次操作 求出位置l与位置r之间的值的和离散化的整个过程相当于将大下标的状态映射为了合理下标状态整个过程的状态如下:add添加query查询alls存储的是地址,而不是目标值1.add读入目标位置X,目标累加值C,alls读入目标位置2.query读入目标区间l,r,alls读入目标位置l,r3.alls去重4.alls排序5.构造find函数,用来获得alls数组中数值等于X(查询的位置),返回新的原创 2020-07-21 14:05:16 · 241 阅读 · 0 评论 -
[Acwing]1019.庆功会
算法标签 多重背包问题题目简叙处理这个问题之前,我们先了解一下多重背包问题解析你可以把它理解为01背包问题或者完全背包问题的变体唯一的区别就是在两者基础上加入了一个东西能放多少个,所以我要加入一个循环#include<iostream>using namespace std;const int N=1e2+10;int f[N][N];int v[N],w[N],s[N];int main(){ int n,m; cin>>n>&原创 2020-07-20 17:36:02 · 195 阅读 · 0 评论 -
[Acwing]1371. 货币系统
算法标签 完全背包问题题目简叙思路要解决这道题我们需要在01背包问题的基础上拓展完全背包问题区别在于完全背包问题的是无限可取的,而01背包问题的状态只有取和不取我们首先复习一下完全背包问题完全背包问题思考逻辑整体逻辑#include<iostream>using namespace std;const int N=1e3+10;int f[N][N];//状态表示 f[i][j] 表明 前i个物品 体积为j 价值为f[i][j]int v[N],w[N];//v 重原创 2020-07-20 17:33:50 · 197 阅读 · 0 评论 -
[Acwing]165.小猫爬山
算法标签 DFS题目简叙思路这道题比较好玩我们要放猫,要自己开新的车第一步在查找的时候,事实上你时没有车的这个时候你只能考虑开一辆新车来放????而第二次抱猫,这个时候你就需要思考了,我们唯一拥有的车子是否有剩余的空间?我们是该放入车里,还是新开一个车来?每次抱一只新的猫的时候,你都需要从0到当前所有车辆的车子中考虑一遍以下是 u为当前选择的猫 来考虑摆放在哪一个车上的思路我们来优化整个过程小偷问题这是整个优化的思路那么,我们可以直接使用贪心吗?我编写了一个简单的贪心的思路原创 2020-07-20 16:37:35 · 168 阅读 · 0 评论