04 2022 档案
摘要:求第k小的异或和,用高斯消元求更简单一些。 1 //用高斯消元求线性基 2 #include<bits/stdc++.h> 3 using namespace std; 4 #define N 10100 5 typedef long long ll; 6 int n; 7 bool zero; 8
阅读全文
摘要:任意选取元素,求最大异或和,就用线性基。 1 //不用高斯消元求线性基 2 #include<bits/stdc++.h> 3 using namespace std; 4 typedef long long ll; 5 const int M=63; 6 ll p[M];//线性基 7 bool
阅读全文
摘要:题目看似与线性方程组无关,但可以通过建模转化为线性方程组的问题。 对于一块砖,刷两次是没有必要的,我们令x=1表示刷了一次,x=0没有刷,一共有n*n个,所以相当于有n*n个未知量x。 定义aij表示i和j的关系,是邻居则为1,否则是0;我们又用0表示黄色,1表示白色,一个方格最后的颜色,取决于它的
阅读全文
摘要:1 //高斯消元法(普通方程) 2 3 const int N=110; 4 const double eps=1e-7; 5 int n; 6 double a[N][N]; 7 8 int gauss(){ 9 int r,c; 10 for(c=0,r=0;c<n;c++){//枚举列 11
阅读全文
摘要:高斯—约当消元法: 1 #include<bits/stdc++.h> 2 using namespace std; 3 double a[105][105]; 4 double eps=1e-7; 5 int main(){ 6 int n;scanf("%d",&n); 7 for(int i=
阅读全文
摘要:本题就是求两点间只经过n条边的最短路径,定义广义的矩阵乘法,就是把普通的矩阵乘法从求和改成了取最小值,把内部相乘改成了相加。 代码包含三个内容:广义矩阵乘法,矩阵快速幂,离散化; 1 #include <bits/stdc++.h> 2 using namespace std; 3 const in
阅读全文
摘要:n个数中选取k个数,判断这k个数的和是否为质数。 在dfs函数中的状态有:选了几个数,选的数的和,上一个选的数的位置; 试除法判断素数即可; 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=5e6+5; 4 int n,k
阅读全文
摘要:搜索的经典题。 我们要求木根的最小长度,就要是木根的数量尽可能多,可以发现木根的长度一定可以整除所有小木棒的总长度,从小到大枚举这个可能的长度,第一次有解的就是答案。 关心的状态:当前正在拼哪根木棍,拼到什么长度了,以及每个小木棒的使用情况。 考虑剪枝: 1.优化搜索顺序:小木棒长度从大到小枚举;
阅读全文
摘要:开两个数组:to[i][j]表示从i这个位置向下的第2j个圆盘是哪个,f[i][j]表示流满从i这个位置向下的 2j 个圆盘需要多少体积的水。 详情见代码: 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+10;
阅读全文
摘要:维护区间最值的模板题。 1.树状数组 1 #include<bits/stdc++.h> 2 //树状数组做法 3 using namespace std; 4 const int N=5e4+10; 5 int m,ma[N],mi[N],n,c[N]; 6 7 int lowbit(int x)
阅读全文
摘要:有两个问题:求位数和求后500位的数。 求位数:最后减去1对答案的位数是不影响的,就是求2p的位数,直接有公式log10(2)*p+1; 求后500位的数:容易想到快速幂和高精度; 1 #include<bits/stdc++.h> 2 using namespace std; 3 int p,f[
阅读全文
摘要:对于a[],b[]两个数组,我们应选取其中一个为基准,再运用树状数组求逆序对的方法就行了。 大佬博客:https://www.cnblogs.com/luckyblock/p/11482130.html #include<bits/stdc++.h> using namespace std; typ
阅读全文
摘要:模板题,树状数组加上离散化求逆序对。 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const int N=5e5+10; 5 int n,a[N],b[N],c[N]; 6 LL ans; 7
阅读全文
摘要:一种矩形切割的做法: 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const int maxn=1005; 5 struct node{//矩形的结构体 6 LL x1,y1,x2,y2; 7
阅读全文
摘要:这可能是我目前做过的最简单的一道noi题目了...... 先对e=1的处理,用并查集;再对e=0查询,如果这两个在同一集合中,则为“”NO“,最后都满足的话输出”“YES”; 数值很大,用一下离散化就行了。 1 #include<bits/stdc++.h> 2 using namespace st
阅读全文
摘要:分析可知:将起点和终点按照从小到大的顺序排序,对答案不会产生影响 所以此时我们得到一种模拟做法: 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=2e4+10; 4 int n,a[N],b[N],ans; 5 //模拟做
阅读全文
摘要:二维平面上的差分,我们可以对每行处理。 比如我们要把(2,2)(5,5)之间的矩形加上1,可以这样处理。 0 0 0 0 0 0 0 +1 0 0 0 -1 0 +1 0 0 0 -1 0 +1 0 0 0 -1 0 +1 0 0 0 -1 0 0 0 0 0 0 那么这道题就简单了。 1 #inc
阅读全文
摘要:题目就是要求在n*m的矩形中找出一个k*k的正方形(理想正方形),使得这个正方形内最值之差最小(就是要维护最大值和最小值),显然我们可以用单调队列维护。 但是二维平面上单调队列怎么用? 我们先对行处理,将其压缩为一个(n-k+1)*m的矩形;再对列进行处理,最终压缩为一个(n-k+1)*(m-k+1
阅读全文
摘要:看到这道题很容易想到单调栈,但我一开始想的是从后往前扫,但发现会有问题(因为这样会对后面牛的答案造成影响),所以这时我们要及时换一个思路,从前往后扫。 维护一个单调递减的栈,插入h[i]时,小等于它的数都要出栈,累加栈中元素数量,表示的意义就是:当前栈中的牛都是可以看到i这头牛的,即他们不会被i这头
阅读全文
摘要:要求我们去找一个最大矩形面积。 单调栈做法(和P1950 长方形那道题类似(一模一样))。 1 #include<bits/stdc++.h> 2 using namespace std; 3 char M[1010][1010]; 4 int n,m,h[1010],l[1010],r[1010]
阅读全文
摘要:一道数学题...... 采用分组的思想,我们要统计答案的数对满足两个条件:同奇偶,同颜色。所以可以按这两个要求分组。 然后就是分组处理了,对于每组(有k个数),这里面的任意两对数都是满足条件的,可推出下面的公式: x[k]*(y[k]*(k-2)+y[1]+y[2]+......+y[k]) x[]
阅读全文
摘要:标准的差分应用题,不要想的太复杂,写成了线段树。 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=5e6+10; 4 int d[N],a[N];//d是差分数组 5 int n,p,x,y,z,ans=1e9; 6 in
阅读全文
摘要:看到这道题,应该都能想到用二分,那问题是怎么去判定呢? 我们考虑用前缀和(a1统计w,a2统计v),枚举每个矿石,,当前判定的值是x,如果该矿石的w>=x,a1[i]=a1[i-1]+1,a2[i]=a2[i-1]+v[i];反之直接等于上一个就行了。 枚举完后,按照题目给的公式,更新它与s差值绝对
阅读全文
摘要:题目描述也没啥好说的,就是给你个你n*n的矩形(带权),求其中最大权值的子矩阵。 首先比较好想的就是二维前缀和,n<=120,所以可以用暴力。 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,f[130][130],ans=-0x3f
阅读全文
摘要:题目描述 NOI2130 即将举行。为了增加观赏性,CCF 决定逐一评出每个选手的成绩,并直播即时的获奖分数线。本次竞赛的获奖率为 w%,即当前排名前 w% 的选手的最低成绩就是即时的分数线。 更具体地,若当前已评出了 p 个选手的成绩,则当前计划获奖人数为max(1,⌊p∗w%⌋)。如有选手成绩相
阅读全文
摘要:显然的DP题..... 对于位置i,它由i-r~i-l的位置转移过来,容易得到方程 dp[i]=dp[i]+max(dp[i−r],...,dp[i−l])。 第一种:n2的暴力,只能拿部分分。 1 #include<bits/stdc++.h> 2 using namespace std; 3 c
阅读全文
摘要:先放代码...... 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=5e5+10,M=0x3f3f3f3f; 4 int n,m,a[N],sum[N]; 5 int q[N],ans=-M; 6 7 int main(
阅读全文
摘要:题目描述 给定一张 n 个点的带权无向图,点从 0∼n−1 标号,求起点 0 到终点 n−1 的最短 Hamilton 路径。 Hamilton 路径的定义是从 0 到 n−1 不重不漏地经过每个点恰好一次。 输入格式 第一行输入整数 n。 接下来 n 行每行 n 个整数,其中第 i 行第 j 个整
阅读全文
摘要:呃...这道题算是noi中比较简单的题吧...... 众所周知,位运算是个好东西,它就是对应的位进行运算,跟其他的位没有关系。 我们要选取一个m值使最后的攻击力最大,对于这个m,从高位开始枚举,判断该位选0更优还是选1更优,怎么判断呢?把该位进行n次运算不就行了吗,看最后的数是1还是0。 .....
阅读全文
摘要:1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=3e6+10; 4 int n,a[N],s[N],ans[N],top; 5 6 int main(){ 7 scanf("%d",&n); 8 for(int i=1;i
阅读全文
摘要:一道单调栈的好题啊。。。。。。 思路是很奇妙的,对于每个点(i,j),我们可以算它对答案的贡献(即包含它的矩形数量),包含该点的矩形,点的高度为h[j],点右边的高度一定大于等于h[j],左边的高度一定大于h[j]。 高有h[j]种方案,底边有(j - lj) * (rj - j)种方案,相乘就是该
阅读全文
摘要:一道妙题啊......(不知道为什么这道题的标签是网络流,不需要用网络流啊) 如果没有门和钥匙,连边(边权为1)求最短路就行了。 但是有这两个因素的限制,我们采用分层建图的思想,一共2p层,每层对应持有钥匙的2p种状态(就是状态压缩),在分层图上连边,当前层没有的钥匙,就向有该类钥匙的层连边(注意此
阅读全文
摘要:题目描述 给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有need条白色边的生成树。 题目保证有解。 一个最小生成树问题,但是我们要选need条白边,我们用g(i)表示选取i条白边的最优方案(生成树的权值最小),那么可以大致猜出g(i)是关于i的一个下凸函数,可以发现斜率k是有单
阅读全文
摘要:题目: A 国有 nn 座城市,编号从 11 到 nn,城市之间有 mm 条双向道路。每一条道路对车辆都有重量限制,简称限重。 现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。 对于每一组询问,相当于求点x到点y中所有路径中最小边权的最大值,这样就是
阅读全文
摘要:Kruskal重构树的模板题。 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N。图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_j ( 1 < = d_j < = 1,000,000,000). 现在有 K个询问 (1 < = K < = 20,
阅读全文
摘要:经典的三分问题。 一看到这道题好懵啊,无用地想了一会果断看题解,发现要用到三分,于是赶紧去补了补课... 题目大意是这样的:两条线段AB和CD在一个平面中,分别给出在AB,CD,和平面上的速度,要我们从A到D的最短时间。 因为有两条线段,我们可以三分套三分,先对AB三分,找到AB上的最优点x,在x确
阅读全文
摘要:本题介绍两种做法; 1 并查集 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1000005; 4 int fa[N],n; 5 bool vis[N]; 6 7 int getf(int a){ 8 if(fa[a]=
阅读全文
摘要:经典的线性DP例题,用f[i]表示以第i个位置结尾的最大连续子段和。 状态转移方程:f[i]=max(f[i],f[i-1]+a[i]); 这里省去了a数组,直接用f数组读数据,如果f[i-1]<0,那么f[i]肯定不会加上它,f[i]=a[i],相当于是从此时的i位置重新计算最大连续子段和;如果f
阅读全文
摘要:尺取法的经典题目: 博览馆正在展出由世上最佳的 mm 位画家所画的图画。 游客在购买门票时必须说明两个数字,aa 和 bb,代表他要看展览中的第 aa 幅至第 bb 幅画(包含 a,ba,b)之间的所有图画,而门票的价钱就是一张图画一元。 Sept 希望入场后可以看到所有名师的图画。当然,他想最小化
阅读全文
摘要:大模板 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e4+5; 4 int n,m,a[N],w[N]; 5 struct node{ 6 int fa,lc,rc,rv; 7 #define lc(x) t[x].
阅读全文
摘要:类似题目(一模一样):http://poj.org/problem?id=1149 我这里以poj1149的PIGS为例, 新建源点s和汇点t,n个顾客作为中间的点,,对于每个顾客,他可以解锁一定的猪圈,枚举这些猪圈,如果当前枚举的猪圈是第一次解锁,由s向该顾客连边,容量为初始时该猪圈中猪的数量;如
阅读全文
摘要:题目大意:一个矩阵,一些点被拿掉,在棋盘上马走日,马之间不能落在同一点,求最多放几匹马。 采用对矩阵黑白染色,画个图可以发现:马可以走到的位置和他所处的位置颜色不同,将马和他可以走到的位置连边,最多可以放多少马,相当于求图的最大独立集(任意一条边的两个端点不会同时被选中)。 用黑白染色将节点按颜色分
阅读全文
摘要:读题,只经过困难值小于等于x的路径,容易想到用Kruskal重构树;又要查询第k高的山峰,我们选择用主席树求解。 先做一棵重构树,跑一遍dfs,重构树中每一个非叶子节点对应一段区间,我们开range[x][0/1]数组来履行此职责,表示该节点维护的最左(最右)的叶子节点。每跑到一个叶子节点就把他插入
阅读全文
摘要:实际上是一个最短路问题,但加上了海拔这个条件限制,要在海拔<水位线p中找最短路。 这里使用Kruskal重构树,将其按海拔建成小根堆,我们就可以在树中用倍增找出他不得不下车的点;树中节点有两个权值L(最短路)和a(海拔),找到我们想要的a,此时的L就是答案。 来看一下总的算法分析吧...... 先按
阅读全文
摘要:标准的费用流问题,关键在于巧妙地建模 一共有n个月份,源点设为0,汇点设为n+1 1.源点向所有月份连边,容量为正无穷,费用为该月进货的费用 2.每个月向下一个月连边,容量为仓库容量,费用为存货费用 3.每个月向汇点连边,容量为该月卖货的数量,费用为0(卖货不会产生费用) 用最小费用最大流求解即可
阅读全文
摘要:记得把数组开大一点,不然就RE了。。。 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define int long long 4 const int N=5e5; 5 const int M=5e5; 6 const int INF=0x3
阅读全文
摘要:1 #include<bits/stdc++.h> 2 #define int long long 3 using namespace std; 4 const int maxn=5005; 5 const int inf=0x3f3f3f3f; 6 int tot,n,m,s,t,x,y,z,d[
阅读全文
摘要:最近才学了cdq,所以用cdq写的代码(这道题也是cdq的模板题) 这道题是个三维偏序问题,先对第一维排序,然后去掉重复的,然后cdq分治即可。 为什么要去掉重复的呢?因为相同的元素互相之间都能贡献,而cdq过程中只能左边贡献右边的,所以要去重。 1 #include<bits/stdc++.h>
阅读全文
摘要:一位大佬写的代码。(加上我自己的一些习惯性写法) 存个模板。 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+5; 4 int n,m,a[N],w[N]; 5 struct node{ 6 int fa,lc,r
阅读全文
摘要:模板题。 打区间翻转标记,要翻转区间[l, r] ,需要将l - 1翻转到根,再将r + 1翻转至根节点的儿子,因此要设立首尾哨兵。 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 1e5 + 10, inf = 1
阅读全文
摘要:一个次短路的问题,可以套用dijkstra求最短路的方法,用dis[0][i]表示最短路;dis[1][i]表示次短路,优先队列中存有最短路和次短路,然后每次找到一条道路对他进行判断,更新最短或次短路, 注意求次短路时不要打标记,因为有可能再次访问到该节点。 最后的答案就是dis[1][n]。 1
阅读全文
摘要:学了矩阵,练一下手。。。 1 #include <bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const int mod = 1e9 + 7; 5 struct Matrix { 6 ll g[3][3]; 7 Mat
阅读全文
摘要:来学习一下单调队列: 他只可以从队尾入队,但可以从队尾或队首出队,来维护队列的单调性。单调队列有两种单调性:元素的值单调和元素的下标单调。 单调队列可以用来优化DP。状态转移方程形如dp[i]=min{dp[j]+f[j]},i-a<=j<=i-b。i增加1,j的上下界都增加1,即加入一个新的决策到
阅读全文
摘要:学了这么久连模板都没有写过,我来补个坑...... 将行看成集合X,列看成Y,障碍看成是X到Y的一条边。 消除次数最少,等价于最小点覆盖问题,最小点覆盖=最大匹配数,跑一遍匈牙利就行了 #include<bits/stdc++.h> using namespace std; int n,k; int
阅读全文
摘要:题目大意: 给一棵有 n 个顶点的树,每条边都有一个长度(小于 1001 的正整数)。定义 dist(u,v)=节点 u 和 v 之间的最小距离。给定一个整数 k,对于每一对 (u,v) 顶点当且仅当 dist(u,v) 不超过 k 时才称为有效。编写一个程序,计算给定树有多少对有效。 算法分析:
阅读全文
摘要:学习了一下用Floyd求最小环,思路还是比较清晰的。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 using namespace std;
阅读全文
摘要:T1 最大约数和 先放一下我考时的代码。(没想到能A过洛谷的数据,可能是洛谷的数据有点弱) #include<bits/stdc++.h> using namespace std; int n,ans,R; struct node{ double v; int num,sum; }a[1010];
阅读全文