- 博客(28)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 网络流模板
Dinic算法模板 namespace Dinic{ int s,t; int d[1010],cur[1010]; bool bfs(){ for(int i=0;i<1010;i++) d[i]=-1; d[s]=0; cur[s]=head[s]; queue<int> q; q.push(s); while(!q.empty()){ int x=q.front(); q.pop();
2021-08-16 11:01:06
68
原创 2022icpc山东省赛 J.Football Match(计算几何)
题目链接题意 给定 A , B 的坐标,求出其他点的坐标,图像可以缩放,旋转。思路 按照图中的形式求出所有点坐标,然后旋转即可。。。代码#include <bits/stdc++.h>using namespace std;typedef long long ll;const double pi=acos(-1.0);struct node{ double x,y; node(double a,double b):x(a),y(b){...
2022-05-24 18:46:57
431
2
原创 CF1647D Madoka and the Best School in Russia(数论,dp,离散化技巧)
题目链接题意 给定 1e9 以内的正整数 n,d,问 n 能否由至少两种不同的方式由漂亮数相乘得到; 漂亮数的定义为:能被 d 整除,但不能被 d * d 整除;思路 n 有一系列数相乘得到,则每一个数都是 n 的因子,可以把 n 的因子枚举出,然后做完全背包,即可的得到 n 的方案数; 1e9 以内的数的因子数最多 1300 多个,完全可以枚举;在背包之前需要对因子离散化,但对 1e9 以内的数做离散化,我们开不下 1e9 的数组,如果用 map 的话,会多一个...
2022-05-02 19:57:33
236
原创 代码源每日一题Div.1 第二大数字和(set)
题目链接题意思路 我们考虑对于每一个数,有多少个区间的第二大数为该数,即可得到该数的贡献; 若当前数 x 位于下标 i 的位置,可向左右找第一个大于该数的数的位置,记为 l,r,继续找第二个大于该数的数的位置,记为 ll,rr,则该数的贡献即为,表示 x 作为第二大数,第一大数分别为右边第一个比 x 的数,或左边第一个比 x 的数; 现在问题转换为如何快速找到,两边比当前数大的第一,第二大的数,如果我们从大到小依次将数,填入数组,则当填入 x 时,在数组中...
2022-05-01 16:55:26
530
原创 L3-032 关于深度优先搜索和逆序对的题应该不会很难吧这件事(思维,树状数组)
题目链接题意思路 一时间无从下手,听了dls的讲解才有了写思路; 观察到若两个点 x,y 是有祖先关系,设 x 为 y 的祖先,则无论以什么方式遍历,x 始终在 y 的前面,我们将这样的点对记为第一类点;其余没有祖先关系的点对记为第二类点; 对与第一类点,可通过计算它与它祖先形成的逆序对,暴力枚举祖先肯定会超时,在普通逆序对计算时,我们可以通过树状数组 / 线段树等数据结构快速地得到一个点的逆序对个数,所以如果对于一个点 x,我们将其所有祖先存在树状数组中,就...
2022-04-30 20:14:51
2576
1
原创 代码源每日一题Div.2 上帝的集合(优先队列,思维)
题目链接题意思路 若我们先只看操作1,3,是不是维护一个小顶堆即可; 但现在加上操作2,对所有的数加上一个 x,用堆没法轻易地改元素的值,这里可以类比线段树中的懒标记,每进行一次操作2,我们不是真的把这个 x 加到每一个数上,而是维护一个 lazy 标记,把 x 存起来,当进行操作3时,将 lazy 加到需要输出的数上即可; 但现在还有一个问题,假设当前堆中的序列为 1,2,3,lazy 为 2,现在要往堆中加一个 4,此时改 lazy 标记不应该作用于 4...
2022-04-14 19:22:54
304
1
原创 CF375D Tree and Queries(dsu on tree,小技巧)
题目链接题意思路 明显是 dsu on tree,主要看一下怎么维护答案; 问出现次数大于 k 的颜色种类数,可开一个数组记录每种颜色的出现次数,再用树状数组或线段树维护,对于每一个次数,有多小种颜色即可,复杂度; 或者,开一个数组 num[i] 表示出现次数大于等于 i 的颜色种类数,若当前一种颜色 x, 出现次数为 cnt[x]; 再加一个颜色 x 时,在 cnt[x] 变化之前,num[ cnt[x] + 1 ] + 1,且num[ ...
2022-04-10 19:06:18
249
原创 和谐之树(求线段树结点的最大编号)
题目链接题意根据线段树的建树函数,输出线段树结点的最大编号 id;思路 线段树中编号最大的结点一定出现在深度最大的那一层的最右边(废话) 假设当前一个区间 [ l , r ] ,当其分成两个区间 [ l , mid ] , [ mid + 1 , r ] 时,设两个区间的长度分别为 x , y, 则要么 x = y,要么 x = y + 1; 如果 x = y,则形成的左右子树形状完全相同,深度也相同,编号最大的结点一定出现在右子树上,即仅考虑右...
2022-04-05 09:45:43
753
原创 代码源每日一题Div.1 拆拆(组合技术,球盒模型)
题意思路 先不考虑正负号的问题,题意是将 X 拆成若干因数放到不同位置上,我们考虑 X 的每个质因子,即对于一个质因子,可以放到任意一个位置上,即“球相同,盒不同,允许空盒”的模型,假设该质因数有 n 个,则将这 n 个数放入 Y 个位置的方案数为; 对于正负号问题,由于 X 为正数,故若存在负号,则负号的数量一定为偶数,即,通过二项式定理可得,值为代码#include <bits/stdc++.h>using namespac...
2022-03-23 13:42:31
634
原创 代码源每日一题Div.1 平方计数(枚举因子,埃氏筛)
题目链接题意思路 设,则 分别设, 则均为的的因数,且,可枚举每一个的因数,确定的值,若暴力枚举,复杂度,会T;因为对于每一个数 x,我们枚举了每一个数,但其中有很多不是x 的因数,怎样才能只枚举因数,而不枚举其他数; 我们对于每一个因数 x,枚举其能够作为谁的因数,答案显然是 x 的倍数都可以,至此问题转变成了枚举每一个数的倍数,再思考一下枚举倍数的过程,埃氏筛!!!事先保存每一个数出现的次数,通过埃氏筛枚举...
2022-03-21 18:39:57
312
原创 CF1622E Math Test(技巧)
题目链接题意 有 n 个人做 m 道题,知道每个人做题的对错情况。每个人有一个预期得分 xi 和实际得分 ri。xi 给定,而 ri 是该人做对题目的分数之和。定义 “惊喜度” 为 每个人的∣xi−ri∣ 之和。请你构造出一个每道题的分数方案,使得:分数是一个1∼m的排列。 在所有的方案中,该方案的 “惊喜度” 最大。如果有多种可能的答案,你只要输出其中一组即可。思路 学到了一个技巧,遇到绝对值的问题,可以尝试将绝对值分开,得到 ci * (...
2022-03-03 19:47:06
944
原创 CF981D Bookshelves(dp ,按位计算贡献)
题目链接题意将序列分成 k 段,每一段段内贡献为各元素之和, 然后对各段贡献进行与运算,使得最终结果最大;思路 从高到低计算每一位贡献,若该位 x 可以取 1 ,则 ans |= (1 << x), 而计算下一位时,判断 ans | (1 << (x - 1))是否能将序列分成 k 段即可; 判断方法可以用dp,f[i][j]表示前 j 个数能否分成 i 段;代码#include <bits/stdc++.h>usi...
2022-03-03 19:31:36
141
原创 代码源每日一题Div.1 选数(前缀和,抽屉原理)
题目链接题意给定 N 个正整数 a1 ,a2 ,…, an 。 要求从其中选出若干数字, 使得这些数字的和 mod N = 0 (对于每个下标最多只能选择一次)。1 ≤ N ≤ 100000,1 ≤ ai ≤ 10^9思路 原本以为是01背包,1e5的数据范围可以用bitset优化,但只能求出是否有解,没法求解; 若对原数组求取模后的前缀和 sum ,则对于sum数组中的每个数,均位于[0,n - 1],共 n 种取值,而 sum[0 ~ n] 有n + 1 个...
2022-03-01 20:32:55
347
原创 CF620E New Year Tree(线段树,状态压缩)
题目链接题意对一棵树,有两种操作:1.将以 u 为根的子树上的所有节点的颜色改为 c2. 询问以 uu 为根的子树上的所有节点的颜色数量思路可将树按dfn序放到线段树上,则操作 1 ,2 即为区间修改,区间查询操作;如何在线段树中查询区间包含的元素种类数,可以发现对于每一种颜色,在子树上的状态,只有有和没有,即0和1两种状态,且颜色种类数小于等于60,将颜色种类状态压缩,一个long long 数的每一位表示一种颜色是否出现在该区间中即可;代码#include &l
2022-02-21 13:05:51
131
原创 洛谷P4512 逛公园(线段树维护区间最大子段和)
题目链接题意 对序列 a 进行两个操作, 1.输出区间 [ l ,r ] 的最大子段和; 2.将 a[[i] 的值改为 x ;思路 线段树维护四个值,区间和 sum,包含该区间左端点的最大子段和 maxl,包含该区间右端点的最大子段和 maxr,该区间的最大字段和 mx; 线段树合并操作中,区间和等于两个子区间的区间和之和tree[p].sum=tree[p<<1].sum+tree[p<<1|1]....
2022-02-02 22:09:48
555
原创 CF1524G MinOr Tree(二进制或运算的最小生成树,按位考虑)
题目链接题意求二进制或运算的最小生成树。思路从高到低按位考虑结果,对于第 i 位,检查其是否为 0 ,若能为 0 ,则将第 i 位为 1 的所有边标记一下不能选;若该位检查不能为 0 ,则只能为 1 ,结果加 1<<i 。 检查第 i 位能否取 0 ,遍历所有未被标记且第 i 位为 0 的边,利用并查集将点聚集到一起,若所有点能聚集到一个集合中,则该位可取 0 。代码#include <bits/stdc++.h>using namespa...
2022-01-13 21:58:04
347
3
原创 CF1624E Masha-forgetful(思维,dp)
题目链接题意给定n+1个长度为m的电话号码,问第n+1个电话号码能否由前n个电话号码中的长度大于等于2的子串组成。思路第 n+1 个电话号码设为 t ;若 t 的长度小于 2 ,则不能被匹配;对于任意一个大于等于 2 的数,都可以由若干个 2 和 3 组成;则可将前n个电话号码中的长度为 2 和 3 的子串统计出来;考虑哈希的思想,用 f1[i][j] 表示长度为2的子串 ij 的信息,类似用 f2[i][j][k] 表示长度为 3 的子串 ijk 的信息;用 f[i] 表示t的
2022-01-13 21:44:30
433
原创 《计算机算法设计与分析》课程第四章 贪心
什么是贪心? 贪心顾名思义,是作出在当前看来最好的选择,例如在背包问题中,如果每件物品可以分割,我们肯定会选择性价比最高的物品装入背包,然后选择性价比次高的物品......也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,我们希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路经问题,最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的...
2021-11-14 20:35:21
557
1
原创 《计算机算法设计与分析》课程第三章 动态规划
什么是动态规划?dynamic programming is a method for solving a complex problem by breaking it down into a collection of simpler subproblems. 上面是维基百科对于动态规划的解释。个人理解,简单来说,动态规划就是把原问题分解成若干子问题,分解到子问题足够小,可以直接解决;通过先求解子问题,将每次求解子问题的结果存下来,减少重复计算;再根据子问题的结果反推原问题,得到原...
2021-10-27 20:08:54
526
2
原创 大整数乘法(分治)
最近算法课要求实现大整数乘法,于是有了这篇博客。思路普通高精度乘法即模拟竖式乘法运算,一个数的每一位都与另一个数的每一位相乘,复杂度O(n^2),考虑分治,将一个大整数分成两部分,两部分分别处理后再相加;设X=A*10^n/2+B,Y=C*10^n/2+D,则XY=(A*10^n/2+B)(C*10^n/2+D)=AC*10^n+(AD+CB)*10^n/2+BD ;但这样并没有优化时间复杂度,对AD+BC进行分解优化后得:XY=AC*10^n+[(A-B)(D-C)+AC+BD].
2021-10-04 10:49:44
1572
原创 CF1472G Moving to the Capital(bfs+dp)
题目链接题意在一张有向连通图中,边权均为1,每一个点到1号点的最短路径设为di,对于每个点有两种操作,沿着某条边,从第i个结点到第jj个结点,di<dj; 沿着某条边,从第ii个结点到第jj个结点,di≥dj;(每个点只能走一次)对于每个点,问通过上述两操作能距1号点的最短距离。思路 di数组相当于以1为起点跑一次最短路。 下面我们按di从大到小枚举维护答案,对于当前的点,只有通过2操作才能减小该点的di,且用一次2操作之后,便不...
2021-10-02 22:18:22
132
原创 2021牛客多校10 F-Train Wreck(思维,贪心,堆)
赛场上有点思路,但是没码出来...题目链接题意 有一个类似栈的车道,给定一个合法的括号序列,'('代表火车进站,')'代表出站,每个火车都有一种颜色,现在让选择合适的顺序,使得每次火车进站后,车道上的颜色序列各不相同。思路 观察一个样例()((())())(()),我们可以将每次火车进站后火车的数量记录一下,即(1)(1232)(12),可以发现数量为1的火车颜色不能相同,同样数量为2的火车颜色不能相同;但第二个括号中的2却可以与第三括号中的2颜色相同。 ...
2021-09-22 08:06:43
82
原创 CF1567C Carrying Conundrum,CF1546C AquaMoon and Strange Sort(奇偶分类讨论)
这几天做到了几道奇偶位置分开考虑的题,不太会╥﹏╥..., 记录一下。Carrying Conundrum题目链接题意 正常加法运算个位进位到十位,十位进位到百位;现在个位进位到百位,十位进位到千位,对于给定的n,问有多少种不同的正数a,b,使得a+b=n。思路 发现对于题目给定的这种方式,奇数位会进位到奇数位上,偶数位会进位到偶数位上;那么,我们将奇数位,偶数位分别存成两个数x,y,这时的进位就变成正常的进位了,此时种类数为(x+1)*(...
2021-09-08 21:49:33
108
原创 大步小步算法(BSGS)模板
BSGS 给定一个质数p,以及一个整数a,一个整数b,现在要求你计算一个最小的非负整数x,满足,若找不到则返回-1。(BSGS需满足a与p互质)ll bsgs(ll a,ll b,ll m){ static unordered_map<ll,ll> mp; mp.clear(); ll cur=1,t=sqrt(m)+1; for(int B=1;B<=t;B++){ cur=cur*a%m; mp[b*cur%m]=B; } ll no...
2021-09-03 10:12:46
460
原创 2021hdu多校1 zoto(莫队+值域分块)
题目链接题意 在坐标系中,对于1到n每个横坐标,给出其纵坐标的值,有q次询问,每次给出一个矩形的左下角和右上角,问矩形覆盖的点的不同纵坐标的数量。思路 对于没有修改操作的区间查询问题,可以观察一下莫队是否可行,若没有对纵坐标的限制,仅问横坐标区间的点的不同纵坐标的数量,可直接用莫队; 但现在加上纵坐标的限制,就要思考一下如何维护,观察到,如果先按普通莫队进行操作,确定出横坐标区间[x0,x1]的不同纵坐标的数量,取纵坐标位于[y0,y1]的不同纵坐标的...
2021-08-24 16:05:52
234
原创 2021hdu多校1 Maximal submatrix(悬线法)
题目链接题意:给定n*m的网格,求每一列都为不下降序列的最大子矩阵的大小。思路:借这个题学习了一下悬线法,悬线法顾名思义,等于一个节点,先计算该点的上边界,就像一条竖线,然后计算每条竖线的左边界和右边界,看他最多能扫过的面积就是我们要求的最大子矩阵的面积。代码:#include <bits/stdc++.h>using namespace std;int a[2010];int h[2010][2010],l[2010][2010],r[2010][2010];int
2021-08-11 20:53:41
109
原创 2021hdu多校4 Lawn of the Dead(线段树+模拟)
题目链接题意:对于n*m的网格,给定k个障碍,每次只能向右或向下移动,问从(1,1)开始,能到达的格子的数目。代码://线段树+模拟 #include <bits/stdc++.h>using namespace std;typedef long long ll;vector<int> vv[100010];struct node{ int sum[100010<<2],lazy[100010<<2]; void pu
2021-08-08 08:39:43
193
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人