从零开始的做题计划
ILECY
You got to put the past behind you before you can move on.
展开
-
练习41,[SCOI2010] 序列操作【线段树】
稍微难一些的就是求[l,r] 区间内最多有多少个连续的 1,可以分别维护一段区间左端,中间,右端有多少个连续的1和0来实现。同时要注意的点是赋0和赋1标记可以覆盖取反标记,而取反标记不能覆盖赋0和赋1标记,而且取反标记更改时要^=1。此题还有一种解法是珂朵莉树,但只能过随机的数据,无法通过洛谷上已经针对过的数据。思路不是很难,码量很大,调试难度高,一个bug找一天(bushi。原创 2022-09-19 12:59:42 · 222 阅读 · 1 评论 -
练习40,小蓝的旅行【最短路】
根据题意,我们知道只能从未做核酸的城市到做核酸的城市或者从做核酸的城市到未做核酸的城市,所以我们可以将每个点分别当成未做核酸的和做了核酸的,然后分别建边求最短路。原创 2022-07-26 16:06:02 · 337 阅读 · 1 评论 -
练习39,P1119 灾后重建【Floyd算法/二分】
因为每个村庄重建完成的时间和每次询问的时间都是不下降的,所以按照每次询问的时间更新Floyd就行。原创 2022-07-22 13:08:21 · 201 阅读 · 0 评论 -
练习38,最小生成树MST【Prim算法+堆优化】
练习38,最小生成树MST【Prim算法+堆优化】原创 2022-07-21 13:10:08 · 184 阅读 · 0 评论 -
练习37,最小生成树MST【Kruskal算法】
代码】练习37,最小生成树MST【Kruskal算法】原创 2022-07-21 13:02:28 · 141 阅读 · 0 评论 -
练习36,最短路问题【Dijkstra算法/链式前向星】
题目:洛谷P1339 [USACO09OCT]Heat Wave G有一个 nnn 个点 mmm 条边的无向图,请求出从 sss 到 ttt 的最短路长度。第一行四个正整数 n,m,s,tn,m,s,tn,m,s,t。接下来 mmm 行,每行三个正整数 u,v,wu,v,wu,v,w,表示一条连接 u,vu,vu,v,长为 www 的边。输出一行一个整数,表示答案。样例输出提示【数据范围】对于 100%100\%100% 的数据,1≤n≤25001\le n \le 25001≤n≤2500,1原创 2022-07-13 14:28:50 · 142 阅读 · 0 评论 -
练习35,进制转换思想的一道题【构造】
D-操作题_牛客小白月赛51 (nowcoder.com)题目描述你有两个数a和b,其中a等于0,b等于1,你有2种操作:操作一:你可以选择a的值加上b或b的值加上a。操作二:你可以选择a或b乘以数字x。请你输出一个操作次数不超过400次的操作序列,使得a或b中有一个值等于n。其中x和n的值为给定的。输入格式第一行输入一个整数 1≤T≤200,代表有T组样例。随后T行输入两个整数n,x,分别代表0≤n≤1e9 2≤x≤10。输出格式对于每一组样例首先输出一行kkk,代表你操作的总次数,k≤400k\leq原创 2022-06-03 23:20:26 · 84 阅读 · 0 评论 -
练习34,求最长回文子串【manacher算法】
P3805 【模板】manacher 算法 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)题目很简单:给出一个只由小写英文字符 a~z 组成的字符串 S ,求 S 中最长回文串的长度 。字符串长度为 n(1≤n≤1.1e7)不过考虑到n很大,所以靠暴力求肯定超时,所以要用到马拉车算法(manacher算法) 如图,mid是i~r的回文中心,因此以t为回文中心的字符串=以t的对称点为回文中心的字符串,所以p[t]可以等于p[2*mid-t]。但是由于超过r的部分(即右红边部分)不能保证等于左原创 2022-06-01 16:23:01 · 109 阅读 · 0 评论 -
练习33,三元上升子序列【线段树/离散化】
逆序对升级版,在某次校赛遇到过,P1637 三元上升子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)思路:三元上升子序列的个数=(每个数前比它小的数的个数*每个数后比它大的数的个数) 之和,所以就正求一遍顺序对,反求一遍逆序对就行#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3f#define NOTLE ios::sync_with_stdio(0),cin.tie(0)原创 2022-05-30 21:39:53 · 133 阅读 · 0 评论 -
练习32,逆序对【线段树/离散化】
P1908 逆序对 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)思路:维护一个线段树,按序列顺序,查找完ai就将它加入线段树,这样每次查找在线段树中比ai大的数就符合逆序对的要求。但序列中的数字最大有1e9,不能直接用线段树存,所以想先用离散化思想,用相对大小关系表示绝对大小,比如在题目中:1、2、3与1、2、99性质是一样的#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3f#原创 2022-05-26 20:45:29 · 85 阅读 · 0 评论 -
练习31,最大食物链计数【拓扑排序/动态规划DP】
P4017 最大食物链计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)仍然是一道DAG上拓扑排序的练习#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3f#define NOTLE ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)#define endl '\n'#define T int TT;cin >> TT;whi原创 2022-05-19 21:08:22 · 131 阅读 · 0 评论 -
练习30,图论 P1113 杂务【拓扑排序/邻接表】
P1113 杂务 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)思路:一开始只是将所有入度为0的点加入队列,并且 dp[i]=len[i] (表示没有前驱杂务的杂务完成时间就等于它的耗时),然后遍历这些杂务的出边并且将出边对应的点入度-1。如果有点的入度减至0则代表它所有的前驱杂务完成时间已经计算好,此时该点的完成时间等于前驱杂物完成时间的最大值+当前杂物的耗时,即 dp[i]=max(dp[prei])+len[i] ,如此循环直到遍历完所有点,所以结果就是所有杂务完成时间的最大值原创 2022-05-17 20:50:47 · 208 阅读 · 0 评论 -
练习29,统计子矩阵【二维前缀和/双指针】
4405. 统计子矩阵 - AcWing题库给定一个 N×M 的矩阵 A,请你统计有多少个子矩阵 (最小 1×1,最大 N×M) 满足子矩阵中所有数的和不超过给定的整数 K?输入格式第一行包含三个整数 N,M 和 K。之后 N 行每行包含 M 个整数,代表矩阵 A。输出格式一个整数代表答案。数据范围对于 30% 的数据,N,M≤20,对于 70% 的数据,N,M≤100,对于 100% 的数据,1≤N,M≤500;0≤Aij≤1000;1≤K≤250000000。输入样例:原创 2022-05-12 15:57:11 · 370 阅读 · 2 评论 -
练习28,日志统计【双指针】
1238. 日志统计 - AcWing题库小明维护着一个程序员论坛。现在他收集了一份”点赞”日志,日志共有 N行。其中每一行的格式是: ts id表示在 ts 时刻编号 id 的帖子收到一个”赞”。现在小明想统计有哪些帖子曾经是”热帖”。如果一个帖子曾在任意一个长度为 D 的时间段内收到不少于 K 个赞,小明就认为这个帖子曾是”热帖”。具体来说,如果存在某个时刻 T 满足该帖在 [T,T+D) 这段时间内(注意是左闭右开区间)收到不少于 K 个赞,该帖就曾是”热帖”。...原创 2022-05-11 21:21:57 · 83 阅读 · 0 评论 -
练习27, 字典树 于是他错误的点名开始了【字典树/map】
P2580 于是他错误的点名开始了 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)字典树写法:#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3f#define lint long longint n,m;struct Trie{ int ch[500010][26],cnt,val[500010]; //val为附加信息 //ch数组,第二维的大小为26是因原创 2022-05-08 23:58:50 · 186 阅读 · 0 评论 -
练习26,NOIP2002产生数【DFS/高精度】
P1037 [NOIP2002 普及组] 产生数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3f#define lint long long#define pb push_backlint k,x[20],y[20],len,ans[10010],jw[10010];int m[20]={0};string s;void dfs原创 2022-05-05 20:26:40 · 160 阅读 · 0 评论 -
练习25,排队打水问题【贪心】
排队打水问题 - 问题 - USCOJ (欢迎加入ACM队!点这里了解详情~)有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2………..tn为整数且各不相等,应如何安排他们的打水顺序才能使他们的等待时间和最少?输入格式第一行n,r (n<=500,r<=75)第二行为n个人打水所用的时间Ti (Ti<=100);输出格式最少的花费时间样例输入3 21 2 3样例输出7题解用nt存n个人打水所用的时间,用rt存r个水龙头排队所需时间原创 2022-05-02 15:20:13 · 890 阅读 · 0 评论 -
练习24,拦截导弹 最长上升子序列【动态规划LIS】
拦截导弹 - 问题 - USCOJ (欢迎加入ACM队!点这里了解详情~)某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。原创 2022-04-25 15:27:29 · 106 阅读 · 0 评论 -
练习23,飞行员兄弟【二进制枚举/位运算】
116. 飞行员兄弟 - AcWing题库“飞行员兄弟”这个游戏,需要玩家顺利的打开一个拥有 16 个把手的冰箱。已知每个把手可以处于以下两种状态之一:打开或关闭。只有当所有把手都打开时,冰箱才会打开。把手可以表示为一个 4×4 的矩阵,您可以改变任何一个位置 [i,j] 上把手的状态。但是,这也会使得第 i 行和第 j 列上的所有把手的状态也随着改变。请你求出打开冰箱所需的切换把手的次数最小值是多少。输入格式输入一共包含四行,每行包含四个把手的初始状态。符号 + 表示把手原创 2022-04-20 20:41:19 · 82 阅读 · 0 评论 -
练习22,密码锁【广搜BFS】
密码锁 - 问题 - USCOJ (大家加油哦!)#include<bits/stdc++.h>using namespace std;#define pb push_backstring s;int ans=-1,len;struct node{ string a; int step; node(string na,int ns){ a=na; step=ns; }};deque<node> v;map<s原创 2022-04-13 21:44:37 · 345 阅读 · 0 评论 -
练习21,砝码称重【动态规划DP】
砝码称重3417. 砝码称重 - AcWing题库你有一架天平和 N 个砝码,这 N 个砝码重量依次是 W1,W2,⋅⋅⋅,WN。请你计算一共可以称出多少种不同的正整数重量?注意砝码可以放在天平两边。输入格式输入的第一行包含一个整数 N。第二行包含 N 个整数:W1,W2,W3,⋅⋅⋅,WN。输出格式输出一个整数代表答案。数据范围对于 50% 的评测用例,1≤N≤15。对于所有评测用例,1≤N≤100,N 个砝码总重不超过 1e5题解d[i][j]表示前i个砝原创 2022-04-02 13:23:45 · 1081 阅读 · 0 评论 -
练习20,RMQ问题 数列区间最大值【线段树】
数列区间最大值输入一串数字,给你 M 个询问,每次询问就给你两个数字 X,Y,要求你说出 X 到 Y 这段区间内的最大数。输入格式第一行两个整数 N,M 表示数字的个数和要询问的次数;接下来一行为 N 个数;接下来 M 行,每行都有两个整数 X,Y。输出格式输出共 M 行,每行输出一个数。数据范围1≤N≤1e5,1≤M≤1e6,1≤X≤Y≤N,数列中的数字均不超过2^31−1输入样例:10 23 2 4 5 6 8 1 2 9 71 43 8输出样例:58原创 2022-03-28 20:21:03 · 526 阅读 · 0 评论 -
练习19,线段和点【贪心】
线段和点 - 问题 - USCOJ(PvP)#include<bits/stdc++.h>using namespace std;#define lint long longint m,n;int p[10010];struct line{ int l,r; bool operator<(line &aa){ //定义运算,排序将区间大的优先 if(l!=aa.l) return l<aa.l; else return r>aa原创 2022-03-23 20:14:46 · 679 阅读 · 0 评论 -
练习18,选取数对【动态规划DP/前缀和】
4378. 选取数对 - AcWing题库他人方法,个人理解#include<bits/stdc++.h>using namespace std;#define lint long longint n,m,k;lint a[5010],d[5010][5010],sum[5010]={0};int main(){ cin >> n >> m >> k; for(int i=1;i<=n;i++){ c原创 2022-03-21 20:36:37 · 748 阅读 · 0 评论 -
练习17,小y拼楼梯【动态规划DP/贪心】
题源:E-⼩y拼楼梯 - 问题 - USCOJ(PvP)题目描述⾃从⼩y上次学会计算有多少种爬楼梯的⽅式后,又枯燥了起来。现在她⾃⼰拼接⾃⼰想要的楼梯,于是她就开始⾃⼰脑补拼接楼梯了。她在想,⾃⼰拥有⽆限个分别为 a1,a2,a3……ak 阶的⼩楼梯,她想拼出⼀个 N阶的楼梯最少需要多少块?例如⼩y现在有分别为 1,2,4 阶的⼩楼梯,想要拼出 10阶的楼梯⾄少需要 3块⼩楼梯,分别是 4 阶的⼩楼梯使⽤ 2块,2 阶的⼩楼梯使⽤ 1块,即 4+4+2=10但是⼩y现在想破了脑袋也...原创 2022-03-14 22:09:33 · 519 阅读 · 0 评论 -
练习16,并查集模板&NOI2001食物链【并查集】
并查集一般模板:void init(){ //初始化 for(int i=1;i<=n;i++) fa[i]=i;}int find(int x){ //寻找根节点 if(fa[x]!=x) fa[x]=find(fa[x]); return fa[x];}并查集模板题:P3367 【模板】并查集 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)#include<bits/stdc++.h>using namespace st原创 2022-03-13 20:57:26 · 473 阅读 · 0 评论 -
练习15,二分查找模板题数的范围【二分查找】
数的范围789. 数的范围 - AcWing题库给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。如果数组中不存在该元素,则返回 -1 。输入格式第一行包含整数 n 和 q,表示数组长度和询问个数。第二行包含 n 个整数(均在 1∼10000 范围内),表示完整数组。接下来 q 行,每行包含一个整数 k,表示一个询问元素。输出格式共 q 行,每行包含两个整数,表示所求元素的起始位.原创 2022-03-09 20:22:44 · 61 阅读 · 0 评论 -
练习14,离散化思想火烧赤壁【二分查找+离散化】
P1496 火烧赤壁 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)#include<bits/stdc++.h>using namespace std;#define lint long longlint n,ans=0,add=0;lint c[40100]={0}; //数组c离散化储存原来的坐标int a[20100],b[20100],flag[40100]={0};int find(int num){ //二分查找 int l=1,r=a原创 2022-02-14 17:24:18 · 303 阅读 · 0 评论 -
练习13,USACO 打乱字母【二分法】
1996. 打乱字母 - AcWing题库#include<bits/stdc++.h>using namespace std;int n;string name[50010],a[50010],b[50010];int cmp(char sa,char sb){ return sa>sb;}int main(){ cin >> n; for(int i=1;i<=n;i++){ cin >> name原创 2022-02-14 11:11:20 · 291 阅读 · 0 评论 -
练习12,USACO Tractor S 拖拉机【双端队列BFS】
[USACO12MAR]Tractor SP1849 [USACO12MAR]Tractor S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)转换为最短路问题,有稻草的权值为1,没有的为0,向没有稻草的点移动放在队列顶端,向有稻草的点移动放队列末端,这样队列中前面一部分和后面一部分差值最大为1#include<bits/stdc++.h>using namespace std;#define lint long long#define pb push_ba原创 2022-02-05 02:18:29 · 617 阅读 · 0 评论 -
练习11,马的遍历【广搜BFS】
题目链接:P1443 马的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)#include<bits/stdc++.h>using namespace std;#define lint long longint n,m,ans[410][410]={0},d[410][410]={0};const int xx[8]={-1,-2,-2,-1,1,2,2,1};const int yy[8]={-2,-1,1,2,2,1,-1,-2};vector<原创 2022-01-16 18:58:07 · 436 阅读 · 0 评论 -
练习10,AcWing 2041. 干草堆【数学/差分】
差分:将数列中的每一项与前一项做差来得到一个新的数列(差分数列最后比原数列多一个数,因为最后一项是0减去原数列的最后一项)在原数列a中对区间[l,r]中的每一个数都加上x,相当于对差分数列b中 b[l]+=x , b[r+1]-=xeg: 数列a为 1 2 3 4 5 6那么a的差分数列b为 1 1 1 1 1 1 -6所以我们可以得出由差分数列求原数列的公式:a[n]=b[n]+a[n-1]由于 b[1]=a[1] 所以 a[2]=b...原创 2022-01-12 16:26:35 · 203 阅读 · 0 评论 -
练习9,DFS练习八皇后【深搜DFS】
dfs思路的八皇后#include<bits/stdc++.h>using namespace std;#define lint long longint l[110]={0},lx[110]={0},rx[110]={0},lj[110]={0};int n,ans=0;void dfs(int h){ if(h==n+1) { /* if(ans<3){ for(int i=1;i<=n;i++) c原创 2021-12-10 22:26:12 · 265 阅读 · 0 评论 -
练习8,半递增序列【数学】
半递增序列 - 问题 - USCOJ(新生赛筹备中~)蓝桥杯模拟题初见此题,第一个想法便是深搜,然后写出代码后发现只能计算很小的数字,大了就超时,对于题目中n<=1000无法满足#include<bits/stdc++.h>using namespace std;#define lint long longint n,c=0,ans=0;int a[1010]={0};void dfs(int j,int on,int en){ if(j==n) ans++原创 2021-11-30 23:37:48 · 540 阅读 · 0 评论 -
练习7,初见动态规划之挖地雷【动态规划DP】
P2196 [NOIP1996 提高组] 挖地雷 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)思路来自题解c[i]为第i个地方的最多地雷数状态转移方程:c[i]=max{c[j]}+a[i];(i=1,2,3,...,n)(b[i][j]=1 or b[j][i]=1)#include<bits/stdc++.h>using namespace std;#define lint long longint n,a[100],b[100][100],c[1原创 2021-11-20 15:31:31 · 670 阅读 · 0 评论 -
练习6,初见动态规划之01背包 采药【动态规划DP】
题目:P1048 [NOIP2005 普及组] 采药 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)状态转移方程d[i][j]=max(d[i+1][j-t[i]]+v[i],d[i+1][j]) (j>=t[i])d[i][j]=d[i+1][j] (j<t[i])//t[i]为捡起第i个物品消耗的时间,v[i]为第i个物品的价值#include<bits/stdc++.h>using namespace std;int t[1010.原创 2021-11-15 20:42:45 · 234 阅读 · 0 评论 -
练习5,搭积木——上升三角塔【记忆化搜索】
原题:USCOJ(Ov<)\首先我的思路是全部遍历一遍,#include<bits/stdc++.h>using namespace std;#define lint long longint n,h;lint ans=0;int solve(int x,int c){ for(int i=x;i<=n;i++){ if(c==h) {ans++; } if (c!=h) solve(i,c+1);原创 2021-11-05 12:54:05 · 121 阅读 · 0 评论 -
练习4,[SHOI2002]滑雪【记忆化搜索】
题源洛谷P1434 [SHOI2002]滑雪一开始看错题了,以为要求能到达的最大高度差,结果卡了好久(泪目思路源于题解#include<bits/stdc++.h>using namespace std;int R,C,a[1000][1000],d[1000][1000],ans=0; //d用来储存每个节点的最大路径int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};int solve(int x,int y){ if(d[x][y])原创 2021-10-20 23:34:04 · 69 阅读 · 0 评论 -
练习3,初见动态规划之经典的三角形问题【动态规划DP】
zhuang'tai'zhuan'yi题目为[USACO1.5][IOI1994]数字三角形 Number Triangles状态转移方程为:d(i,j)=a(i,j)+max[d(i+1,j),d(i+1,j+1)]思路源于《算法竞赛入门经典》#include<bits/stdc++.h>using namespace std;int a[1000][1000],r,d[1000][1000];int so(int i, int j){ if(d[i][j]>原创 2021-10-20 23:29:12 · 130 阅读 · 0 评论 -
练习2,从八皇后到n皇后再到2n皇后【回溯法】
从经典问题八皇后引申,现输入n,求在n*n的棋盘中,n个皇后有几种解法#include<bits/stdc++.h>using namespace std;int n,C[100],tot;void search(int cur){ if(cur == n) tot++; else for(int i=0;i<n;i++){ int ok=1; C[cur]=i; //把第cur行的皇后放在第i列 for(int原创 2021-10-14 00:00:08 · 77 阅读 · 0 评论