
算法
Restart_0813
这个作者很懒,什么都没留下…
展开
-
【摆花】题解
[NOIP2012 普及组] 摆花题目描述小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 mmm 盆。通过调查顾客的喜好,小明列出了顾客最喜欢的 nnn 种花,从 111 到 nnn 标号。为了在门口展出更多种花,规定第 iii 种花不能超过 aia_iai 盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。试编程计算,一共有多少种不同的摆花方案。输入格式第一行包含两个正整数 nnn 和 mmm,中间用一个空格隔开。第二行有 nnn 个整数,每两个整数原创 2022-05-29 15:56:17 · 488 阅读 · 0 评论 -
加分二叉树
[NOIP2003 提高组] 加分二叉树题目描述设一个 nnn 个节点的二叉树 tree\text{tree}tree 的中序遍历为(1,2,3,…,n)(1,2,3,\ldots,n)(1,2,3,…,n),其中数字 1,2,3,…,n1,2,3,\ldots,n1,2,3,…,n 为节点编号。每个节点都有一个分数(均为正整数),记第 iii 个节点的分数为 did_idi,tree\text{tree}tree 及它的每个子树都有一个加分,任一棵子树 subtree\text{subtree}su原创 2022-05-29 09:11:27 · 190 阅读 · 0 评论 -
P4933 大师
大师题目背景建筑大师最近在跟着数学大师 ljt12138 学数学,今天他学了等差数列,ljt12138 决定给他留一道练习题。题目描述ljt12138 首先建了 nnn 个特斯拉电磁塔,这些电塔排成一排,从左到右依次标号为 111 到 nnn ,第 iii 个电塔的高度为 h[i]h[i]h[i] 。建筑大师需要从中选出一些电塔,然后这些电塔就会缩到地下去。这时候,如果留在地上的电塔的高度,从左向右构成了一个等差数列,那么这个选择方案就会被认为是美观的。建筑大师需要求出,一共有多少种美观的选择方原创 2022-05-28 21:25:31 · 246 阅读 · 0 评论 -
最长公共子序列nlogn求法
首先我们可以看到,普通的O(n2)O(n^2)O(n2)的求法是不现实的,因为最大的数据量是1e51e51e5我们考虑这么一个变化,以样例为例子3−2−1−4−53-2-1-4-53−2−1−4−5我们将其映射为p1:1−2−3−4−5p1:1-2-3-4-5p1:1−2−3−4−5并且用一个数组来记录这个映射那么对于第二组数据1−2−3−4−51-2-3-4-51−2−3−4−5,我们可以将其映射为p2:3−2−1−4−5p2:3-2-1-4-5p2:3−2−1−4−5显然的,我们只需.原创 2022-05-27 16:08:02 · 894 阅读 · 0 评论 -
最大子序和
#include <bits/stdc++.h>using namespace std;#define int long long#define lc 2*pos#define rc lc+1int n,m;const int N=2*300000+50;int a[N];int tree[4*N];int s[N];int p,v;int getAnswer(int pos,int l,int r,int p1,int p2){ if (l==p1&...原创 2022-05-26 20:29:45 · 106 阅读 · 0 评论 -
给出限制条件的最短路问题
#include <iostream>#include <cstring>using namespace std;const int N=200+10;int g[N][N];const int fill_val=0x3f;const int INF=0x3f3f3f3f;int dis[N];int level[N];bool vis[N];int m,n;int res=INF;bool valid(int val,int l,int r)...原创 2022-04-02 09:31:27 · 329 阅读 · 0 评论 -
如何读入一行没给出个数的数据
原创 2022-04-01 19:41:33 · 329 阅读 · 0 评论 -
【无标题】
思路:假设A所需要的最少的钱是M,则我们想要找的是M∗W1∗W2∗...∗Wk=100,那么想要M最小,就需要W1∗W2∗...∗Wk最大,等价于logW1+logW2+....+logWk最大,等价于log(1/W1)+log(1/W2)+...log(1/Wk)最小,于是可以直接带入最短路模版假设A所需要的最少的钱是M,则我们想要找的是M*W_1*W_2*...*W_k=100,那么想要M最小,就需要W_1*W_2*...*W_k最大,等价于logW_1+logW_2+....+logW_k最大原创 2022-04-01 15:45:37 · 289 阅读 · 0 评论 -
如果数组开的是Long long 的话,不能用memset赋值,应该用fill函数
#include <bits/stdc++.h>using namespace std;#define int long longconst int N=2*10000+50;int dis[N];int ans[N];bool vis[N];int n,p,c;int cnt[N];int h[N],ne[N],target[N],w[N];int idx=1;const int fill_val=0x3f;const int INF=0x3f3f3f3f...原创 2022-04-01 11:32:52 · 1069 阅读 · 0 评论 -
双指针算法
#include <iostream>using namespace std;int n;const int N=2*100000+50;int a[N];int main(){ cin>>n; for(int i=0;i<n;i++) { int n1,s; cin>>n1>>s; for(int j=0;j<n1;j++) { ...原创 2022-03-26 09:38:51 · 339 阅读 · 0 评论 -
long long的输出要用%lld
#include <bits/stdc++.h>using namespace std;#define ll long longint t;const int N=2e5+50;int a[N];int main(){ scanf("%d",&t); for(int i=0;i<t;i++) { int n; scanf("%d",&n); for(int j=0;j<n;j++).原创 2022-03-20 14:41:43 · 4593 阅读 · 0 评论 -
Prim算法求最小生成树
#include <bits/stdc++.h>using namespace std;const int N=2*500+10;int g[N][N];int n,m;const int INF=0x3f3f3f3f;const int fill_val=0x3f;bool vis[N];int dis[N];int ans;void prim(){ memset(dis,fill_val,sizeof dis); dis[1]=0; for(i.原创 2022-03-18 21:04:01 · 252 阅读 · 0 评论 -
spfa求最短路
#include <bits/stdc++.h>using namespace std;const int N=2e5+50;const int fill_val=0x3f;const int INF=0x3f3f3f3f;int n,m;int h[N],ne[N],w[N],target[N];int idx=1;int dis[N];bool vis[N];void add(int a,int b,int c){ w[idx]=c; target[i.原创 2022-03-17 11:31:59 · 334 阅读 · 0 评论 -
对于异常值我们可以用插值(插入一条线段)使其变得好做
#include <bits/stdc++.h>using namespace std;const int N=2*30+5;int a[N][N];int n;bool valid(int x,int y){ return x>=0&&x<=n+1&&y>=0&&y<=n+1;}int dx[]={-1,1,0,0};int dy[]={0,0,-1,1};void bfs(int...原创 2022-03-10 22:11:29 · 323 阅读 · 0 评论 -
搜索计算路径应该用dfs
#include <bits/stdc++.h>using namespace std;const int N=20+5;int a[N][N];bool vis[N][N];int n,m,t;int sx,sy,fx,fy;int cnt;int dx[]={-1,1,0,0};int dy[]={0,0,1,-1};bool valid(int x,int y){ return x>=1&&x<=n&&y>=.原创 2022-03-10 09:58:55 · 74 阅读 · 0 评论 -
【无标题】
#include <bits/stdc++.h>using namespace std;const int N=1e3+50;int a[N][N];int t[N][N];const int INF=0x3f3f3f3f;const int fill_val=0x3f;int m;bool valid(int x,int y){ return x>=0&&x<=500&&y>=0&&y<...原创 2022-03-09 21:08:13 · 74 阅读 · 0 评论 -
最小的最大值记得初始化
#include <bits/stdc++.h>using namespace std;int ans;int s[10];int _max[10];int ans1;int ans2;vector<int>v[10];void output(int id,vector<int>&v,int pos){ if(pos==v.size()) { _max[id]=min(max(ans1,ans2),_m...原创 2022-03-09 19:20:51 · 152 阅读 · 0 评论 -
递归要想好终止条件
一个如下的 6 \times 66×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。上面的布局可以用序列 2\ 4\ 6\ 1\ 3\ 52 4 6 1 3 5 来描述,第 ii 个数字表示在第 ii 行的相应位置有一个棋子,如下:行号 1\ 2\ 3\ 4\ 5\ 61 2 3 4 5 6列号 2\ 4\ 6\ 1\ 3\ 52 4 6 1 3 5这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。原创 2022-03-09 18:26:58 · 558 阅读 · 0 评论 -
Bellman_ford算法
给定一个nn个点mm条边的有向图,图中可能存在重边和自环,边权可能为负数。请你求出从11号点到nn号点的最多经过kk条边的最短距离,如果无法从11号点走到nn号点,输出impossible。注意:图中可能存在负权回路。输入格式第一行包含三个整数n,m,kn,m,k。接下来mm行,每行包含三个整数x,y,zx,y,z,表示存在一条从点xx到点yy的有向边,边长为zz。输出格式输出一个整数,表示从11号点到nn号点的最多经...原创 2022-03-04 15:49:58 · 201 阅读 · 0 评论 -
堆优化版本的Dijkstra
int g[N][N]; // 存储每条边int dist[N]; // 存储1号点到每个点的最短距离bool st[N]; // 存储每个点的最短路是否已经确定// 求1号点到n号点的最短路,如果不存在则返回-1int dijkstra(){ memset(dist, 0x3f, sizeof dist); dist[1] = 0; for (int i = 0; i < n - 1; i ++ ) { int t = -1; .原创 2022-03-04 11:26:57 · 177 阅读 · 0 评论 -
Dijkstra求最短路
关于重边和自环的问题:自环不用考虑,因为算法保证了它一定无效。重边只要取最小的那条边就好了。本道题的坑点:memset是按照字节来赋值的,所以你传入的参数应该是一个字节能够表示的值,比如0x7f或者0x3f。事实证明:如果你传入的值是0x7fffffff,这个数组会变成-1.本道题第二个坑点:莫名奇妙出现的dis负数值,经过debug发现,是因为精度不够。所以我们可以采取两种方式,一种是最大值开成0x3f3f3f3f,也很大了。或者直接用long long来存储。...原创 2022-03-04 10:12:16 · 137 阅读 · 0 评论 -
最短路算法的选择
Dijkstra如何碰到了重边和自环怎么办?重边:我们发现,最短路一定每两个相邻的结点都是最小的,否则就构不成最短路,因此我们在输入的时候取min就好了。自环:不用管,同样因为每两个相邻的结点都是最小的,如果这条路里有自环就构不成最短路了。...原创 2022-03-03 21:46:41 · 395 阅读 · 0 评论 -
unordered_map和map的区别
unordered_map在查询的时候更有效,能够达到O(1)的时间。map会O(n)原创 2022-03-03 21:30:55 · 132 阅读 · 0 评论 -
树的遍历的剪枝:递归可以只用
给定一颗树,树中包含 nn 个结点(编号 1∼n1∼n)和 n−1n−1 条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。输入格式第一行包含整数 nn,表示树的结点数。接下来 n−1n−1 行,每行包含两个整数 aa 和 bb,表示点 aa 和点 bb 之间存在一条边。输出格式输出一个整数 mm,表示将重心删除后,剩余各个连通块中点数的原创 2022-03-02 19:57:14 · 293 阅读 · 0 评论 -
剪枝算法初探
#include <bits/stdc++.h>using namespace std;const int N=2*100+5;int dis[N][N];int a[N][N];int n,m;int dx[4]={-1,1,0,0};int dy[4]={0,0,1,-1};bool valid(int x,int y){ return x>=0&&x<n&&y>=0&&y<m...原创 2022-03-02 18:05:12 · 554 阅读 · 0 评论 -
递归要想好终止条件【8皇后问题】
我们使用dfs的时候,要想好递归的终止条件怎么写。这是最重要的#include <bits/stdc++.h>using namespace std;const int N=100;int a[N][N];bool col[N];bool add[N];bool sub[N];int n;void dfs(int row){ if(row==n+1) { for(int i=1;i<=n;i++) { ...原创 2022-03-02 15:10:04 · 235 阅读 · 0 评论 -
使合理化的有效trick,让二分搜索到的每一个点都是合理的
#include <bits/stdc++.h>using namespace std;const int N=3e5+50;int loc[N];int add[N];vector<int>map_loc;int n,m;int v[N];int s[N];pair<int,int>l_r[N];int get_first(int x){ int l=0,r=map_loc.size()-1; while (l<...原创 2022-03-01 22:34:10 · 82 阅读 · 0 评论 -
最长连续不重复子序列坑点:防止下标越界,恢复现场
#include <bits/stdc++.h>using namespace std;const int N=2*1E5+50;int n;int a[N];int s[N];int _max=INT_MIN;int main(){ scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } for(int j=0,i=0;j&...原创 2022-03-01 19:34:24 · 95 阅读 · 0 评论 -
P2671 [NOIP2015 普及组] 求和
我们稍加分析就能知道,z和x要么同为奇数,要么同为偶数同时限制了x<y<z且有color[x]==color[z]故我们可以开一个color数组,记录每个元素的信息,最后递推公式求出来结果即可。#include <bits/stdc++.h>using namespace std;#define ll long longconst int N=2*100000+50;const int mod_num=10007;int n,m;ll...原创 2022-03-01 16:18:56 · 272 阅读 · 0 评论 -
ACM防止爆int
P3406 海底地铁像这种边缘数据,可以很容易的构造出一种(从头到尾---从尾到头),使得爆Int因此我们应该判断好。原创 2022-02-27 21:02:25 · 282 阅读 · 0 评论 -
二分区间长度的疑惑【精度问题】
原来这里是1e-7,后来改成了1e-6就过了。。。。不知道为啥原创 2022-02-26 17:12:10 · 140 阅读 · 0 评论 -
银行贷款坑点
1.二分的范围要大一点,因为有测试点>1其次,不要被测试数据误导,还款时间不是12个月,而是输入的月份原创 2022-02-26 16:06:17 · 887 阅读 · 0 评论 -
数列分段坑点
#include <bits/stdc++.h>using namespace std;#define int long longint n,m;const int N=2*1e5+50;int a[N];bool check(int x)//x是一段和的最大值{ int cnt=1; int ans=0; for(int i=0;i<n;i++) { ans+=a[i]; if(ans&...原创 2022-02-26 11:17:53 · 139 阅读 · 0 评论 -
洛谷3853
核心:让最大距离尽可能的小容易犯错的点:不能对vector使用copy函数,内部变量的更新会出错。要想好自己的目的是什么,不要上来就写代码,得不偿失原创 2022-02-26 09:05:27 · 153 阅读 · 0 评论 -
条件判断 需要特判边界
#include <bits/stdc++.h>using namespace std;const int N=2*1e6+50;#define ll long longint a[N];int n,m;bool check(int x){ ll sum=0; for(int i=0;i<n;i++) { if(a[i]>x) { sum+=a[i]-x; ...原创 2022-02-25 15:40:05 · 260 阅读 · 0 评论 -
桶排序注意事项
for(int i=0;i<n-1;i++) { //要注意是否这个桶能够装下,常数也可以开大一点 bucket[abs(a[i+1]-a[i])]++; }原创 2022-02-25 09:14:30 · 319 阅读 · 0 评论 -
cmp函数的奇怪的题 洛谷2676
把下面的>=改成>就a了,好奇怪。。。。#include <bits/stdc++.h>using namespace std;const int N=20000+50;#define ll long longll a[N];ll n,b;bool cmp(ll &a,ll &b){ return a>=b;}ll sum;ll cnt;int main(){ scanf("%lld%lld",&n,&原创 2022-02-24 19:23:50 · 118 阅读 · 0 评论 -
string resize之后输出字符串的长度方法
原创 2022-02-24 18:28:45 · 183 阅读 · 0 评论