自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 道路与航线题解

思路:本题第一次首先用了spfa算法,但是被卡了改进:注意到这是一个两层的图,然后我们可以在层内使用dijkstra算法,层间顺便使用dijkstra更新一下距离,这是不违反dijkstra算法的证明的。坑点:在进行层间dijkstra的时候,要记得特判可能加入进来的这个点是不是这个层的如果不是这个层的,我们就将其所在的联通块的入度-1即可。坑点2:要记得在开始的时候把所有入度为0的块都加入进去,理由是:为了保证拓扑的正常进行,如果有一个入度为0的块和别的块连接,那么这个块就可能根本进不去这个队列,所以

2022-06-06 11:23:39 185 1

原创 spfa求解变形最短路

题意:求出一条从1−n的路径,对于路径上的结点i,找出在其之前的结点的price最小值,找出在其之后的结点的price的最大值题意:求出一条从1-n的路径,对于路径上的结点i,\\找出在其之前的结点的price最小值,找出在其之后的结点的price的最大值题意:求出一条从1−n的路径,对于路径上的结点i,找出在其之前的结点的price最小值,找出在其之后的结点的price的最大值状态表示:d1[i]:从1−i的路径上,price的最小值状态表示:d1[i]:从1-i的路径上,price的最小值状态表示:d1

2022-06-05 21:37:48 132

原创 分组背包【选课】

本题是一个树上分组背包的问题状态表示:f[i][j]:以点i为root结点的树上,选择了j门课程的最高学分状态表示:f[i][j]:以点i为root结点的树上,选择了j门课程的最高学分状态表示:f[i][j]:以点i为root结点的树上,选择了j门课程的最高学分状态转移方程:f[i][j]=val[i]+max(∑f[u][k],)其中u是子结点,∑k=j−1状态转移方程:f[i][j]=val[i]+max(\sum f[u][k],)其中u是子结点,\sum k=j-1状态转移方程:f[i][j]=

2022-06-04 10:23:39 182

原创 陪审团题解

状态表示:f[i][j][k]:从前i个人中挑选了j个人,且对应的辩方总分和控方总分的差值为k,的最大总分状态表示:f[i][j][k]:从前i个人中挑选了j个人,且对应的辩方总分和控方总分的差值为k,的最大总分状态表示:f[i][j][k]:从前i个人中挑选了j个人,且对应的辩方总分和控方总分的差值为k,的最大总分状态转移方程:状态转移方程:状态转移方程:f[i,j,k]={f[i−1][j][k](不选择i)f[i−1,j−1,k−(d[i]−p[i])](选择了i) f[i,j,k]=\left\{

2022-06-03 16:16:14 188

原创 自然数拆分

状态表示:f[i][j]:前i个数字凑成j数字的方案个数状态表示:f[i][j]:前i个数字凑成j数字的方案个数状态表示:f[i][j]:前i个数字凑成j数字的方案个数状态转移方程:f[i][j]=f[i−1][j]+∑f[i−1][j−k∗i]状态转移方程:f[i][j]=f[i-1][j]+\sum f[i-1][j-k*i]状态转移方程:f[i][j]=f[i−1][j]+∑f[i−1][j−k∗i]我们注意到f[i][j−i]=∑f[i−1][j−k∗i]我们注意到f[i][j-i]=\sum

2022-06-02 16:31:12 92

原创 【合唱队】题解

[HNOI2010]合唱队题目描述为了在即将到来的晚会上有更好的演出效果,作为 AAA 合唱队负责人的小 A 需要将合唱队的人根据他们的身高排出一个队形。假定合唱队一共 nnn 个人,第 iii 个人的身高为 hih_ihi​ 米(1000≤hi≤20001000 \le h_i \le 20001000≤hi​≤2000),并已知任何两个人的身高都不同。假定最终排出的队形是 AAA 个人站成一排,为了简化问题,小 A 想出了如下排队的方式:他让所有的人先按任意顺序站成一个初始队形,然后从左到右按以下原

2022-05-31 11:10:19 173

原创 【摆花】题解

[NOIP2012 普及组] 摆花题目描述小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 mmm 盆。通过调查顾客的喜好,小明列出了顾客最喜欢的 nnn 种花,从 111 到 nnn 标号。为了在门口展出更多种花,规定第 iii 种花不能超过 aia_iai​ 盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。试编程计算,一共有多少种不同的摆花方案。输入格式第一行包含两个正整数 nnn 和 mmm,中间用一个空格隔开。第二行有 nnn 个整数,每两个整数

2022-05-29 15:56:17 450

原创 加分二叉树

[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 157

原创 P4933 大师

大师题目背景建筑大师最近在跟着数学大师 ljt12138 学数学,今天他学了等差数列,ljt12138 决定给他留一道练习题。题目描述ljt12138 首先建了 nnn 个特斯拉电磁塔,这些电塔排成一排,从左到右依次标号为 111 到 nnn ,第 iii 个电塔的高度为 h[i]h[i]h[i] 。建筑大师需要从中选出一些电塔,然后这些电塔就会缩到地下去。这时候,如果留在地上的电塔的高度,从左向右构成了一个等差数列,那么这个选择方案就会被认为是美观的。建筑大师需要求出,一共有多少种美观的选择方

2022-05-28 21:25:31 198

原创 最长公共子序列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 848

原创 最大子序和

#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&amp...

2022-05-26 20:29:45 86

原创 给出限制条件的最短路问题

#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 299

原创 如何读入一行没给出个数的数据

2022-04-01 19:41:33 300

原创 【无标题】

​思路:假设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 268

原创 如果数组开的是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 967

原创 双指针算法

#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 317

原创 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 4205

原创 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 232

原创 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 316

原创 对于异常值我们可以用插值(插入一条线段)使其变得好做

#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 297

原创 搜索计算路径应该用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 60

原创 【无标题】

#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&lt...

2022-03-09 21:08:13 59

原创 最小的最大值记得初始化

#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 129

原创 递归要想好终止条件

一个如下的 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 511

原创 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 171

原创 堆优化版本的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 146

原创 Dijkstra求最短路

关于重边和自环的问题:自环不用考虑,因为算法保证了它一定无效。重边只要取最小的那条边就好了。本道题的坑点:memset是按照字节来赋值的,所以你传入的参数应该是一个字节能够表示的值,比如0x7f或者0x3f。事实证明:如果你传入的值是0x7fffffff,这个数组会变成-1.本道题第二个坑点:莫名奇妙出现的dis负数值,经过debug发现,是因为精度不够。所以我们可以采取两种方式,一种是最大值开成0x3f3f3f3f,也很大了。或者直接用long long来存储。...

2022-03-04 10:12:16 120

原创 最短路算法的选择

Dijkstra如何碰到了重边和自环怎么办?重边:我们发现,最短路一定每两个相邻的结点都是最小的,否则就构不成最短路,因此我们在输入的时候取min就好了。自环:不用管,同样因为每两个相邻的结点都是最小的,如果这条路里有自环就构不成最短路了。...

2022-03-03 21:46:41 314

原创 unordered_map和map的区别

unordered_map在查询的时候更有效,能够达到O(1)的时间。map会O(n)

2022-03-03 21:30:55 108

原创 树的遍历的剪枝:递归可以只用

给定一颗树,树中包含 nn 个结点(编号 1∼n1∼n)和 n−1n−1 条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。输入格式第一行包含整数 nn,表示树的结点数。接下来 n−1n−1 行,每行包含两个整数 aa 和 bb,表示点 aa 和点 bb 之间存在一条边。输出格式输出一个整数 mm,表示将重心删除后,剩余各个连通块中点数的

2022-03-02 19:57:14 267

原创 剪枝算法初探

#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 525

原创 递归要想好终止条件【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 198

原创 使合理化的有效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 65

原创 最长连续不重复子序列坑点:防止下标越界,恢复现场

#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 82

原创 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 242

原创 ACM防止爆int

P3406 海底地铁像这种边缘数据,可以很容易的构造出一种(从头到尾---从尾到头),使得爆Int因此我们应该判断好。

2022-02-27 21:02:25 248

原创 二分区间长度的疑惑【精度问题】

原来这里是1e-7,后来改成了1e-6就过了。。。。不知道为啥

2022-02-26 17:12:10 125

原创 银行贷款坑点

1.二分的范围要大一点,因为有测试点>1其次,不要被测试数据误导,还款时间不是12个月,而是输入的月份

2022-02-26 16:06:17 823

原创 数列分段坑点

#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 124

原创 洛谷3853

核心:让最大距离尽可能的小容易犯错的点:不能对vector使用copy函数,内部变量的更新会出错。要想好自己的目的是什么,不要上来就写代码,得不偿失

2022-02-26 09:05:27 134

空空如也

空空如也

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

TA关注的人

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