- 博客(234)
- 资源 (2)
- 收藏
- 关注
原创 915历年编程题_汇总与分析(2014~2023)
em....这篇博客主要是自己复习专业课来用的,由于都是编程题,我觉得还是以博客的形式把代码和个别思路写下来会好一些。由于这些代码并没有提交AC,所以出错概率很大(毕竟以前比赛自己一次AC的经历也不是很多),如果发现哪里有问题,欢迎在评论区留言讨论。.................................
2022-08-14 23:31:26
4049
10
原创 Acwing提高课DP二刷(考研复习)
DP1.acwing1010 导弹拦截题目大意:利用若干组互相独立的单调序列去覆盖原序列思路:贪心解决2.AcWing 187. 导弹防御系统思路:爆搜+贪心3.AcWing 272. 最长公共上升子序列思路:dp(i,j)表示a数组从前i个数里面选,b数组从前j个数组里面选,且以bj结尾的最长公共上升子序列的长度,然后根据题意进行状态状态转移。PS:直接进行状态转移会发现这题会超时,可以先把超时的代码写下来,然后再做等价变形。背包转移的化简与此相同,这种等价变形类的DP可以说很经典了.
2022-04-04 16:47:53
779
原创 D. Martial Arts Tournament(暴力)
题解:因为一共就三段,每段要求是2的整数次幂,所以直接枚举前两段的长度,然后暴力答案就行了。AC代码:#include <bits/stdc++.h>//#define int long long#define x first#define y secondusing namespace std;const int N=1e6+5;typedef pair<int,int> PII;int n;int mp[N];int work(int w1,int w2)
2022-01-17 12:03:31
792
原创 D. Not Adding (数论 gcd 筛法)
题解:这题我们最终是看有多少个gcd可以被加在数组后面,因为gcd只会变小不会变大,所以我们最多将1~A中的所有数都加进来(A是整个数组元素的最大值)。所以我们可以考虑对于暴力1到A的每一个数,看这个数(下面记为x)能否由数组中的gcd凑出来。一共只有两种情况:1.x本来就是数组元素的一个数2.x是多个数组元素的gcd对于以上两种情况,我们可以用筛法的思想,对于每个x我们枚举x的倍数y,如果y在数组元素中,我们对其做一次gcd,如果最后的所有的y的gcd就是x,那么说明x一定是可以被凑出来的,且这样不
2022-01-16 11:17:58
823
原创 G. MinOr Tree (思维+最小生成树)
题解:本题最小生成树权值被定义为所有边权与的值。又因为我们只需要求出最终的权值就行了,不必关心中间过程。所以直接从最终权值res考虑,拆分成二进制后从高位到低位一位一位去看:若当前位上为0的所有被边可以构成一个连通块,那么就从这个基础上继续考虑下一位(即当前位上为1的边就打个标记后面不考虑了);否则我们肯定要至少找出来一个当前位为1的边继续连直到构成一个连通的树位置(即这一位必须是1)。AC代码:#include <bits/stdc++.h>#define int long long
2022-01-12 09:32:26
596
原创 2018焦作区域赛 F - Honeycomb Gym - 102028F(BFS)
图看起来很复杂,但是仔细想想其实根本就不用建图,一共六个方向直接bfs就行,具体见代码。AC代码:#include <bits/stdc++.h>#define x first#define y secondusing namespace std;const int N=5010,M=7010;typedef pair<int,int> PII;PII St,ed;int n,m;char g[N][M];int dx[6]={2,2,-2,-2,4,-4};
2021-11-06 20:26:45
195
原创 2823: 探姬给同学们送糖果(bfs,郑轻新生周赛)
因为男生周围都是女生,女生周围都是男生所以送糖男位置确定以后整张图就确定了。这时候你把所有女生全部抽出来组成一张图,从一个女生到另一个女生可以走的方向有8个(上下左右加对角线)然后每个相邻点之间的距离都是固定的(都是2),这时候这个题就变成了普通的bfs问题。em…另外还有一个细节问题,改天再补充,太困了先睡觉了。AC代码:#include <bits/stdc++.h>#define int long longusing namespace std;const int N = 1e
2021-11-06 00:08:42
459
原创 2021CCPC河南省赛 E:闯关游戏(简单DP)
(em…有几个学弟最近问了这题,这里写一下题解吧,另外吐槽一下,我博客里写的很多dp标的都是简单dp,这里不是我觉得这些dpj简单,只是我最初学dp的时候大部分除了背包,数位dp等比较特殊的dp外都记成简单dp了,这里的简单是base,不是easy)题解:dp(i,j)表示已经闯到了第i关,且当前已经消耗的体力为j时的最大价值。那么显然由题意根据上一步是从消耗a体力还是从消耗b体力转移过来的进行集合划分,即:1.若从a转移,则dp(i,j)=dp(i-1,j-a)+b; 2.若从b转移,则dp(i,
2021-11-03 21:34:55
2846
原创 Codeforces Round #753 (Div. 3) F. Robot on the Board 2(记忆化搜索 好题)
刚开始我想直接搜会超时,但是后来看完大佬的记忆化才恍然大悟。因为每一个点的下一次的方向都是固定的,所以每一个点的转移都是唯一的,(如果四个方向任意走,那就不能记忆化了),所以可以记忆化搜索。这个题可以利用记忆化线性时间处理出来每个点能到的最远距离。具体看代码。(PS:注意这个题CF用G++14能过,但是G++17会爆栈)AC代码:#include <bits/stdc++.h>#define x first#define y second//#define int long lon
2021-11-03 20:38:45
524
原创 Codeforces Round #753 (Div. 3) E. Robot on the Board 1 (模拟)
题解:我们先不考虑边界问题,先把机器人整个运动轨迹按从(1,1)点开始给画出来,然后再把这个图放到我们的原图中去。如果画图的过程中出现了水平方向或者竖直方向的所到达的最远距离已经超过了题目给定的边框范围,则停止画图,输出答案。注意我们输入的其实是我们到过的坐标最小的点(即最左上角的点),因为我们默认这个点是(1,1),如果再变小可能变成负值,所以要以(1,1)点做一次中心对称讲这个点(其实是整张图)平移到原图中。感觉说的不是很清楚,具体看代码吧AC代码:#include <bits/stdc++.
2021-11-03 15:58:25
415
原创 2021CCPC河南省赛 B:使用技能(期望,组合数学)
我们可以发现决定每个技能造成最终伤害的是由这个技能出现的次数决定的,跟技能的种类还有位置这些都没有关系。所以我们可以考虑枚举技能出现的次数。期望的分母很好考虑,就是mn,下面考虑分子部分。先考虑只有一个技能时,我们对于一个技能枚举其使用了i次,那么就相当于从n个技能槽中选i个技能槽放这个技能,即C(n,i)。然后还剩下n-i个技能槽,每个技能槽都可能放其余的m-i个技能,即(m-1)n-1种可能。由题意这个技能的伤害为i2,则对于这一个技能其所造成伤害的总量即为C(n,i)*(m-1)n-1*i2,又因
2021-11-02 12:20:37
401
原创 Codeforces Round #752 (Div. 2) C. Di-visible Confusion (思维暴力))
题解:根据题意如果2~i+1范围内没法整除就删掉吗,这题其实最多暴力前100就行,因为如果前100有不能整除的,那么这个数一定可以删掉。但是如果前100都能被整除,也就是前100每个数都是这个数的因子,那么这个数就太大了绝对超过了1e9(因为这个数至少是100的阶乘了么),那么在题目范围内这个样的数就不存在了,所以遍历前100是肯定够的。AC代码:#include <bits/stdc++.h>#define x first#define y second#define int lon
2021-11-01 10:28:46
330
1
原创 2021CCPC河南省赛赛后总结(终于拿金了呜呜呜)
第二次参加河南CCPC省赛,终于拿金了,哈哈哈哈哈哈。整体体验:因为疫情这次又是线上举行,不过这次我觉得我们学校还是挺棒的,相比去年随便办办,这次找了两个学妹当志愿者插气球还有赛场相关的一些,比去年正式一些。感觉有了气球就有了现场赛的感觉(就是人少了点,我们只有三个队参赛)。最后跟以前我们每次参加比赛一样,这次又是我们学校历史最好的成绩,一金二银(没办法,以前太拉了,我们这届之前只有铜牌和打铁)。比赛完请大家吃了顿饭,(可惜封校只能点外卖了),今天还是挺快乐的哈哈哈。关于题目:em…这套题怎么说,感觉怪
2021-10-30 21:57:08
3921
8
原创 D. GCD of an Array(mutiset维护gcd)
ps:这题主要是对stl中mutiset的使用要熟悉AC代码:#include <bits/stdc++.h>using namespace std;const int N= 1e6+5,mod=1e9+7;typedef long long ll;int n,m;multiset<int>s[N];map<int,int>mp[N];ll res=1;ll qmi(ll a,ll b){ ll res=1; while(b){ if(b&a
2021-10-29 15:51:30
164
原创 Codeforces Round #751 (Div. 2) D. Frog Traveler(BFS)
题解:因为我们最多把所有的点跳一遍么,所以直接BFS模拟一下就行了。注意现在跳的点不能是以前已经跳过的点,并且只能越跳越高,否则没有意义,这样就保证了时间复杂度是线性的。AC代码:#include <bits/stdc++.h>#define int long longusing namespace std;const int N=1e6+5;int n;int a[N],b[N];int pre[N],d[N];bool st[N];void bfs(){ for(int
2021-10-26 18:25:06
321
原创 2020CCPC河南省赛 二进制与、平方和(线段树)
AC代码:#include <bits/stdc++.h>//#define int long longusing namespace std;const int N=4e5+5,mod=998244353;typedef long long ll;int n,m;ll w[N];struct node{ int l,r; ll sum; int x[30]; }tr[N*4];void pushup(int u){ tr[u].sum=(tr[u<<1
2021-10-26 11:51:11
355
1
原创 E. Pchelyonok and Segments(简单DP)
题解:先将整个数组翻转,然后令dp[i][j]状态表示为表示从前i个数里面选,且选了j段数,属性为最后一段数的sum的最大值。然后根据最后一段的数的最后一个是否是第i个数进行状态转移。详见代码。AC代码:#include <bits/stdc++.h>#define int long longusing namespace std;typedef long long ll; const int N=1e5+5,M=505;int n;int a[N];int sum[N];
2021-10-25 14:03:34
449
2
原创 F1 - Korney Korneevich and XOR (easy version)(暴力+简单DP)
题解:我们发现整个数组中最大值才500,那么异或和得最大值肯定不超过512,所以我们可以暴力枚举异或和的,看当前的异或和值是否存在,记录对应的异或和的值的子序列的最后一个元素并不断跟新,这样我们就可以做DP了。AC代码:#include <bits/stdc++.h>//#define int long longusing namespace std;typedef long long ll; const int N=2e5+5,INF=0x3f3f3f3f;int n;int
2021-10-25 12:00:27
342
1
原创 2021上海省赛 小 A 的卡牌游戏 Gym - 103186B (贪心+DP)
AC代码:#include <bits/stdc++.h>#define int long longusing namespace std;const int N=5010;int n,a,b,c;int dp[N][N];struct node{ int a,b,c; bool operator<(const node &t) const{ return b-a>t.b-t.a; }}v[N]; main(){ cin>>n&g
2021-10-24 16:17:54
1582
原创 2021上海省赛 Zztrans 的班级合照 Gym - 103186D (简单DP)
先考虑一下如果每个数都不是相同的情况,先从小到大排序,假如我们已经排了前s个人,且有j人在第一排,我们只需要保证第一排的的人数一直大于等于第二排就可以满足题目列递增,且行递增的要求了。如果存在一些数相同,我们把这些数当成一个点,状态转移的时候枚举一下这个数里有多少数在第一排即可。最后答案再乘上各个数个数的阶乘就可以了。AC代码:#include <bits/stdc++.h>#define int long longusing namespace std;const int N=5
2021-10-24 15:34:49
335
原创 1598D - Training Session(思维,组合数学)
AC代码:#include <bits/stdc++.h>#define int long longusing namespace std; const int N = 1e6+5;int n;int a[N],b[N];void solve(){ cin>>n; map<int,int>ma,mb; for(int i=0;i<n;i++){ cin>>a[i]>>b[i]; ma[a[i]]++,mb[b[
2021-10-17 15:41:39
163
原创 D2. Half of Same(模拟退火)
AC代码:#define x first#define y second#define int long longusing namespace std;const int N=4e5+5;int n;int a[N];bool check(int k){ //cout<<"******"<<k<<endl; map<int,int>mp; for(int i=0;i<n;i++){ int x=(a[i]+k*N)%k;
2021-10-14 19:29:29
219
原创 Codeforces Round #747 (Div. 2) D. The Number of Imposters(扩展域并查集)
官方题解好像是二分图,em…个人觉得这题扩展域并查集更简单好理解一些。AC代码:#include <bits/stdc++.h>#define int long longusing namespace std;const int N=2e6+5,mod=1e9+7;int n,m;int p[N],s[N];int find(int x){ if(x!=p[x]) p[x]=find(p[x]); return p[x];}void merge(int a,int b
2021-10-09 16:58:32
340
8
原创 Codeforces Round #716 (Div. 2)D. Cut and Stick(莫队维护区间众数)
AC代码:#include <bits/stdc++.h>//#define int long long#define x first#define y secondusing namespace std;typedef pair<int,int> PII;const int N=4e5+6;int n,m,len;int w[N],ans[N];int cnt[N],num[N];struct node{ int id,l,r;}q[N];int g
2021-09-18 14:47:49
122
原创 考研算法题:最短边数最短路
题目:代码1:#include <iostream>#include <cstring>#include <queue>#include <algorithm>using namespace std;const int N=1e6+5;int n,m;int h[N],e[N],ne[N],w[N],idx;int dist[N],cnt[N];bool st[N];void add(int a,int b,int c){ e[id
2021-09-11 18:04:32
736
3
原创 Educational Codeforces Round 109 (Rated for Div. 2)D. Armchairs(基础DP))
题解:设dp(i,j)表示前i个人坐上前j个椅子的最小代价,根据第j个椅子是否被i坐进行集合划分可分为两种状态,若i坐上了j即dp[i][j]=dp[i-1][j-1]+dist(i,j),否则dp[i][j]=dp[i][j-1]。AC代码:#include <bits/stdc++.h>#define int long long#define x first#define y secondusing namespace std;typedef pair<int,int&g
2021-09-07 12:02:48
195
原创 Codeforces Round #742 (Div. 2)E. Non-Decreasing Dilemma(线段树统计上升序列个数)
加粗样式题解:线段树内每个节点维护区间内上升序列个数sum,以左端点为起点的最长上升子序列长度(记为ll)和以右端点为起点的最长上升子序列长度(记为rr)。关于维护信息:pushup合并左右儿子区间到父节点时,如果左儿子右端点大于右儿子左端点则父节点的sum即左右儿子的sum之和,否则还要加上左儿子右端跟右儿子左端组合的情况(即ll*rr)。关于ll 和 rr 的维护这里就不赘述了,详见代码。AC代码:#include <bits/stdc++.h>#define int long
2021-09-06 18:11:45
233
原创 Codeforces Round #742 (Div. 2)C. Carrying Conundrum(思维,组合计数)
题解:题目中每2位进一位。我们发现奇数位置一定如果进位一定会进到奇数位上,偶数同理,则我们把奇数位拆成一个数字x,偶数位拆成一个数字y,这样我们的这两个数字就相当于是普通10进制每1位进。然后奇数偶数相互独立互不影响,直接组合一下,答案是(x+1)*(y+1)-2.AC代码:#include <bits/stdc++.h>#define int long long#define x first#define y secondusing namespace std;typedef p
2021-09-06 09:08:07
144
原创 C. Compressed Bracket Sequence (思维,暴力,好题)
PS:这题官方给的题解可能因为自己英语太差了没看懂。。。比赛时候写了个DP被卡了,看了好久才看懂大佬的代码,原来就是个暴力。。。大致思路:先统计出两两配对的答案数,再对剩余的左括号暴力向后找能配对的右括号,还要统计一下以当前括号为起点可以向后连接多少个括号。直接看代码吧,注释写的很详细。#include <bits/stdc++.h>#define int long long#define x first#define y secondusing namespace std;typ
2021-08-31 15:28:24
479
原创 Codeforces Round #740 (Div. 2)D1. Up the Strip (simplified version) DP,整除分块优化
题意:你现在的值为n,你可以进行两种操作1.n - x [ 1 <= x <= n - 1 ]2.n / x [ 2 <= x <= n ]问你从n变到1的方案数对m取模数据范围 2 ≤ n ≤ 2e5 1e8 < m < 1e9,m为素数题解:设f[i]表示把i变到1的所有方案数,我们可以很容易地写出来O(n^2)的状态转移表达式。然后去优化即可,一个是前缀和优化,一个是整数分块优化。AC代码:#include <bits/stdc++.h>
2021-08-25 14:38:44
180
原创 Codeforces Round #740 (Div. 2) C. Deep Down Below
对于每个洞穴,假设我们刚进入时的攻击力是x,则x>a1,x+1>a2,x+2>a3…我们将常数项移到右边得x>a1,x>a2-1,x>a3-2,x>ai-(i-1),我们要想所有得不等式成立,即取所有ai-(i-1)得最大值。同理对于每个洞穴间再做一次这样得不等式变换求得最大值再加1就是我们得答案。AC代码:#include <bits/stdc++.h>#define int long long#define x first#define
2021-08-25 13:07:13
233
1
原创 E. Gold Transfer(树上倍增)
根据题意离根越近的金子就越便宜,注意存在一个金子卖完的情况,显然对于每次询问w,v,我们可以从v这个点向根的方向找,找到最后一个可以有金子的节点然后买金子,然后继续循环往复即可。想上寻找的过程我们可以用倍增优化时间复杂度。AC代码:#include <iostream>#include <cstring>#include <algorithm>#define int long longusing namespace std;const int N=3e5+5
2021-08-18 15:06:11
165
原创 D2. Mocha and Diana (Hard Version) (并查集+思维)
PS:这题官方好像给的要启发式合并?代码太长了感觉有点劝退,其实这题可以有更简单的做法。题解:首先当两个点不在同一棵树内时我们一定可以连条边,这就是并查集的合并。最后我们连的边一定是连到了一棵树上,我们先固定这棵树,将所有可以连的树全部连到1这个树上(当且仅这个点所在的两片森林中都不在这棵树上时才连)。然后剩下还没连到这棵棵树上的点在两片森林中只有一种情况,即一个连了一个没连。这时候连森林1的和以直接连森林2的点连(画图显而易见),我们用两个set分别处理这些点,然后直接连就行。说的有点模糊,具体见代码
2021-08-16 13:24:41
667
4
原创 C. Moamen and XOR (组合数学)
C. Moamen and XORtime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputMoamen and Ezzat are playing a game. They create an array a of n non-negative integers where every element is less than 2k.Moamen w
2021-08-10 11:08:11
581
原创 2018宁夏邀请赛 Continuous Intervals(线段树+单调栈,好题)
2019ACM银川网络赛 Continuous Intervals(线段树+单调栈,好题)题意:题目大意:给定一个长度为 N 的序列,定义连续区间 [l, r] 为:序列的一段子区间,满足 [l, r] 中的元素从小到大排序后,任意相邻两项的差值不超过1。求一共有多少个连续区间。题解:某一个连续区间等价于max-min+1=cnt,cnt为区间内不同的数的个数,我们变形一下可以得到max-min-cnt==-1,所以我们固定当前的区间右端点R,用线段树维护在(1,R)区间内有多少个区间满足max-mi
2021-08-08 19:33:15
163
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人