自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 收藏
  • 关注

原创 2022天梯赛L2-L3题解(L3-2待补,L3-3待补)

L2-1插松枝L2-2老板作息表scanf处理格式就简单很多了,排序即可#include<bits/stdc++.h>#define ll long long#define sc scanf#define pr printf#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)using namespace std;const int maxn = 1e5+ 5;struct node{ int h,m,

2022-04-29 00:17:33 971 2

原创 收集邮票(概率期望 + dp)

题目链接题意:有 n 种不同的邮票,皮皮想收集所有种类的邮票。唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是 n 种邮票中的哪一种是等概率的,概率均为 1/n。但是由于凡凡也很喜欢邮票,所以皮皮购买第 k 次邮票需要支付 k元钱。现在皮皮手中没有邮票,皮皮想知道自己得到所有种类的邮票需要花费的钱数目的期望解法:显然这是一个概率期望题,是一个等概率事件问题,首先我们需要设出两个数组d[i]表示已经取完了i张票,取完剩下邮票的期望次数,显然d[n] = 0,我们之后需要进行逆推对

2021-11-01 23:11:36 589

原创 P2986 [USACO10MAR]Great Cow Gathering G(换根dp)

这题和P3478 [POI2008]STA-Station本质上是一样的,都是用换根dp进行解决贴一个换根dp分析之后我们就可以通过一次自上而下和自下而上的换根dp,进行求解Size表示子树大小dp[i]表示当前i到子树整个连通块的所有节点的长度d[i]表示当前以i为根节点到其它节点的总长度a[i]表示在i节点有多少头牛#include<bits/stdc++.h>#define ll long long#define pii pair<int,int>usin

2021-10-19 20:33:28 176

原创 P3478 [POI2008]STA-Station(换根dp模板)

给定一个 n 个点的树,请求出一个结点,使得以这个结点为根时,所有结点的深度之和最大.一个结点的深度之定义为该节点到根的简单路径上边的数量.思路:我们在一开始解的时候,如果我们要进行暴力求解我们的时间复杂度是O(n ^ 2),之后我们可以考虑对于样例1时,当前为根节点为1时那么由这个方法我们可以通过两次dfs进行求解第一次dfs,以1为根节点,自上而下求出每个节点的深度d,和每个节点的子树大小Size第二次dfs,以1为根节点,自下而上,求出每个节点为根节点的总深度之和最后遍历一遍dp数组找到深

2021-10-19 20:26:47 129

原创 HDU3292.No more tricks, Mr Nanguo(pell 方程理论 + 矩阵快速幂)

今天刚刚学完pell 方程理论记录一下了证明略,给大家推荐两个证明比较好的博客和学习网站oi-wike-Pell方程这是一个很好的总结博客添加链接描述#include<bits/stdc++.h>#define ll long longusing namespace std;const int N = 2;const int mod = 8191;struct Matrix{ ll a[N][N]; int n,m; Matrix(int b, int

2021-10-19 20:08:32 92

原创 P2170 选学霸(并查集 + 背包dp)

P2170 选学霸解法:我们可以把k对利用并查集链接起来,之后我们可以把每一个连通块当作一个背包的物品,因为题意求的是abs(选择的学霸 - m),我们的背包体积开成2 * m即可#include<bits/stdc++.h>#define ll long longusing namespace std;const int maxn = 1e5 + 100;int fa[maxn],d[maxn],a[maxn],dp[maxn];int find(int x){ if(x =

2021-10-17 21:30:23 115

原创 Codeforces Round #748 (Div. 3)F. Red-Black Number(记忆化 + 标记数组优化剪枝)

F. Red-Black Number题意:给你一个n位的数字 让你把n位数分别染上红色或者黑色 染上红色的需要整除A个数记为r,染上黑色需要整除B个数记为b,让我们求abs(r - b)最小,2 <= n <= 40, 1 <= A,B <= 40思路:首先我们可以看到,有n位数字分成两半,那么我们一定可以想到暴力枚举所有方案就有2^n - 1种方案对吧,那么之后我们就可以想如何进行优化.对于染成红色的数之和记作flaga, 染成红色的数记作flagb, 那么我们可以看到对于

2021-10-17 13:25:51 217

原创 分组背包问题

Acwing 分组背包问题有 N 组物品和一个容量是 V 的背包。每组物品有若干个,同一组内的物品最多只能选一个。每件物品的体积是 vij,价值是 wij,其中 i 是组号,j 是组内编号。求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。输出最大价值。解法:相较于其它背包,这个题目的分组背包就是对于一组物品我们只能进行选择一个,那么我们还是需要进行考虑当前有状态转移有几个维度,当然第一维度肯定是for(int i = 1; i <= n; i++)表示第几组物品,第二维度就是f

2021-10-16 22:55:43 256

原创 多重背包问题 II(二进制拆分技巧)

Acwing 多重背包问题 II有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。0< N <= 1000 0 < V <= 2000,0 < v,w,s<= 2000解法:看到第一眼N的范围是1000,物品个数0 < s <= 2000这样的话我们可以考虑合并,我们可以把多个相同物品合并成一个这样就能将问题转化成01

2021-10-16 22:44:36 240

原创 多重背包问题 I

Acwing 多重背包问题 I有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。1 <= N,V <= 100相较于完全背包和01背包, 多重背包的就是物品使用次数有限,我们可以考虑多一维表示当前物品的使用次数, 那么我们状态转移就有三维状态,第一维就是for(itn i = 1; i <= n; i++)表示当前是哪个物品,第二维与01背包相同就

2021-10-16 22:32:46 106

原创 完全背包问题

Acwing 背包题有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。第 i 种物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。解法:相较于01背包,完全背包的物品是无限件用的,那么我们只需要进行一个小改动,第一维还是for(int i = 1 ; i <= n; i++)第二维需要改变一下,就是从体积小的开始for(itn j = a[i].v; j <= V; j++)转移方程还是dp[j] = ma

2021-10-16 22:23:36 63

原创 01背包问题

有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大输出最大价值. 1 <= N,V <= 1000解法:经典01背包问题,由于N,V比较小我们可以直接采取N*V进行,第一维就是1-N表示物品,第二维for(int j = V; j >= a[i].v; j–),转移方程就是dp[j] = max(dp[j], dp[j - a[i].v] + a[i].w)即可

2021-10-16 22:17:34 67

原创 染色法判断二分图(dfs + 染色法)

acwing 860染色法判断二分图**二分图定义:顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。二分图性质:1.如果两个集合中的点分别染成黑色和白色,可以发现二分图中的每一条边都一定是连接一个黑色点和一个白色点。2.二分图不存在长度为奇数的环解法:我们可以利用染色法进行判断,对于一个节点我们可以把它染成颜色1,或者颜色2,0表示当前未染色。我们利用dfs进行匹配,结论:如果当前出现相邻节点相同颜色说明染色失败,那么当前图

2021-10-15 15:37:04 345

原创 Codeforces Round #618 (Div. 2)E. Water Balance(单调队列 + 思维)

题目链接题意给你n个数,给你一种操作你可以选择一个区间,然后把这个区间的数变为(区间和)/(区间长度),之后让你求多次操作后字典序最小的数组a解法:1.如果当前的数字的数都是升序的,那么当前一定是字典序最小的,不需要操作直接输出.2.有一种类似andrew求凸包的方法,我们一开始维护出一个前缀和,之后我们求出1-n之间中,求出操作[l, r]能够使得a[l]变小的左端点l,最后在队列对答案进行求出即可#include<bits/stdc++.h>#define M 200009#d

2021-10-11 23:56:32 63

原创 Codeforces Round #618 (Div. 2)D. Aerodynamic(思维 + 几何)

题意:其实题意很长,一下子不太好理解,看懂了之后就好了,题目逆时针顺序给出一个凸多边形,定义一个P向量为(x,y),之将T定义为一组点,这些点是所有P(x,y)的并集,因此原点(0,0)位于P(x,y)(严格地说是在边界内和边界上,之后它又给出了一个相似其实上面很难看懂,我根本没看:),之后我就看懂了图,就是凸多边形的两个点和(0,0)组成的凸三角形是否相似,这里可以转化为当前的凸多边形是否为中心对称图形结论:中心对称图形有偶数个点,由于凸多边形是逆时针给出的点,直接求对称点的横坐标之和和纵坐标之和是否

2021-10-11 23:47:28 73

原创 Codeforces Round #618 (Div. 2)C. Anu Has a Function(思维 + 二进制)

题目链接题意给你n个数,之后定义一个函数f(x, y) = (x | y) - y,让你求f(f(…f(f(a1,a2),a3),…an−1),an)最大的a_1-a_n的顺序思路:其实我们可以发现f(x, y) = (x|y) - y可以等价于x - (x & y)即减去x和y二进制相同位的位置,那么我们可以很快的发现如果a_1-a_n结论:如果一个二进制位出现了大于1次,得到的最大值二进制1在这一位是一定不存在的,那么我们可以直接求出来最后的最大值,接下来就是调出a_1-a_n的顺序解法

2021-10-11 23:37:06 93

原创 Trie字符串统计(计算字符串在集合中出现次数)(01trie)

01trie我们可以把一个字符串放在一个树上tr[N][27] 其中N表示父亲节点,[27]表其映射的子节点,例子建树如下之后知道这样建树之后就比较好理解了#include<bits/stdc++.h>#define ll long longusing namespace std;const int maxn = 2e4 + 100;const int N = 1e5 + 5;int tr[maxn][30];char str[N];int idx,cnt[maxn],n;

2021-10-03 20:56:41 77

原创 东北四省D.Lowbit(势能线段树)

D.Lowbit有两种操作1.是对区间[l,r]内的数都加上lowbit(a[i])2.求区间[l, r]的sum由于lowbit(x)表示最低为2进制1,且一开始的a_i最多在2^32次方内,所以我们只需要维护一个区间sum,区间laz标记和一个当前位置的数是否为最高位1即可#include<bits/stdc++.h>#define ls u<<1#define rs u<<1|1#define ll long long#define sc scan

2021-10-02 23:36:45 224

原创 2021CCPC网络赛题解(1001/1009/1007/1002/1006/1012/1011/1008)

1001.Cut The Wire(模拟)1001.Cut The Wire由题意:1.当x为偶数时,与x/2进行连边2.当x为奇数时,与3*x + 1连边现在我们需要计算有多少条边(a, b),a <= n && b > n模拟即可#include<bits/stdc++.h>#define ll long longusing namespace std;int main(){// freopen("2.in","r",stdin); int

2021-10-02 15:44:59 2280

原创 P3373(线段树)

利用线段树维护区间加和区间乘#include<bits/stdc++.h>#define ll long long#define ls u<<1#define rs u<<1|1using namespace std;ll mod;int n,m;const int maxn = 1e5 + 5;ll a[maxn];struct Segtree{ int l,r; ll sum; ll add,mul;}tr[maxn << 2]

2021-09-28 00:45:39 102

原创 P2574 XOR的艺术(线段树)

利用线段树维护区间sum,然后利用一个laz维护当前区间是否需要01翻转即可#include<bits/stdc++.h>#define ll long long#define ls u<<1#define rs u<<1|1using namespace std;const int maxn = 2e5 + 5;struct Segtree{ int l,r; ll sum,laz;}tr[maxn << 2];int a[maxn];

2021-09-27 11:56:55 74

原创 洛谷P3372(线段树)

利用线段树维护区间加和区间和(懒标记做法即可)#include<bits/stdc++.h>#define ll long long#define ls u<<1#define rs u<<1|1using namespace std;const int maxn = 1e5 + 5;struct Segtree{ int l,r; ll sum,laz;}tr[maxn << 2];int a[maxn];void pushup(i.

2021-09-27 11:43:49 89

原创 Can you answer these queries III(线段树)

题目链接题意求区间的最大连续子段和和单点修改#include<bits/stdc++.h>#define ls u<<1#define rs u<<1|1#define sc scanf#define pr printfusing namespace std;const int maxn = 5e5 + 100;int a[maxn];struct segtree{ int l,r; int sum,lmax,rmax,mx; //维

2021-09-12 16:49:36 59

原创 1427C - The Hard Work of Paparazzi(dp + 简单优化)

题意:已知有r条从西到东的街道和r条从北到南的街道,之后有n行,每一行包含t_i,x_i,y_i,t_i表示t_i秒这个人出现在(x_i,y_i)这个点,假设当前你在(x,y)点,那么你到(x_i,y_i)去接这个人需要花费abs(x-x_i)+abs(y-y_i)的时间,开始你在起点(1,1),求你最多能够接多少个人解法:考虑dp,dp[i]表示前i个人最多能够接多少个人,之后我们进行维护一个mx[i]表示维护对于[1,i-1]个人最多能够接多少个人,之后就可以通过mx数组进行优化即可#include

2021-09-10 21:45:46 100

原创 F. Clear the String(区间dp)

题意:给你一个长度为n的字符串,之后你可以进行操作,一次操作,你可以删除一段连续相同的字符串,求最小操作次数使得字符串全部被删完。解法:考虑区间dp#include<bits/stdc++.h>using namespace std;const int maxn = 5e2 + 100;int dp[maxn][maxn];char str[maxn];int main(){ int n; scanf("%d%s",&n,str+1); for(int i = 1;

2021-09-07 21:41:34 124

原创 D. Omkar and Circle(思维+转移)

题意:给你一个长度为n的环,相邻两个相连,a_1跟a_2相连…a_n跟a_1相连,之后你可以选择一个数a[i],然后选择它相邻的两个数b,c,然后a[i] = b + c,之后将b,c这两个数删除,让我们求操作到最后剩余一个数的最大值解法:给的n为奇数,那么我们可以进行操作(n/2)次最后剩余一个数,考虑之后得到值就是(n + 1)/2数之和,之后发现就是每一次开头向后移两个位置,末尾的数a_(n-1)往a_1移,之后就是这几个和进行取最大即可a0 a2 a4.....an−1a2&

2021-09-07 21:37:11 173

原创 D. Minimax Problem(二分+状压)

题意:给你一个n*m的矩阵a,然后定义一个数组b,我们可以在a数组中随机选择两行i,j(1<=i,j<=n,i和j可以相等)对于k∈[1,m]b_k = max(a_i,k,a_j,k),之后我们需要去最大化k∈[1,m],b_k的最小值解法:实际解法我们可以把题意简单化就是要最大化最小值,那么可以考虑二分答案#include<bits/stdc++.h>using namespace std;const int maxn = 3e5 + 5;const int N = 1

2021-09-07 21:18:07 79

原创 P3455 [POI2007]ZAP-Queries(莫比乌斯反演)

题目链接给出 a,b,da,b,d,求满足 1≤x≤a,1≤y≤b,且 gcd(x,y)=d 的二元组 (x,y)的数量。解法:莫比乌斯反演~提出k来得到使用莫比乌斯反演得到之后将μ(d)提前得到之后μ(d)与之后的求和公式无关,就可以直接进行求解,对于第一个求和公式的n为min(n/k,m/k)之后就是简单的莫比乌斯筛和简单数论分块就能解决了如果觉得讲的不够详细^ _ ^推荐以下资料https://www.luogu.com.cn/problem/solution/P3455

2021-08-23 20:52:08 115

原创 CF1388D. Captain Flint and Treasure(拓扑排序+贪心)

原题链接对于这个问题,我们只需要考虑a[i]>=0的叠加到a[b[i]],因为a[i]加到a[b[i]]上,我们可以发现有向边考虑拓扑排序,对于a[i]大于等于0的直接叠加到a[b[i]],然后把a[i]<0的点直接存入即可#include<bits/stdc++.h>#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)#define ll long longusing namespace std;

2021-08-22 23:48:28 98

原创 新Nim游戏(线性基+Nim博弈)

原题链接传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同)。两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴。可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿。拿走最后一根火柴的游戏者胜利。本题的游戏稍微有些不同:在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴。可以一堆都不拿,但不可以全部拿走。第二回合也一样,第二个游戏者也有这样一次机会。从第三个回合(又轮到第一个游戏者)开始,规则和Nim游戏一样。如果你先拿,怎样才能保证获胜?如果可

2021-08-22 17:02:31 80

原创 [SDOI2016]排列计数(组合数+排列)

原题链接题意:给你n个数其中这那个数的范围为1-n,如果第i个数a[i]的值为i则这个数是稳定的,那么当前给出n个数,如果恰好有m个数是稳定的,求满足序列的方案数解法:第一步我们先选择出m个数是稳定的就是C(n,m),那么对于其他的n-m个数我们需要保证是错综排列的,对于这个错综排列的方案定义一个函数d[i],对于d[i]来说,d[i]的递推方程为d[i] = (d[i - 1] + d[i - 2])*(i - 1),那么我们求得答案就是C(n,m) * d[n-m]#include<bits

2021-08-22 16:38:22 83

原创 hdu1392.Surround the Trees凸包

原题链接题意:给你n个点,求它的凸包面积解法:经典Andrew算法,不过需要注意当n=2的时候是一条直线,那么计算就是两点之间的距离。n=1答案是0.00,_不然就会喜提wawawa#include<bits/stdc++.h>#define ll long long#define x first#define y secondusing namespace std;const int maxn = 1e4 + 10;int n;double eps = 1e-8;stru

2021-08-21 21:10:01 77

原创 hdu2108.Shape of HDU(简单几何)

原题链接给你n个点,让你判断给出的这n个点是凸多边形还是凹多边形。解法:我们只需要进行判断两两向量的叉积都是大于等于0即可,出现叉积小于0就是存在一个角内角和大于180。#include<bits/stdc++.h>using namespace std;#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)#define ll long long#define sc scanf#define pr pri

2021-08-21 20:21:02 135

原创 432D - Prefixes and Suffixes(kmp + dp)

原题链接题意:给你一个字符串s,让你求出一个前缀和后缀相等,并在字符串s中出现的次数。解法:kmp,对于kmp中的next数组next[j]表示在模板串s[1,j]中前缀和后缀相同的最大长度。那么我们就可以通过kmp的next数组进行匹配。next[len]获得的就是 前缀1-next[len]匹配的后缀len-next[len]+1。next[next[len]]表示前缀子串1-next[next[len]]匹配的n-next[next[len]]+1-len后缀,之后通过这个性质,我们可以利用这

2021-08-21 20:04:17 97

原创 CF1363E. Tree Shuffling(树形dp)

原题链接给你n个节点,根节点为1,第i个节点花费a_i,装入了数字b_i,它想要最后将数字c_i最后写入第i个节点。你有一种操作,就是使得u节点的子树的k个节点进行交换,产生的花费为k*a_u,求最小花费解法:考虑树形dp,题目已知1为根节点,我们可以从上往下遍历,维护一个a[i]的最小值,如果当前遍历节点的值a[i]为最小值,那么就是当前的进行修改花费是最少的,更新答案即可,注意一点更新完之后,1号节点还有剩余未匹配节点,说明无法进行交换输出-1#include<bits/stdc++.h&

2021-08-21 19:38:56 96

原创 CF1342E. Placing Rooks(容斥+组合数)

原题链接题意:n * n的棋盘有n个车,满足下面的条件1.棋盘上的每一个空格子至少能够被车走直线走到2.恰好存在k辆车互相攻击解法:1.对于第一个条件来说,我们只需要进行考虑行的,对于列的*2即可,对于k=0不考虑。2.首先我们每一个行都能够到了,所以确定了第一个条件,之后我们对于一个列放x对车,那么互相攻击就有x-1对了3.分析完1,2后,我们只需要把点放在n-k列中进行排列组合,对于放在n-k列中,答案总共有(n-k)^n,之后我们需要减去多余情况,利用容斥原理,之后我们减去多余空行为1的

2021-08-16 21:24:20 105

原创 CF1119E.Pavel and Triangles(简单贪心+策略)

原题描述题意:给你n种木棍,每种木棍的长度为2(i-1),之后会给出n个数表示长度为2(i-1)有多少根,对于每一根木棍我们只能用一次,我们需要求最多组成多少个三角形。解法:贪心,我们只需要选择当前长度相同的两个木棍,之后我们匹配比它长度小的进行匹配,之后我们在进行匹配当前长度的三个木棍,贪心策略。#include<bits/stdc++.h>#define ll long long #define pii pair<int,int>#define IOS ios::sy

2021-08-16 20:52:55 78

原创 CF474F.Ant colony(线段树+策略)

原题链接题意:给你n只蚂蚁,q个询问,对于询问来说,你可以任意选择一个区间[l,r],之后这里的蚂蚁就会相互之间作战,那么当ai和aj决斗时,如果ai能够被aj整除,那么ai的战斗点+1,当且仅当蚂蚁的战斗点为r-l的时候才不用被吃掉,让你求询问的区间,一共吃掉了多少个蚂蚁,样例:[1, 3, 2, 4 ,2]询问区间[1, 5]的时候它们分别的战斗点为[4, 0, 2, 0, 2]解法:一开始想到了区间gcd,但是考虑1的情况时候考虑了很久,之后考虑了如果区间的gcd等于最小值,说明现在最小值能够被

2021-08-13 16:11:17 98

原创 2B - The least round way(dp)

原题链接题意:从左上角走到右下角,经过路径的数字相乘得到的答案最少有多少个0解法:我们考虑生成0的有那种方法对于个位来说,我们发现只有2*5=10会产生0,那么我们就可以考虑维护到哪一个位置最少有多少个2和5,那么我们就可以维护一个三维dp,dp(i,j,k),i表示到了多少行,j表示到了多少列,k有0或 1,0表示当前有多少个2,1表示当前的状态有多少个5,特别注意,只要出现了0答案就是1,我们需要进行记录0的位置。之后,我们先跑一边O(n^2)的dp维护出dp(n-1,n-1,0)和dp(n-1

2021-08-13 10:19:26 92

原创 1400B - RPG Protagonist(暴力枚举)

原题链接原题题意就是一个主人和一个随从,主人能够拿p重量的重物,随从能够拿f重量的重物,现在有cnts把剑重量为s,cntw把战斧重量为w,那么我们最多可以携带多少把武器解法:我们只需要暴力枚举,然后加一点贪心即可,实际操作代码注释里面有哦!#include<bits/stdc++.h>#define ull unsigned long long#define sc scanf#define pr printf using namespace std;void solve(){

2021-08-13 00:30:13 136

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除