ACM训练题题解
黑山咩
这个作者很懒,什么都没留下…
展开
-
暑假补题[6-30](AtCoder)
三个数字,每次选择两个-1,或者全部-1,问最少多少次操作全是0.没法全是0就输出-1.思路:排序以后看差值就好了。B:给你nn的矩阵,这个矩阵由1~nn组成且满足一个条件:每个格子的行都有一个比他小,每一列都有一个比他大。思路:总方案数-不合法方案不合法的方案中, 不合法的格子(即既是一行中的最小又是一列中的最大)只会有一个, 那么我们可以枚举这个格子上的元素是什么, 把比它小的放在同一列, 比它大的放在同一行, 然后把其他的元素填在剩余的 (nn - (2 * n - 1))个格子中就行原创 2022-06-30 20:58:07 · 218 阅读 · 0 评论 -
暑假补题[6-29](牛客)
牛客练习赛101:A.贪心,(n - 1) * (最大值-最小值)B.第一个位置可以是0,或者1,那么后面就可以随便放置,因为如果a1后面的数字和是偶数,a1=1,如果是奇数,a1=0.思路:贪心的考虑每一位是不是能为0,该位为0的条件是先设该位置为1,如果说ai&该位置为1时>ai+1&该位置为1时,那么该位置为0,把剩下的位数都这样去构造。如果说最后构造的数字不能满足条件,那么当前位置就为1.D:思路:分为两种情况:1.当图上有环时,那么环上连通就可以无限路径.2.当是一颗树原创 2022-06-29 11:34:40 · 105 阅读 · 0 评论 -
算法模板-2022
目录:树和图字符串和字典树记忆化搜索排序及逆序对离散化树链剖分素数筛法:同余定理单调栈数学期望LCA树和图Acwing285. 没有上司的舞会Ural 大学有 N 名职员,编号为 1~N。他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。每个职员有一个快乐指数,用整数 Hi 给出,其中 1≤i≤N。现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。输入格式第一行原创 2022-05-12 13:29:03 · 623 阅读 · 0 评论 -
第三届算法设计与编程挑战赛(冬季赛)
先小记录一下自己的排名 ,只能说很可惜,差个20名就金奖啦。但是只能说自己还是有东西没学,D题应该是可以做出来的,但是最后也没做出来,最后罚坐了两个小时.B题:题目很简洁,存在一个上升序列b使得原序列a和序列b的绝对值差值不超过eps,这道题的话一眼就觉得是个二分的题目,为什么这么说呢,因为对于eps来说,我们设答案的eps为ans,那么可得每个大于ans的eps都是符合题目要求的,对于每个可以符合要求的答案,我们用二分取最小的那个.(拿例子举例,如果eps是1000,那么肯定是符合题意的,但是10原创 2022-03-30 13:39:19 · 295 阅读 · 0 评论 -
最小生成树(Kruskal)
#include<bits/stdc++.h>using namespace std;const int N = 600, M = 360000;int n, k, xi[N], yi[N], tot;int fa[N];int find_fa(int x){ if(x == fa[x])return x; return fa[x] = find_fa(fa[x]);} vector<int> res;struct p{ int x,...原创 2022-03-10 20:21:58 · 114 阅读 · 0 评论 -
AcWing1295.X的因子链
分析:先把X分解质因数,即x = p1^k1 * p2 ^k2 …pct^kct.那么前面能分解后面的即是p1, p1p2, p1^2 p2, p1^2 * p2^2,… ,p1^k1 * p2 ^k2 …pct^kct这样的规律下去,那么这一条链子的最大长度就是k1+k2+…+kct.那么我们就可以得到序列:a1,a2,a3…,at.那么这样的序列一共有多少个呢?我们可以做一个映射:a1,a2/a1,a3/a2,…,at/at-1那么该序列就是原序列的增量序列,即改序列有多少种排法那么序列就有多少种,.原创 2022-03-07 20:27:20 · 220 阅读 · 0 评论 -
Acwing提高课:最小生成树
#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 500;int n;int dist[N], g[N][N];bool st[N];int prim(){ memset(dist, 0x3f, sizeof(dist)); dist[1] = 0; int res = 0; f.原创 2022-03-05 10:41:37 · 92 阅读 · 0 评论 -
Tarjan算法例题及模板
#include<bits/stdc++.h>using namespace std;const int N = 10010 , M = 50010;int n, m;int h[N], e[M], ne[M], idx;int dfn[N], low[N], timestamp; // 时间戳int stk[N], top;bool in_stk[N];int id[N], scc_cnt; // 每个点所属分量编号int dout[N], Size[N]; // 出原创 2022-02-05 16:44:37 · 582 阅读 · 0 评论 -
Codeforces Round #491 (Div. 2)--Codeforces--problem/991/E
题目链接:https://codeforces.com/problemset/problem/991/E思路:多重集合的排列前置知识:比如说有1,2,3三个数字那么他们构成的排列为全排列:1 2 3,1 3 2,1,2 1 3,2 3 1,3 1 2,3 2 1.那么就是n!(n=3)321=6种.那么如果说是有重复的,比如说1 1 2 3,那么就是也就是4!/(2!*1!*1!*1!)种情况了.那么这道题里面把每个数字出现的次数存储起来,然后dfs一下.sum为全部数字(包括前导0的情况原创 2021-12-08 21:27:13 · 140 阅读 · 0 评论 -
数位DP(包含例题和模板)
如上题所示意:f®-f(l-1)就是答案.那么f(n)要怎么求呢?先把n分解为m进制的l位.那么对于第i位来说,就只有0或者1,因为题目里面没有系数.如181818=242^424+212^121.而没有282828=242^424+3∗223*2^23∗22.从最高位到最低位,那么对于第i位来说如果第i位>1那么第i位可以是0(组合数学,第i位下面的i-1位可以填k-last(已经填了的1的个数)个1,即C[i-1][k-last] (下标从1开始,若是从零开始就是C[i][k-last..原创 2021-11-23 13:44:37 · 581 阅读 · 0 评论 -
KMP算法必备工具之---可视化KMP算法(输入母串和子串可以看到变化,再也不用手动一个一个去试了)
每次算KMP的时候都要消耗一张纸来进行模拟,非常的不方便,于是打算用计算机做一个可视化的kmp算法出来,花费了几十分钟的努力终于搞出来了.可以说是呕心沥血了.代码如下://^_^#pragma warning(disable:4996)#include<stdio.h>#include<stdlib.h>#include<string.h> #include<stdio.h>#include<cstring>#define MAX原创 2021-11-20 17:07:59 · 1216 阅读 · 3 评论 -
ACwing第一章-动态规划dp之最长上升子序列模型
AC代码:#include<bits/stdc++.h>using namespace std;const int N = 150;int a[N],dp[N];int main(){ int T; scanf("%d",&T); while(T--){ int n; scanf("%d",&n); for(int i=1;i<=n;i++){ dp[i]=1; scanf("%d",&a..原创 2021-11-07 18:07:57 · 72 阅读 · 0 评论 -
心血来潮写一下组合数
组合数模板:#define ll long longconst ll mod = 555555555;ll c[5000][5000];void init(){ int i,j; c[0][0]=1; for(i=1;i<=4000;i++){ c[i][0]=1;c[i][i]=1; for(j=1;j<i;j++){ c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod; } }}设被行变换的数量为a,列变化的数量原创 2021-11-07 17:55:42 · 73 阅读 · 0 评论 -
ACwing第一章-动态规划dp之数字三角形模型
第一题:AC代码:(1)空间复杂度为O(n^2)的算法:#include<bits/stdc++.h>using namespace std;const int N = 150;int dp[N][N],a[N][N];int main(){ int T; scanf("%d",&T); while(T--){ memset(dp,0,sizeof(dp)); int r,c; scanf("%d%d",&r,&c); for(i原创 2021-10-25 18:27:01 · 110 阅读 · 0 评论 -
整数划分问题
dp优化:#include <iostream>using namespace std;const int N = 1010, MOD = 1e9 + 7;int dp[N];int main(){int n; cin >> n; dp[0] = 1; for(int i = 1; i <= n; i ++ ){ for(int j = i; j <= n; j ++ ){ dp[j]+=dp[j.原创 2021-10-03 16:39:56 · 64 阅读 · 0 评论 -
糖果传递与七夕祭
今天学了一个新的知识:ACwing122:糖果传递题解:如图,a1给an的糖果数目设为x1,a2给a1的糖果数目设为x2.已知最后每个人得到的糖果数目一样设为(avg).那么可以知道对于a1来说有方程->a1-x1+x2=avg.对于a2来说有方程->a2-x2+x3=avg…以此类推.我们可以把a1-x1+x2=avg转化成x1-x2=a1-avg.a2-x2+x3=avg转化为x2-x3=a2-zvg.…即x1-x2=a1-avg.x2-x3=a2-avg.…xn原创 2021-10-03 14:33:50 · 124 阅读 · 0 评论 -
2021-09-26动态规划
1.免费陷阱可以从后面一个时间开始往前推前面时间的状态:当前状态t-1获得的陷阱加上上个时间获得的陷阱.dp[t-1][x]+=max(dp[t][x],dp[t][x-1],dp[t][x+1]).AC代码:#include<iostream>#include<algorithm>#include<cstring>using namespace std;int dp[100011][15];int mmax(int a,int b,int c){原创 2021-09-27 11:34:54 · 94 阅读 · 0 评论 -
并查集例题及边带权和扩展域
A题:输入n个点(x,y).和两点至少距离d.然后分为两个操作:1.O p 修复p点。这时候遍历每个点如果两点距离小于d就放入一个集合.2.S l r查询l能不能到达r。AC代码:#include<iostream>#include<cmath>using namespace std;struct p{ int x,y;}a[2001];int fa[2001];int v[2001];int get(int x){ if(x==fa[x])retu原创 2021-09-20 20:12:50 · 67 阅读 · 0 评论 -
七夕没女朋友呜呜呜T_T (2021牛客七夕节场)
8.19一点凌晨睡不着 就想着来做点事 思来想去不如来写题算了 杭电多校和牛客竞赛的题还没补 来一边写一边补七夕场的题A题是一个二次元喂狗粮的问题就不写了┭┮﹏┭┮C题是一个开玩笑的题hhE是一个推理的也不写了0.0D-亲密数:这道题有个收获的地方就是求因子和:LL find(LL x){ int sum = 1, t = sqrt(x); for (int i = 2; i <= t; ++i) if (x % i == 0)原创 2021-08-19 03:33:18 · 131 阅读 · 2 评论 -
2021“MINIEYE杯”中国大学生算法设计超级联赛(8)Counting Stars
链接:题目题目大意:给出n个整数.有三种操作:1.询问[l r]的总和2.[l r]里面所有数减去x&(-x)也就是去掉最低位3.[l r]里面所有数加上2^k( 2^k<=x<= 2^k+1),也就是说加上一个二进制的最高位,比如1010+1000=10010,观察不免发现是最高位左移一位.思路:操作2就是去掉最低位,操作3就是最高位左移,那么我们就可以将一个数字拆成两部分 一部分是a1也就是最高位代表的数字,一部分是a2也就是剩下位代表的数字 (如:10110,那么a1原创 2021-08-13 20:13:09 · 138 阅读 · 0 评论 -
补题日记(持续更新)
第一天:牛客多校第五场D Double Strings链接:大佬的博客给定两个字符串A,B求长度相同的AB子串,使得子串的前面部分相等,且第一个不相等的位置B>A。求这样的子串个数。思路:f[i][j]表示A的前i个字符与B的前j个字符能组成多少相等的子串。自我理解:比如说abcd,abdc,那样遍历到b的时候由于前面a是一样的,那当前的字串数量f[i][j]就会加上前面的字串数量+f[i-1][j-1],(也就是加上a时的数量),其他情况下就是加上大一点的那个,f[i][j]=((f[i原创 2021-08-12 03:49:33 · 269 阅读 · 0 评论 -
2021“MINIEYE杯”中国大学生算法设计超级联赛(6)Median
杭电7029 MedianAC代码:#include<bits/stdc++.h>const int N= 1e5+10;using namespace std;#define ll long longll a[N],b[N];int main(){ int T; cin>>T; while(T--){ ll num=0,n,m; cin>>n>>m; memset(a,0,s原创 2021-08-07 18:14:17 · 91 阅读 · 0 评论 -
King of Range
题意:输入一个长度为n的数组,有m次询问,每次询问输入一个整数k,求有多少个区间的最大值和最小值的差大于k思路:st表求最大最小值,但是查询时要用到双指针(就是没用这个所以没过).ST表ST表的功能很简单它是解决RMQ问题(区间最值问题)的一种强有力的工具它可以做到O(nlogn)预处理,O(1)是查询最值像线段树是O(logn)的查询AC代码:#include<algorithm>#include<iostream>#include<cs原创 2021-08-01 11:33:40 · 68 阅读 · 0 评论 -
2021牛客暑期多校训练营1
A题:枚举每个sum,i代表n,j代表m,即求出sg函数注意:要用bitset不能用bool不然会超时#include<iostream>#include<string>#include <bits/stdc++.h>using namespace std;const int N = 5005;bitset<N> F[N];void pre(){ for(int sum=0;sum<=10000;sum++){ for(i原创 2021-07-21 20:33:27 · 73 阅读 · 1 评论 -
BNUZ [kuangbin带你飞] 最小生成树
There are N small balls with same weight in horizontal smooth plane. And the volume of these balls can be negligible. All the balls are on the same straight line. There are three possibilities for their initial speed $$$v_0$$$ which is -1 m/s, 0 m/s and 1原创 2021-07-12 15:22:06 · 83 阅读 · 0 评论 -
Codeforces Round #729 (Div. 2)
A题:大意就是说给你一个数字n,输入2*n个数,这些数里面能不能全部两两相加结果为奇数,这样就分为三种情况:1.奇+奇=偶,2.奇+偶=奇,3.偶+偶=偶.那样就必须全部都是1奇配1偶才行)所以统计奇的数量和偶的数量是不是相同就行了AC代码;#include<iostream>using namespace std;int main(){ int t; cin>>t; while(t--){ int n,f1=0,f2=0; cin>>n;原创 2021-07-04 11:46:06 · 115 阅读 · 0 评论 -
矩阵快速幂例题
例题一:A. Tetrahedrontime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard output题解:容易看出这是一个指定路径数求方案数的题目,可以用矩阵快速幂来求解。矩阵快速幂解法:#include<iostream>#include<cstring>#define ll long longusing name原创 2021-05-16 21:49:39 · 289 阅读 · 0 评论 -
[2021-4-23]BNUZ套题比赛div3
[2021-4-23]BNUZ套题比赛div3A - Spy Detected! CodeForces - 1512AA - Spy Detected! CodeForces - 1512A当时没看数据范围,可以用map写,那样可以储存很大的数,然后发现不需要,代码如下:#include<iostream>using namespace std;#include<cstring>#include<map>int main() { int t; cin原创 2021-04-24 12:31:07 · 156 阅读 · 0 评论 -
[2021-4-9]BNUZ套题比赛div3
A - Stock Arbitraging第一题水题就不说了,代码如下:#include<iostream>using namespace std;int main(){ int maxnum=0,minnum=1e7,a,n, m, r; cin >> n >> m >> r; for (int i = 0; i < n; i++) { cin >> a; minnum = min(a, minnum); } f原创 2021-04-10 13:07:40 · 94 阅读 · 0 评论 -
[2021-04-02]BNUZ套题比赛div3
A题:已知需要a分钟睡觉,那么分三种情况:1.a<=b,那么睡够a分钟,闹钟还是没响.2.d>=c,那么他还没睡觉就被吵醒了.3.先计算睡觉要多少个周期,即a-b为被b这个闹钟吵醒后还需要睡的分钟数,c-d就是它被每个c闹钟吵醒前能睡的分钟数,那么(a-b)/(c-d)就是需要睡觉的周期(注意:可能(a-b)/(c-d)不能整除,相当于你睡觉需要8分钟(a-b),你每次小盹5分钟(c-d),那么(a-b)/(c-d)=1但是其实你需要睡两次,即答案是2才对,所以这里需要特判一下).#i原创 2021-04-03 12:02:53 · 158 阅读 · 0 评论 -
[2021-3-12]BNUZ套题比赛div3(重开)
A题:解题思路:分两种情况1.n小于k的情况,那么就是要把k平均分成n份,如果说不能平均分,那么就有一份会多出1(不可能多出2,因为余数是2的话那么就被其他的份接收了,即此时最大值有两个).2.n大于k的情况,让k大于n( 即k=k*(n/k) )就可以了,变成上面的情况代码:#include<iostream>using namespace std;int main(){ int t; cin >> t; while (t--) { int n, k;原创 2021-03-14 10:58:54 · 107 阅读 · 0 评论 -
BNUZ[2021-3-5]BNUZ套题比赛div3
A - Dense Array CodeForces - 1490A思路:这个东西,a[i],a[i+1]中的较大值除较小值要小于或者等于2才行,如果说较大值除较小值大于2,那么就插入一个数字,插入的数字是较小数的2倍(最好,但是不一定),同时计数器+1,直到这个最大值除最小值的比值大于2.#include<iostream>using namespace std;int min(int a, int b){ return a < b ? a : b;}int max(原创 2021-03-06 01:31:48 · 153 阅读 · 0 评论 -
BNUZ[2021-2-26]BNUZ套题比赛div3
A题:就是有个陷阱,它不是判断“000”和“11”嘛,但是首和尾的话“00”也算不行,就是他这个字符串的全部子串只能是"0","00"或者是“1”不能是“000”“11”,但是开头或者末尾如果是“00”的话也不行,所以要在这个字符串前面加个’0’后面加个’0’,但是如果用char的话不能直接在字符串前面加’0’,必须让整个字符数组往后移一位,那样的话可能会很麻烦,用c++的string对象就可以很快完成这个操作,就是字符串拼接#include<iostream>#include<cs原创 2021-02-27 12:27:36 · 220 阅读 · 3 评论 -
BNUZ寒假训练2.5
BNUZ寒假训练2.5A题:A - Infinity Gauntlet代码如下:#include <stdio.h>#include <string.h>int main(){ char a[6][15]={"purple","green","blue","orange","red","yellow"}; char b[6][15]={"Power","Time","Space","Soul","Reality","Mind"}; char c[10][15];原创 2021-02-06 01:07:44 · 152 阅读 · 2 评论