
acwing
文章平均质量分 55
ddgo
给我高高飞起来啊!(ACM退役,转JAVA后端了)
展开
-
炮兵阵地 (AcWing292)(状压DP)
题目地址配套地址以行为突破口,先预处理每行的合法状态(每两个1之间必须大于等于两个0),然后将图中的每一行状态表示出来,用于判断这个状态是否能放置到当前行。转移必须与前两行有关。设dp(i,j,k)dp(i,j,k)dp(i,j,k)表示当前行的状态为j,上一行的状态为k,那必须k与j = 0 并且 i与j = 0 并且 i与k == 0才能转移,并且当前行选的状态能够放到当前行(因为有H),注意空间,可以用滚动数组优化。代码#define IOS ios::sync_with_stdio(fa原创 2021-05-27 17:58:28 · 220 阅读 · 1 评论 -
Strange Towers of Hanoi (acwing poj1985)
题目地址考虑3棒模式。设d[i] 表示前i个从一个棒移动到另一个棒所需要的次数 (任意一个棒都可以当中介)。对于3棒模式下,只有将前n-1个移走到B棒,n盘才可能移动到C棒.然后n移到c棒,再将前n-1个移到c棒,这个操作次数与将它们移到B棒上是一样的次数。(因为都是以三个棒为中介移动,无影响)所以可以得到 d[n] = 2 * d[n-1] + 1.对于n-1这块,也是同理,故我们得到了一个递归式子。对于4棒模式,我们可以先把前i个以四棒模式移到一个棒上,然后剩下的就是以三棒模式移到最后一个原创 2020-12-14 00:03:02 · 98 阅读 · 0 评论 -
食物链(并查集 扩展域 or 带权并查集)
题目地址1题目地址2注意,环形,假话不进行合并操作对于每一类动物,一定会有三个域,同类域(x),捕食域(x+n),天敌域(x+n+n)。给出两类动物,那么它们之间的关系:1: x,y 为同一类。 既然为同一类,把x,y的每一个域合并一下就可以了。2:x 吃 y ,则 x与y的天敌为一类, x的捕食域与y为一类,x的天敌类为y的捕食类。冲突:1: 当x,y为同一类的时候,显然下面一定不成立,x和y的捕食域在同一集合,y和x的捕食域在同一集合,x的天敌域与y在同一集合,y的天敌域与x在同一集合,原创 2020-10-30 17:36:28 · 161 阅读 · 0 评论 -
acwing 239 poj 1733 (并查集 边带权 离散化)
用s[] 表示1的个数的前缀和1: 当s[l-r] = even,则 s[l-1] 与 sum[r]奇偶性相同2:当s[l-r] = odd,则 s[l-1] 与 sum[r]奇偶性相反故可以将l-1 和 r 合并到一个集合,并且可以判断。3种情况x1与x2 同 ,x2与x3 同,则x1与x3同同,不同,不同不同,不同,同故我们可以 令 偶数为 0,奇数为 1 它们的异或对应上面的哪些情况。儿子节点与祖先节点的情况就是路径取个异或。//判断的时候就可以用祖先节点当x2 来判断x1和x3g原创 2020-09-06 21:28:29 · 119 阅读 · 0 评论 -
acwing 238 银河英雄传说(并查集)
题目地址维护size和距离的并查集。用d[i]表示i到父节点的距离。再合并的时候,子节点到合并的父节点的距离就是父节点的size。求两个点在不在同一列就是求是否在同一个集合,,它们之间隔的距离就是它们分别到父节点的距离之差减1.#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long longusing namespace std;原创 2020-09-06 20:01:45 · 137 阅读 · 0 评论 -
acwing 145 supermarket (二叉堆,并查集)
题目地址采用贪心的思想:1:按时间从小到大排序。让快过期的物品先卖,后面处理是否要卖它。设我们已经按当前最优的情况选出来了t个,当前处理的物品时间过期为t时,我们判断选出来的物品中是否有比它小的,如果有,则替换。当前处理物品时间过期为>t时,我们直接加入。故可以用堆去维护最小的那个。2:按利润从大到小的排序。我们尽可能在过期的时候去卖它。对于一个物品,过期的时间为t,则我们尽量在t的时候去卖它,若当前t已经被预定了,则往前面找空位去卖。止于0。可以用并查集去维护这句话(若当前t已原创 2020-09-06 17:46:35 · 133 阅读 · 0 评论 -
acwing 237 程序自动分析(并查集)
题目地址用 并查集将所有相关的(1)都合并到相关集合里面,再去判断所有不想关的(0)是否出现在同一个集合,若出现在同一个集合内的话说明矛盾。要用离散化去离散i,j再用find去查找i,j离散后的位置。#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long longusing namespace std;typedef pair<原创 2020-09-06 16:03:55 · 128 阅读 · 0 评论 -
acwing 213 古代猪文(lucas,中国剩余定理,欧拉定理)
题目地址根据欧拉定理 ,设q上面的系数为x,模数为mod,由欧拉定理,原式等于 qx模mod−1q^{x 模 mod-1}qx模mod−1 % mod令 mod = mod - 1处理系数,暴力求解 -> 超时。分解 mod -> 2 3 4679 35617这样可以用lucas 来优化求解C(a,b).之后可以枚举n的所有约数,求出值x后对 这4个分别mod即 x mod 2 = a1x mod 3 = a2x mod 4679 = a3x mod 35617 =原创 2020-09-04 21:21:18 · 161 阅读 · 1 评论 -
Counting swaps acwing 212 (多重集的排列数)
题目地址由题目,我们可以连接出 k 个环。单调递增排序只需拆分每个环,让每一个元素都变成自环。引理:把一个长度为n的环变成n个长度为1自环,最少需要操作n-1次。设FnF_nFn 表示长度为n的自环变成n个长度为1的自环 的操作数有通项公式FnF_nFn = nn−2n^{n-2}nn−2 可以查阅资料,化简我不会,找出前几项,贴OEIS可以得到。那么整个序列的操作数为∏l=1kFl\prod_{l=1}^kF_l∏l=1kFl 再乘 (n−k)!∏l=1k(l−1)!\frac{(n原创 2020-09-04 16:34:36 · 183 阅读 · 0 评论 -
acwing 211 计算系数(二项式定理)
题目地址直接用二项式定理Ckn⋅an⋅xn⋅bm⋅ymC_k^n \cdot a^n \cdot x^n \cdot b^m \cdot y^mCkn⋅an⋅xn⋅bm⋅ym则求Ckn⋅an⋅bmC_k^n \cdot a^n \cdot b^mCkn⋅an⋅bm因为 k < 10007 所以都会有逆元,#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<iostream>#inc原创 2020-09-04 11:17:05 · 174 阅读 · 0 评论 -
acwing 884 高斯消元解异或方程
题目地址和高斯消元解线性方程基本一致。最后return 0前面的操作中&是判断这个未知数是否对这个方程有影响#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<queue>#include<原创 2020-09-02 22:45:53 · 139 阅读 · 0 评论 -
acwing 883 高斯消元解线性方程组
题目地址模拟初等行变换就可以了。有很多种模拟,对于此题方便,有了这个模拟。从第一列开始,枚举未处理的行找到最大的主元素。交换最大主元素的行和当前行。如果最大主元素也为0,则不处理。把主元素的系数化为1.把其他未处理行的主元素列的系数都消去。继续处理,知道最后一列。之后特判r是否把所有列处理完,没有在判断是否无解还是多解。有则把每个x算出来。代码上有许多步骤解释#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);原创 2020-09-02 21:37:37 · 129 阅读 · 0 评论 -
acwing 204 poj 2891
题目地址中国剩余定理。m序列不一定两两互质的时候。考虑前两个方程,可以得到 x = k1k_1k1 * a1a_1a1 + m1m_1m1x = k2k_2k2 * a2a_2a2 + m2m_2m2则k1k_1k1 * a1a_1a1 - k2k_2k2 * a2a_2a2 = m2m_2m2 - m1m_1m1 … 1可以知道上面就是扩展欧几里得的方程。有解条件: gcd(a1a_1a1,a2a_2a2) | m2m_2m2 - m1m_1m1对于1方程我原创 2020-09-02 19:54:39 · 117 阅读 · 1 评论 -
acwing 245 Can you answer on these queries III【线段树】
题目地址线段树模板加维护。在build 和 change 中要维护一些东西。区间和sum,区间的最大连续子段和data,靠左最大连续区间和lmax和靠右最大连续和rmax.怎么维护:p = 父节点,l = 左节点,r = 右节点。p的sum =l的sum + r的sum.p靠左最大连续区间和 lmax = max(l的lmax,l的sum+r的lmax).同理 p靠右的最大连续区间和 rmax = max(r的rmax,r的sum+l的rmax)还有datap的data = max(ma原创 2020-09-02 00:01:13 · 100 阅读 · 0 评论 -
acwing208 开关问题 异或高斯消元
题目地址设ai,ja_{i,j}ai,j 表示按j后i是否会发生变化(1是0否),xix_ixi 表示第i个开关是否按(1按0不按)则可以得到 一个开关变化的过程最终结果为 sa ^ en 开始的状态异或 结束的状态。即你不管怎么按,这个开关经过层层抵消,最终要按1或者不按0.而这个过程为 a1,1x1a_{1,1}x_1a1,1x1 xor a1,2x2a_{1,2}x_2a1,2x2 xor … xor a1,nxna_{1,n}x_na1,nxn… . . . . . . .原创 2020-08-31 17:17:50 · 163 阅读 · 0 评论 -
acwing 207 球形空间产生器 高斯消元
题目地址题目指出有解。设球心为(x1,x2,…,xn) ,则我们可以得到∑j=0n(ai,j−xj)2\sum_{j=0}^n (a_{i,j} - x_j)^2∑j=0n(ai,j−xj)2 = C。将其化简,让第一行减去第二行,依次类推。可以得到∑j=0n(ai,j−ai+1,j)=∑j=0n(ai,j2−ai+1,j2)\sum_{j=0}^n (a_{i,j} -a_{i+1,j}) =\sum_{j=0}^n(a_{i,j}^2 - a_{i+1,j}^2)∑j=0n(ai,j原创 2020-08-30 22:56:11 · 116 阅读 · 0 评论 -
acwing 206 石头游戏 矩阵快速幂
题目地址构建1维数组f(num(i,j)) -> 表示第num(i,j) =((i-1)*m + j)位的石头有多少个。(i,j)表示一个位置可以知道f的长度为n*m+1.令f[0] = 1.方便后面加x个石头的操作。构造:1: 第(i,j)位置字符为’N’,且i>1,则令A[num(i,j)][num[i-1,j]] = 1.这样在矩阵相乘的时候可以让让num(i,j)位置上的石头全部转移到num(i-1,j) 上面。(转义: 当计算f(num(i-1,j))列的时候,它会加上f (原创 2020-08-30 18:18:40 · 199 阅读 · 0 评论 -
扩展欧几里得
对于 ax + by = gcd(a,b) --> gcd(b,a%b) (由欧几里得算法知道)即ax + by = bx + (a-a/b * b)y -> x = y, y = x - a/b *y 。可以用gcd计算,回溯的时候套用这个公式即可。代码:int exgcd(int a,int b,int &x,int &y){ if(b == 0){ x = 1,y = 0; return a; } int d = exgcd(b,a%b,x,y);原创 2020-08-29 23:32:44 · 97 阅读 · 0 评论 -
最幸运的数字(欧拉定理)
题目地址对于所有的88888… 可以用y = 8(10x-1)/9 来表示。由题,即求一个x,使得L|y ,设d=gcd(L,8).化简 -> 10x = 1(mod 9L/d)引用一个定理:若正整数a,n,互质,则满足ax = 1(mod n) 的最小正整数x是phi[n]的约数。phi为欧拉函数。题目数据较大,快速幂里面开两个__int128#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#includ原创 2020-08-20 17:17:02 · 366 阅读 · 0 评论 -
acwing Hankson的趣味题
题目地址对于lcm(b,x) = b1. 可以知道x是b1的一个约数。解法1: 故可以取求d的所有约数然后判断是否同时满足两个条件。解法2:假设b1通过唯一分解定理分解出来了所有质数。 对于每一个b1的质数p,假设a0,a1,b0,b1,x对应的个数为ma,ma1,mb,mb1,和 mx.考虑 gcd(a,x) = a1: -> gcd就是求两个数进行唯一分解后所有相同质因子中次数最小的乘积所以我们可以得到:1: 当ma > ma1 时,mx = ma12: 当ma = ma1原创 2020-08-18 18:46:11 · 178 阅读 · 0 评论 -
acwing 余数之和 (整除分块)
题目地址对题目化简 -> k mod i = k - ki\frac{k}{i}ik x i -> 即求 n x k - ∑i=1n∗i\sum_{i=1}^n * i∑i=1n∗i 而后面那个就是整除分块的基本模板,算的时候套一个等差数列求和公式。代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long long#原创 2020-08-17 22:32:08 · 153 阅读 · 0 评论 -
反素数
题目地址证明书上有 P141(算法进阶指南)。记录代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long long#define sc scanf#define pf printfusing namespace std;typedef pair<int,int> pii;typedef long long ll原创 2020-08-17 21:50:23 · 211 阅读 · 0 评论 -
阶乘分解
题目地址只需求出∑k=1mN/pk\sum_{k=1}^m N/p^k∑k=1mN/pk 且pk < N代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long long#define sc scanf#define pf printfusing namespace std;typedef pair<int,i原创 2020-08-15 14:37:55 · 238 阅读 · 0 评论 -
最长上升子序列dpO(n^2) 和 O(nlgn)
题目地址描述给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式第一行包含整数N。第二行包含N个整数,表示完整序列。输出格式输出一个整数,表示最大长度。数据范围1≤N≤1000,−109≤数列中的数≤109输入样例:73 1 2 1 8 5 6输出样例:4法1: 用f[i] 表示 数列中以i为结尾的最长严格单调递增的子序列的最长长度,则有当 a[i] > a[j] {j 为 0~i-1 } 中的一个数时 ,有f[i] = max(f[i],f[j原创 2020-06-25 23:23:11 · 176 阅读 · 0 评论 -
1192. 奖金(拓扑排序)
题目:由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出,Yali Company总经理Mr.Z心情好,决定给每位员工发奖金。公司决定以每个人本年在公司的贡献为标准来计算他们得到奖金的多少。于是Mr.Z下令召开 m 方会谈。每位参加会谈的代表提出了自己的意见:“我认为员工 a 的奖金应该比 b 高!”Mr.Z决定要找出一种奖金方案,满足各位代表的意见,且同时使得总奖金数最少。每位员工...原创 2020-04-08 17:35:39 · 586 阅读 · 0 评论 -
可见的点 acwing201 欧拉函数(两个筛法求欧拉函数)
题目:在一个平面直角坐标系的第一象限内,如果一个点(x,y)与原点(0,0)的连线中没有通过其他任何点,则称该点在原点处是可见的。例如,点(4,2)就是不可见的,因为它与原点的连线会通过点(2,1)。部分可见点与原点的连线如下图所示:3090_1.png编写一个程序,计算给定整数N的情况下,满足0≤x,y≤N的可见点(x,y)的数量(可见点不包括原点)。输入格式第一行包含整数C,表...原创 2020-04-04 12:20:34 · 268 阅读 · 0 评论 -
K倍区间
题目链接给定一个长度为 N 的数列,A1,A2,…AN,如果其中一段连续的子序列 Ai,Ai+1,…Aj 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K 倍区间。你能求出数列中总共有多少个 K 倍区间吗?输入格式第一行包含两个整数 N 和 K。以下 N 行每行包含一个整数 Ai。输出格式输出一个整数,代表 K 倍区间的数目。数据范围1≤N,K≤100000,1≤Ai...原创 2020-03-17 22:53:17 · 150 阅读 · 0 评论 -
最佳牛围栏(二分,前缀和)
题目:农夫约翰的农场由 N 块田地组成,每块地里都有一定数量的牛,其数量不会少于1头,也不会超过2000头。约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最大。围起区域内至少需要包含 F 块地,其中 F 会在输入中给出。在给定条件下,计算围起区域内每块地包含的牛的数量的平均值可能的最大值是多少。输入格式第一行输入整数 N 和 F ,数据间用...原创 2020-03-02 00:52:01 · 237 阅读 · 0 评论 -
激光导弹(二维前缀和)
题目:地图上有 N 个目标,用整数Xi,Yi表示目标在地图上的位置,每个目标都有一个价值Wi。注意:不同目标可能在同一位置。现在有一种新型的激光炸弹,可以摧毁一个包含 R×R 个位置的正方形内的所有的目标。激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆炸范围,即那个正方形的边必须和x,y轴平行。求一颗炸弹最多能炸掉地图上总价值为多少的目标。输入格式第一行输入正整数 N 和 ...原创 2020-03-02 00:18:54 · 350 阅读 · 0 评论 -
城市游戏(单调栈)
题目:有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。这片土地被分成N*M个格子,每个格子里写着’R’或者’F’,R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda。现在freda要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着’F’并且面积最大。但是rainbow和freda的OI水平都...原创 2020-02-29 21:12:53 · 312 阅读 · 0 评论 -
直方图中最大的矩形(单调栈)
题目:直方图是由在公共基线处对齐的一系列矩形组成的多边形。矩形具有相等的宽度,但可以具有不同的高度链接。图不知道怎么弄例如,图例左侧显示了由高度为2,1,4,5,1,3,3的矩形组成的直方图,矩形的宽度都为1:通常,直方图用于表示离散分布,例如,文本中字符的频率。现在,请你计算在公共基线处对齐的直方图中最大矩形的面积。图例右图显示了所描绘直方图的最大对齐矩形。输入格式输入包含几...原创 2020-02-28 21:35:58 · 447 阅读 · 0 评论