- 博客(15)
- 收藏
- 关注
原创 拓扑排序板子
拓扑排序用来解决什么问题,现在来看就是解决有图中的节点有先后顺序的问题。板子题读懂题目后拓扑排序进行模拟即可。#include<bits/stdc++.h>using namespace std;typedef long long ll;ll n,m,xx,yy,ww,cnt,fla;ll ind[110];ll head[110];ll oud[110];struct node1{ ll ci,ui; }po[110];struct node2{ ll next,y
2022-04-08 13:10:59 186
原创 次短路 Roadblocks
题目链接刚开始想了半天,想了一个(m+n)logn的做法,后来发现不能实现一条路可以走很多遍。代码如下:#include <algorithm>#include <bitset>#include <cstdio>#include <cstring>#include <ctime>#include <deque>#include <map>#include <iomanip>#include &
2022-04-07 21:32:53 141
原创 双端队列BFS
双端队列BFS本质上就是在权值只有0,1的图上最短路代替dijkstra,用双端队列代替优先队列,那么插入的复杂度从O(log)变成O(1),复杂度大大优化。正确性:因为是依次从对手弹出元素,0的就加入队首,1的就加入队尾,所以一定是总权值从小到大处理。板子题——小明的游戏#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<int,int>pii;ll n,m,xx1
2022-04-04 22:36:16 3855
原创 最优贸易题解
题目链接感觉这道题只要知道spfa算法可以枚举沿途最大点和最小点,正向和反向建图,两遍spfa即可。#include<bits/stdc++.h>using namespace std;typedef long long ll;#define maxn 500010ll n,m,cnt1,cnt2,ans;ll head1[maxn],head2[maxn]; ll dis1[maxn],dis2[maxn];ll vis1[maxn],vis2[maxn];ll val[ma
2022-04-04 09:51:22 299
原创 火柴排队题解
题目链接不难发现这个一一对应是要比乱序优秀的,即第一列最小的对应第二列最小的,第一列次小的对应第二列次小的,以此类推。不难发现和具体火柴的高度无关,只和顺序有关,那么就是需要对数据进行离散化处理(离散化处理博客),用第一列的顺序和第二列的顺序构造新的下表和数值,下面就是将一个乱序的变成一个有序的,即为求逆序对。#include<bits/stdc++.h>using namespace std;typedef long long ll;#define maxn 100010#def
2022-04-02 19:24:07 456
原创 树状数组浅谈
树状数组是干什么的:树状数组支持点修改,前缀和查询。复杂度是log级别的。如下图:设节点编号为x,那么这个节点管辖的区间为2^k(其中k为x二进制末尾0的个数)个元素。因为这个区间最后一个元素必然为Ax。树状数组的基本操作就是lowbit函数,lowbit函数的支持下完成了建树。这样的话,修改和查询操作如下:修改:因为建树的模式是固定的,所以只需要以当前节点所管辖的区间个数依次*2进行扩展,就可以了。换而言之,就是对就是加上lowbit函数值。查询的话:就是减去lowbit函数值,也就是在这个数二进
2022-04-01 14:09:52 66
原创 花神游历各国
花神游历各国分析:本质就是线段树的一个点修改,只需要打一个标记表示当前节点所代表的区间最大值是否大于1.如果大于1,那么就会继续修改,小于1则直接返回。这样最大的数1e12最多只需要修改6次,每个点的修改是logn级别的,所以最终就是6*nlogn级别的。有点类似聪明的燕姿里面其实质数的乘积可能只需要不到30个就可以达到一个很大的数。#include<bits/stdc++.h>using namespace std;typedef long long ll;#define maxn
2022-03-31 16:52:03 694
原创 最短路问题
1、Dijstra算法类似于prime算法,从起点v0开始扩展最短路。要求是不能有负边,因为有负边以后,可能最新更新的边会被更小的替代。用堆优化后,复杂度近似于O(n+m)log(m)。算法复杂度推导代码:洛谷板子题#include<bits/stdc++.h> using namespace std;typedef long long ll;#define maxn 500005#define INF 2147483647ll ai,bi,ci;ll n,m,s,cnt
2022-03-28 17:27:41 98
原创 Sumdiv poj1845
题目链接解:1、首先考虑质因数分解2、每个质因数可以取从0到该质因数对应的幂次3、所以答案就是若干个等比数列求和的结果。4、因为考虑mod,所以除以一个数等于乘以这个数的逆元,9901是质数,费马小定理求逆元5、就是关于mod运算的性质,要注意该模的时候模,不该模的时候不要乱模一篇关于模运算的文章代码如下:#include<iostream>#include<cstdio>using namespace std;typedef long long ll;#
2022-03-09 20:11:55 132
原创 Addition Chains poj
1.搜索顺序:从从大到小枚举,可以实现一部分的剪枝,个人感觉就是在枚举小的时候可能会超过最优解,直接retur。2.其实每次枚举只需要一个循环,我还很sb的要两个循环,因为剩下的循环之前已经完成了,没有必要继续下去。3.注意输入输出格式,数组不要开小。代码如下#include<iostream>#include<cstdio>using namespace std;int ans[100000],a[100000];int m,cnt;void dfs(int s
2022-03-07 18:49:23 182
原创 P1120 小木棍
题面:乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过 50。现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。解析1、回溯处理,及时return2、优化搜索顺序,先枚举大木棍,再枚举小木棍3.找出最大值,最小值,可行值代码如下:#include<bits/stdc++.h>using namespace std;int n,t,num1,num2,max_num,a
2022-03-04 07:56:05 486 3
原创 青蛙的约会 解题报告
题面:我们把这两只青蛙分别叫做青蛙 A 和青蛙 B,并且规定纬度线上东经 0 度处为原点,由东往西为正方向,单位长度 1 米,这样我们就得到了一条首尾相接的数轴。设青蛙 A 的出发点坐标是 x,青蛙 B 的出发点坐标是 y。青蛙 A 一次能跳 m 米,青蛙 B 一次能跳 n 米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。解:1、不难推出式子k(n-m)-lz=-(x-y),即ax+by=c,可以用exgcd求解。但是需要注意正负,exgcd只限于正整数,保证(
2022-03-03 20:00:13 189
原创 P1082 [NOIP2012 提高组] 同余方程解题报告
拓展欧几里得的板子题题面描述:题目描述求关于x的同余方程ax≡1(mod b) 的最小正整数解。解:先求ax+by=1的一组解,显然exgcd可以求。再求最小解。设x1,y1为ax+by的一组解,即ax1+by1=1。y1=(1-ax1)/b.显只有x累加b或者累减b即为最小解。代码如下`#include<bits/stdc++.h>using namespace std;typedef long long ll;ll a,b;void exgcd(ll &x,l
2022-03-03 18:31:24 160
原创 欧几里得算法和拓展欧几里得算法
一、欧几里得算法(辗转相除法):结论:gcd(a,b)=gcd(b,a%b)。证明:假设a,b的最大公约数为r,a=k1r,b=k2r(k1>k2)。则a%b=k1r-nk2r=(k1-nk2)r。下面要证k2和(k1-nk2)互质,利用反证法:假设k2=x1d,(k1-nk2)=x2d,则k1=x2d+nk2=x2d+nx1d。显然与k2,k1互质,与假设矛盾,证明k2和(k1-nk2)互质,原式得证。下面利用递归思想实现,递归的边界即为b==0,返回a。代码如下:int gcd(int
2022-03-03 16:27:46 2098
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人