- 博客(356)
- 收藏
- 关注
原创 B3941 [GESP样题 五级] 小杨的锻炼
这道题其实就是要求这 nn 个数的最小公倍数,这样所有人才能在一起。方法是每乘一个数后要除以最大公因数。
2024-09-06 20:07:06
220
1
原创 P3370 【模板】字符串哈希
关于进制的选择实际上非常自由,大于所有字符对应的数字的最大值,不要含有模数的质因子(那还模什么),比如一个字符集是a到z的题目,选择27、233、19260817 都是可以的。它的主要思路是选取恰当的进制,可以把字符串中的字符看成一个大数字中的每一位数字,不过比较字符串和比较大数字的复杂度并没有什么区别(高精数的比较也是。O(n)的),但只要把它对一个数取模,然后认为取模后的结果相等原数就相等,那么就可以在一定的错误率的基础上O(1)进行判断了。
2024-07-11 17:13:37
377
原创 P1030 [NOIP2001 普及组] 求先序排列
代码如下cout<<ch;//找根输出//递归左右子树;cin>>inord;//读入cout<<endl;return 0;
2024-07-10 19:54:52
262
原创 P1037 [NOIP2002 普及组] 产生数
DFS的理论时间复杂度为指数级,即O(2^k),但本题中每个数字只搜索一次,重复的直接return,因此每一位实际的时间复杂度仅为O(n)dfs(a[0]),b[0]=0;//先搜索最高位,因为最高位不能为0。Floyd的时间复杂度为O(n^3),此处n为10(表示0-9每个数字)本题中注意整数n要用字符串读入,用long long会爆,用int128。i++){//搜索其余位。void out(lll x){//int128输出要自己写。
2024-07-06 17:54:29
331
原创 P5076 【深基16.例7】普通二叉树(简化版)
动排序,还不会像set一样去重,然后用lower_bound和upper_bound去二分查找相应的值就可以。他小的,或者后面一个比他大的,也就是维护一个单调队列,那stl中有个好东西呀,multiset,自。了,但这题有个坑点,要是没有后继的话,需要输出2147483647,(题目也没说呀,导致我第一。遍就40分),所以在开始前,先手动添加一个2147483647作为最大值,这样即使本来没有后继。正解肯定是BST,但我不会BST,这可咋办嘛 读了一遍题,发现其实主要操作就是找前面一个比。
2024-06-24 11:31:24
234
原创 P2671 [NOIP2015 普及组] 求和
设一个分组里有k个数,这个分组中的数分别是x[1],x[2]……x[k],下标分别是y[1],y[2]……所以我们可以模拟x,y,z,其时间复杂度为O(n^3),由于n<=100000所以一定会超时。然后事先将y[1]+y[2]+……+y[k]求出,用的时候调用就行了,其时间复杂度为O(n)根据题目,我们可以设有三个下标,他们分别是x,y,z,要满足x<y<z且y-x=z-y。所以我们其实只要穷举x和z就行了,但这个方法的时间复杂度为O(n^2)所以还是会超时。由此我们可以得到2y=z+x。
2024-06-09 15:19:21
185
原创 P1749 [入门赛 #19] 分饼干 II
1,2,3,⋯,k] 需要的糖果数量是最少的,考虑等差数列求和公式,其和为 k×(k+1)/2。只需要判断 k×(k+1)/2 是否大于 n 即可,如果大于,则分不了。因为每名小朋友的饼干数量都 >0,且都互不相同。考虑求出分饼干数量的最小值。注意开 long long!
2024-05-05 15:13:29
106
原创 P1162 填涂颜色
为什么都是BFS,难道DFS不够简洁吗。。。(可能是因为我不会BFS吧)言归正传,这种题第一眼应该就可以看出求联通快,于是。。。从边界为起点,把所有0搞成1,然后……好像除了输出就没然后了#include<iostream>#include<cstdio>using namespace std;int a[100][100],b[100][100]={0};int n,x,y;void dfs(int x,int y){ if(x>n||x<1||y>n||y<1||a[x][y]!=0)
2024-05-04 15:00:13
348
原创 P1596 [USACO10OCT] Lake Counting S 题解
值得一提的是,加上快读等优化以后已经做到stl队列能运行时间的极致了,然而提交就算开O2优化还是会有两个测试点被T。很多人只会拿DFS写,那我来写写这两种解题方法,再分析一下深搜和广搜的优缺点。优点:同级优先搜索,在求最优解的时候可以避免许多无用的搜索,提高效率、可以避免递归。BFS就是维护一个队列,以一个点往四周搜索,如果符合条件的话就把它放进队列里。这就需要我们手写队列了以及各种优化了,但是这个代码适合bfs的初学者理解。缺点:不好写,易出问题,用stl写队列很慢。优点:好写,不易出错,浅显易懂。
2024-05-03 11:17:23
575
原创 P1605 迷宫
首先告诉大家一个好消息:bits/stdc++.h在复赛可以使用了。其次看这道简单的题目,我的策略是不考虑边界,直接初始化,将边界当作障碍。附上程序。#include<bits/stdc++.h>using namespace std;int q[101][101];int sum=0;int i,j,n,m,t,sx,sy,x,y,ex,ey;void dfs(int a,int b){ if (a==ex&&b==ey)//终止条件 { sum++;
2024-05-03 10:42:22
281
原创 P1019 [NOIP2000 提高组] 单词接龙
首先在题意上可能有些误解。两个单词合并时,合并部分取的是最小重叠部分相邻的两部分不能存在包含关系就是说如果存在包含关系,就不能标记为使用过。每个单词最多出现两次.(其实也就是读题问题。这些都是我所犯的错误,希望大家能注意一下)好了。然后是解题思路。首先是预处理,用yc[i][j]来存储 第i个单词 后连接 第j个单词 的 最小重叠部分(mt函数)后来预处理完了之后就是深搜:先从第一个到最后一个单词看一看哪个单词是指定字母为开头的,作为深搜的第一个单词,同时标记使用过一次(vis[i]++)然后继续搜吧。以
2024-05-03 10:38:25
284
原创 P1433 吃奶酪
好像没有人用状压DP啊……个人更喜欢这种复杂度比较确定的做法。设f[i][s]表示从i点出发遍历集合为s的点的路程最小值(i也包括在s里),枚举s里的其他点进行转移。边界为f[i][s]=0(s中只有i)。注意最后答案要加上到(0,0)的距离。时间复杂度O(n*2^n)#include<cstdio>#include<cmath>#include<cstring>typedef double db;db x[20],y[20],f[20][35000];template<class T> T mi
2024-05-03 10:36:39
103
原创 P9343 一曲新词酒一杯
题目思路定义两个 set 容器 first 和 second 分别表示第一和第二种操作。set 容器的好处是可以自动去掉重复的数字。我们可以想到,在以下三种情况能够全部贴上红纸:对于 1 到n 的数都有一次操作1;对于一个数 x,一次操作 1 和一次操作 2;两次及以上不相同的操作 2。接下来我们就可以实现代码了。对于第 i 次操作,记输入的数为 x。如果是操作 1,first 插入 x,否则 second 插入 x。插入后,我们就判断,当 first 的大小为 n 或者 first 和 seco
2024-05-01 19:30:50
203
原创 P1135 奇怪的电梯
1:dis[k]);(A,0),然后把上、下入队(合法的话),直到第一次出现 B,其实就是不记录。dis 还不排序的 Dijkstra,记得打标记。if(i+v<=n)//判断越界。非负),可以不考虑判断负环(但是代码里还是有)。模板 SPFA 判断负环,关于 SPFA。由于本题目边权均为 1。
2024-04-27 15:46:54
890
原创 P1443 马的遍历
STL大法好!!取百家所长成一家之言!!介绍一下用STL模板库 <queue>来广搜这道题广搜什么的自然不同我介绍; 我来介绍一下非常好用但没人用的pairqueue<pair<int,int> > q;它可以将两种数据类型的值组合成一个值存入队列中大体是这样操作:queue<pair<int,int> > q;//定义q.push(make_pair(x,y));//入队//取队首xx=q.front().first;//第一个值yy=q.front().second;//第二个值q.po
2024-04-27 15:42:37
235
P8898 [USACO22DEC] Feeding the Cows B 题解.docx
2024-02-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人