
算法
Fooooooo
这个作者很懒,什么都没留下…
展开
-
关于约数
例题定理 1:gcd(a,b)∗lcm(a,b)=a∗bgcd(a,b)*lcm(a,b)=a*bgcd(a,b)∗lcm(a,b)=a∗b定理 2(更相减损术):a>=b,gcd(a,b)=gcd(b,a−b)=gcd(a,a−b)a>=b,gcd(a,b)=gcd(b,a-b)=gcd(a,a-b)a>=b,gcd(a,b)=gcd(b,a−b)=gcd(a,a−b)...原创 2020-04-27 15:06:15 · 180 阅读 · 0 评论 -
树链剖分(轻重树)模板
例题#include<iostream>#include<algorithm>using namespace std;#define N 200010int n,m,r,mod;int head[N],nex[N],e[N],w[N],tot;int dep[N],fa[N],siz[N],son[N],id[N],wt[N],top[N];int cnt,...原创 2020-04-17 16:10:34 · 330 阅读 · 0 评论 -
CF1301E Nanosoft
题目链接第一印象就是我不会做这道题第一印象就是DP,然而并没有好的想法。最终看好兄弟们的题解才知道如何dp我太菜了88888先针对每一个数字求出数组二维前缀和(即每一个字母在(1,1)(1,1)(1,1)到(i,j)(i,j)(i,j)出现的次数)设$f[i][j][k]$表示以i,j为右下角,边长为k的区域内最合格区域的边长那么状态转移方程为:f[i][j][k]=max(f[i−...原创 2020-04-14 20:42:46 · 201 阅读 · 0 评论 -
P3626 [APIO2009]会议中心
题目链接首先需要知道答案的性质如果一段区间可以成为答案,那么他在答案中左面最近区间的右边界r和右面最近区间左边界l之间满足r+1->l-1#include<iostream>#include<algorithm>#include<set>using namespace std;#define N 200010#define INF 0x3...原创 2020-04-12 11:32:28 · 217 阅读 · 0 评论 -
P6198 [EER1]单调栈
题目链接#include<iostream>#include<vector>using namespace std;#define N 1000010int n;int a[N],ans[N],tot;vector<int>vec[N],t;//每个1的出现意味着单调栈空了一次,所以这些小序列一定是互不影响的。//然后每个小序列在考虑2 ...原创 2020-03-31 20:55:02 · 301 阅读 · 0 评论 -
AcWing168. 生日蛋糕
剪枝#include<iostream>#include<cmath>using namespace std;int minv[30],mins[30],ans=0x3f3f3f;int h[30],r[30];int n,m,s,v;void dfs(int d){ if(!d){ if(v==n) ans=min(ans,s);...原创 2020-02-06 21:23:39 · 208 阅读 · 0 评论 -
POJ1151 Atlantis
扫描线的做法。先对x坐标离散化,对离散化后的数组用线段树维护当前的边长。最后要考虑到,线段树递归后的合并会出现两段之间的空缺,要把每个点和他到右面邻点的距离看成是一个点。#include<iostream>#include<cstring>#include<algorithm>using namespace std;#define N 100010...原创 2020-01-30 20:27:24 · 134 阅读 · 0 评论 -
AcWing.109 天才ACM
给定一个整数 M,对于任意一个整数集合 S,定义“校验值”如下:从集合 S中取出 M 对数(即 2∗M 个数,不能重复使用集合中的数,如果S 中的整数不够 M 对,则取到不能取为止),使得“每对数的差的平方”之和最大,这个最大值就称为集合 S 的“校验值”。现在给定一个长度为 N 的数列 A 以及一个整数 TT。我们要把 AA 分成若干段,使得每一段的“校验值”都不超过 TT。求最少需要分成几段。...原创 2020-01-01 22:21:05 · 201 阅读 · 0 评论 -
最短Hamilton路径
acwing上的一道题。给定一张 nn 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径。 Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次。输入格式第一行输入整数nn。接下来nn行每行nn个整数,其中第ii行第jj个整数表示点ii到jj的距离(记为a[i,j])。对于任意的x,y,zx,y,z,数据保证 a[x...原创 2019-12-25 15:37:36 · 152 阅读 · 0 评论 -
至多删三个字符 (35分)
给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串?输入格式:输入在一行中给出全部由小写英文字母组成的、长度在区间 [4, 106] 内的字符串。输出格式:在一行中输出至多删掉其中 3 个字符后不同字符串的个数。输入样例:ababcc输出样例:25提示:删掉 0 个字符得到 “ababcc”。删掉 1 个字符得到...原创 2019-12-24 17:54:09 · 2372 阅读 · 0 评论 -
森森快递 (30分)
森森开了一家快递公司,叫森森快递。因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的NNN个城市,这些城市从左到右依次从0到(N−1)(N-1)(N−1)编号。由于道路限制,第iii号城市(i=0,⋯,N−2i=0, \cdots , N-2i=0,⋯,N−2)与第(i+1)(i+1)(i+1)号城市中间往返的运输货物重量在同一时刻不能超过CiC_iCi公斤。公司开张后很快接到了...原创 2019-12-23 14:46:59 · 1572 阅读 · 0 评论 -
7-68 凑零钱 (30分)
韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。韩梅梅手边有 10410^4104 枚来自各个星球的硬币,需要请你帮她盘算一下,是否可能精确凑出要付的款额。输入格式:输入第一行给出两个正整数:NNN(≤104\le 10^4≤104)是硬币的总个数,MMM(≤102\le 10^2≤102...原创 2019-12-22 14:42:28 · 1469 阅读 · 2 评论 -
拯救007(升级版) (30分)
在老电影“007之生死关头”(Live and Let Die)中有一个情节,007被毒贩抓到一个鳄鱼池中心的小岛上,他用了一种极为大胆的方法逃脱 —— 直接踩着池子里一系列鳄鱼的大脑袋跳上岸去!(据说当年替身演员被最后一条鳄鱼咬住了脚,幸好穿的是特别加厚的靴子才逃过一劫。)设鳄鱼池是长宽为100米的方形,中心坐标为 (0, 0),且东北角坐标为 (50, 50)。池心岛是以 (0, 0) 为圆...原创 2019-12-21 12:06:04 · 729 阅读 · 0 评论 -
7-56 周游世界 (30分)
周游世界是件浪漫事,但规划旅行路线就不一定了…… 全世界有成千上万条航线、铁路线、大巴线,令人眼花缭乱。所以旅行社会选择部分运输公司组成联盟,每家公司提供一条线路,然后帮助客户规划由联盟内企业支持的旅行路线。本题就要求你帮旅行社实现一个自动规划路线的程序,使得对任何给定的起点和终点,可以找出最顺畅的路线。所谓“最顺畅”,首先是指中途经停站最少;如果经停站一样多,则取需要换乘线路次数最少的路线。输...原创 2019-12-19 22:34:58 · 2182 阅读 · 0 评论 -
01背包问题
动态规划的开端给定一些物品的体积和价值,让求背包最多能装多少价值的东西。需要三个数组,一个v[n]装i的体积,一个w[i]装i的价值另外一个二维数组f[i][j]装在i个物品,背包重量为j下能的最大价值核心代码for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(j<v[i]) ...原创 2019-12-12 20:26:27 · 145 阅读 · 0 评论 -
最小生成树并查集做法
用结构体数组储存起点,终点,和权值 ,根据权值sort从小到大排序然后循环这个结构体数组,用并查集插入起点和终点这样的话,每次把最小权值的一条没有重复过的路纳入集合,再加个判断,并查集纳入总共会执行n-1次(因为有一个根),如果数目到n-1直接退出就好了。(一开始我很怀疑这样的做法,每次把最小权加进去,如果最后剩的那条路非常大的话,那不就出错了。但是实际上并查集有了祖宗后,只关心子孙,没被纳...原创 2019-12-12 18:28:44 · 140 阅读 · 0 评论 -
dijkstra算法
迪杰斯特拉算法用于求单源最短路径,不能有负权,可以处理有向。思路:先把二维数组map(除了0-0 1-1…)初始化为INF,然后再读入。可以用memset(map,INF,sizeof(map));同时需要一个一维副本p做标记,一个一维数组dis记录从出发点开始到各个点的最短路径。dis先读取map由s行开始从开始到最大n的值,for(int i=0;i<n;i++) dis...原创 2019-12-12 00:01:08 · 210 阅读 · 0 评论 -
Floyd算法
最短路径两个最基础的算法之一,用于求多源最短路径。其实就是三个循环套在里面,但是很难理解。for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(mp[i][j]>mp[i][k]+mp[k][j]) mp[i][j]=mp[i][k]+mp[k][j];看成两个循环...原创 2019-12-11 21:50:15 · 116 阅读 · 0 评论