- 博客(46)
- 收藏
- 关注
原创 天梯赛 L3-032 关于深度优先搜索和逆序对的题应该不会很难吧这件事
题目链接点这里思路来源wls和dls视频思路 首先,我们对于这个树上两个结点的关系分为两类,一类是有直接父子或祖先关系的结点对,这样的结点对在DFS序中的顺序是确定的,一定是父亲在前面,儿子在后面,那么这样的结点对,如果是逆序对,一定会出现在每一种DFS序中,所以,这样的逆序对的贡献就是这个树的DFS序的种类数。另外一类就是不具有直接父子或祖先关系的结点对,这样的结点对在每种DFS序中的顺序不固定,但是我们经过观察完全可以发现(
2022-04-26 11:02:48
951
原创 线性递推预处理阶乘求解组合数模板
ll fact[N], infact[N];ll qmi(ll a, ll b, ll p){ ll res = 1; while (b) { if (b & 1) res = res * a % p; b >>= 1; a = a * a % p; } return res;}void init(){ fact[0] = infact[0] = 1;
2022-02-06 02:37:45
296
原创 2021年CCPC河南省赛题解 1008.小y爱数数
题目链接http://acm.zzuli.edu.cn/problem.php?id=2832思路 图片是官方题解,官方题解省略了很多说明和细节,我来描述一下,先看第一句话,我们怎么求解这个f(n)f(n)f(n),我们可以很明显看出,应该是通过枚举x来得到个数,最后将所有x的取值的结果求和即为个数。 易得公式即为∑i=1n\sum_{i=1}^{n}∑i=
2021-11-08 17:01:32
395
原创 L3-1 森森旅游 (30 分)
题目链接https://pintia.cn/problem-sets/994805046380707840/problems/1386335159927652364思路 思路不难,正着建一遍图,然后建个反图,在正图上跑从1开始以现金为边权的dij,在反图上用券为边权以n为起点跑一遍dij,然后枚举中间点,遇到不能作为中间点的跳过,能作为中间点的,我这里采取set来维护它,具体细节看代码吧,代码有点冗长,补题写的没怎么在意码风,加边
2021-05-01 23:39:26
1146
原创 牛客练习赛80————C.不降数(翻译翻译官方题解)
题目链接https://ac.nowcoder.com/acm/contest/11170/C官方题解翻译 第一句话好理解,将原数看成n个数字组成的序列,然后作差分,枚举差分序列的和来求解差分序列的和即为数字的个数,和只有(1-9)九种情况,将所有情况求和即为总数量。 那么目前我们要求解的子问题就是a1+a2+...+an=i(i是差分序列的和)a1+a2
2021-04-10 20:18:04
144
原创 Codeforces Round #708 (Div. 2)————E1. Square-free division (easy version)
题目链接https://codeforces.com/contest/1497/problem/E1思路 我们都知道,任何一个大于等于2的整数,都能写成若干个质数幂的乘积的形式,如果两个数的乘积是完全平方数,那么这个乘积写成的质数幂的乘积形式后,所有质数的质数一定全部都是偶数,那么我们在预处理的时候可以把每个数的质数幂里面,指数为偶数的部分剔除,例如12=4∗3=22∗312=4*3=2^2*312=4∗3=22∗3,在存储是存一个
2021-03-21 21:44:22
130
原创 2020年河南省CCPC大学生程序设计竞赛————I.太阳爆炸
题目链接http://acm.zzuli.edu.cn/problem.php?id=2698思路 一个经典的概率题,n个子弹,每个子弹打中的概率为p,打死目标至少需要k枚子弹,问打中的概率是多少,在本题,p是((r1+r)∗(r1+r))/(r2∗r2)((r1+r)*(r1+r))/(r2*r2)((r1+r)∗(r1+r))/(r2∗r2),k是 (h+a−1)/a(h+a-1)/a(h+a−1)/a(实现向上取整),那么如果
2021-03-21 16:32:52
422
2
原创 食物链————AcWing
题目链接https://www.acwing.com/problem/content/242/思路 扩展域并查集的经典题,本题一共有三个域,同类域,捕食域和天敌域,分别对应x,x+n,x+n+nx,x+n,x+n+nx,x+n,x+n+n。具体实现看程序备注(并查集基本模板操作就没注释了)。#include<bits/stdc++.h>using namespace std;int fa[160000];int
2021-03-21 15:14:39
137
原创 河南省第六届大学生程序设计竞赛 T6 Card Trick
题意 首先告诉你一个洗牌条件 第一次洗牌是把第一张牌放到牌堆底,然后亮出现在牌堆顶的牌是1,然后把1拿走。 第二次洗牌把前两张牌依次放到牌底,亮出现在牌堆顶的牌是2,然后把2拿走。… 如果某次牌堆可移动的牌少于移动次数,那
2021-03-05 12:30:59
132
原创 河南省第六届大学生程序设计竞赛 T2外星人的供给站
思路 这题开始和重力坠击这题搞混了,后来发现,这个圆心只能在x轴上,开始以为全图点都能当圆心,人傻了 。 那么这题数据范围就[−100,100][-100,100][−100,100],纯暴力就行了,具体步骤,每次找到一个圆心坐标能涵盖最多的点,然后标记这些点,用vector存储每个圆心能涵盖的点,然后用size比较大小即可,当所有点都被包含那么就退出循环。代码
2021-03-05 10:50:35
217
原创 河南省第六届大学生程序设计竞赛 T4探 寻 宝 藏
思路 这题和方格取数这题有点像,整体思路基本一致,唯一不同的是,本题与那题不同的是,方格取数可能会存在走重复点,而本题一定不会走重复点,用四维dp数组 dp[x1][y1][x2][y2]dp[x1][y1][x2][y2]dp[x1][y1][x2][y2],表示从左上角引两条没有点重合的路线(起点终点特判即可),每次状态转移都要满足两条路线的步数相同,即(x1+y1==x2+y2x1+y1==x2+y2x1+y1==x2+y2),同
2021-03-05 10:19:56
128
原创 河南省第六届大学生程序设计竞赛 T3最舒适的路线
思路 从最大边开始枚举,直到起点和终点连接为止,可以用并查集判断是否相连,(从最大枚举到最小、从次大枚举到最小…)这样一定能找到一个最小比值,5000的平方2.5e7。代码#include<bits/stdc++.h>using namespace std;#define ll long long const ll N = 10005;int t,n,m;int p[505];struct node{
2021-03-05 07:31:35
122
原创 河南省第六届大学生程序设计竞赛 T7Adjacent Bit Counts
题意 先给了一个条件,Fun函数的意思是,对于一个01串,记录有多少对两个1相邻,比如Fun(1110110)=3,然后题目给定n位和Fun值p,让我们输出这个Fun值p对应的n位01串有多少种。思路 这题首先是一个dp题,不是排列组合,(或许有神人能排列组合出来,我反正没查到),dp[ i ] [ j ] [ k ] 这三维分别表示,数的位置,当前位置以及前面所
2021-03-05 00:20:18
105
原创 河南省第六届大学生程序设计竞赛 T8 River Crossing
题意 给定n只羊和自己单独过河需要m分钟,然后如果带一只羊过河所用时间是m+m1,带两只羊过河所用时间m+m1+m2…(过河之后如果没运完回来也要用m分钟),问如何分配过河次数与每次运羊个数能使时间达到最小。思路 状态表示dp[ i ],表示一共运 i 只羊所用的时间的最小值。状态转移对应的集合划分,每次先在当前状态赋值上直接加一只羊所用的时间,然后遍历一遍所有可
2021-03-05 00:03:29
128
原创 河南省第六届大学生程序设计竞赛 T1异 形 卵
思路 预处理前缀和然后滑动窗口找最大值的起始位置就行。代码#include<bits/stdc++.h>#define ll long longusing namespace std;int n,m,k,l;int a[1010];int b[1010];int main(){ scanf("%d",&k); while(k--) { int res=0;
2021-03-04 23:09:44
89
原创 Codeforces Round #703 (Div. 2) E. Paired Payment
题目链接https://codeforces.com/contest/1486/problem/E思路 题意是给定一个n个点m条边的无向图,保证没有重边,但是你必须一次走两条边,途中经过的点只是路过不算抵达,抵达的点所需要的的花费是这两条边的和的平方,题目规定点的编号是1-n,起点规定是1号点,要求输出1号点到所有点的(包括自己)的最小花费,如果不能抵达则输出-1. &nb
2021-03-03 23:35:04
112
原创 Codeforces Round #703 (Div. 2) D. Max Median
题目链接https://codeforces.com/contest/1486/problem/D思路 题意是给定一个长度为n的序列,然后对于给定的长度k,在原序列里面的所有连续的长度为k的序列的中位数中的最大值是多少。 这题非常巧妙,首先在本题中如果你的长度是偶数,中位数的选取是取左边的那个数,所以大于等于中位数的个数要比小于中位数的个数多 &nb
2021-03-03 23:21:18
93
原创 Codeforces Round #703 (Div. 2) B. Eastern Exhibition
题目链接https://codeforces.com/contest/1486/problem/B思路 题意是在一个二维平面内,给定n个整数坐标点,请你找出有多少个点距离这些点的曼哈顿距离的和的最小(可以选取已经给定的整数点的坐标,所给的点可能存在重复,不过不影响)。 本题可以看成是 货仓选址 的拓展题,是一个充分利用了中位数性质的题,具体做法是将所有给定的点都
2021-03-03 23:01:32
101
原创 Codeforces Round #703 (Div. 2) A. Shifting Stacks
题目链接https://codeforces.com/contest/1486/problem/A思路 首先解释题意,给你n组物品,每组物品的个数是ai个,你只能把物品从ai挪动到a(i+1)上(就是只能从左往右移)(不限次数),问通过这样操作能不能将这组物品弄成一个严格的单调递增序列。 我的想法是既然是严格单调递增的,我们可以构造一个0,1,2…这样的严格的单
2021-03-03 22:52:22
126
原创 [蓝桥杯2019初赛]迷宫
题目链接http://oj.ecustacm.cn/problem.php?id=1455bfs代码:#include<bits/stdc++.h>using namespace std;struct node{ int x,y; char s[200]; int sign;};char a[35][55];int vis[35][55];int dx[]={1,0,0,-1},dy[]={0,-1,1,0};char z[4]={'D','L',
2021-02-04 14:26:06
209
原创 最长上升子序列 II(LIS)————二分优化
题目链接https://www.acwing.com/problem/content/898/思路 这题说是dp,但是分析完之后更像贪心了,首先举个例子比如一个序列:3 1 2 1 8 5 6。(后面下标从1开始计)那么对于 a [ 1 ]和a [ 2 ]来说,如果上升子序列长度为2,那么能接在 a [ 1 ]后面的也一定能接在 a [ 2 ]后面,因为a [ 2 ] < a[ 1 ]。以此思想,引出我们 dp数组 f 的状态
2021-01-25 11:38:54
626
原创 石子合并——区间dp入门题
题目链接https://www.acwing.com/problem/content/284/思路 闫氏dp分析法,先上图。 状态表示图中已经说的很清楚了,说说状态计算,我们以最后一次合并的两堆的分界线来划分,假定位置为k。那么自然的分界线左边的石子应该是(i,k)右边应该是(k+1,j),然后我们再将所有分法的最后一次划分都去掉,这样相当于所有元素一起减去一
2021-01-25 09:07:17
180
原创 最长公共子序列(LCS)
题目链接https://www.acwing.com/problem/content/899/思路 闫氏dp分析法,先上图(感觉放y总照片不太好,就划掉了) 状态表示图中已经说得很清楚了,这里状态划分以是否取a序列中的第 i 个数和b序列中的第 j 个数作为划分依据,很明显能划分成四种情况,图中椭圆的0,1代表的意思我解释一下。 &nb
2021-01-25 02:32:41
165
原创 最长上升子序列 I(LIS)
题目链接https://www.acwing.com/problem/content/897/思路闫氏dp分析法,先上图 状态表示图中已经说明,关于状态划分,f [ i ]表示的是所有以第i个数结尾的上升子序列的集合,那么这个集合的所有元素一定都是以第 i 个数结尾的,我们的划分与背包有点相似,以第(i-1)个数是哪个数来分类,那么可以分成: 没有第(i-1)
2021-01-25 01:52:15
253
原创 黑龙江农垦科技职业学院喜迎寒假多校联赛2(快乐ak场)(慕云杯)——题解
比赛网页链接https://ac.nowcoder.com/acm/contest/11471?from=acm_calendar#question题目从易到难排序了签到J,遍历找最小更新序号。#include<bits/stdc++.h>using namespace std;int a[10005];int n;int main(){ scanf("%d",&n); int x=-1; int minv=1e9; for(int
2021-01-24 06:37:11
508
原创 滑动窗口(单调队列)————AcWing
题目链接https://www.acwing.com/problem/content/description/156/思路 一个单调队列的模拟过程,对于一个给定的序列s,长度为n,在给定的连续长度k中,求[1,k],[2,k+1]…[n-k+1,n]这些区间的最大值或最小值。(后面的讲解采用最小值) 最暴力的做法自然就是两重for循环for(int i=0;i
2021-01-20 21:13:21
161
原创 L3-008 喊山 (30分)——BFS+链式前向星
题目链接https://pintia.cn/problem-sets/994805046380707840/problems/994805050709229568思路 思路不难,存图,根据查询点遍历,维护深度和编号最小点,但是这题被卡的恶心,最开始我是用邻接矩阵+dfs写的,超时两个点,wa一个点,然后改成链式前向星+bfs,wa两个点,改了半天,最后发现只要把N从1e4调成2e4就过了。BFS代码#include<bit
2021-01-17 03:45:55
325
原创 L3-004 肿瘤诊断 (30分)(简单三维bfs)
题目链接https://pintia.cn/problem-sets/994805046380707840/problems/994805052626026496思路 想象成三维的图来遍历,DFS和BFS应该都可以,本题采用的是BFS,唯一一个文本有歧义的点在于,共一个切面只看相邻的上下一个单位,但是样例和图示已经排除了这种情况。BFS代码#include<bits/stdc++.h>using namespace
2021-01-16 23:39:12
135
原创 L2-031 深入虎穴 (25分)
题目链接https://pintia.cn/problem-sets/994805046380707840/problems/1111914599412858888思路dfs维护最大深度并记录最深处点的编号,同时需要在输入边的过程中标记,为了后面能找到入口(入口就是唯一未标记的点),不可能所有点都dfs一遍。DFS代码#include<bits/stdc++.h>using namespace std;const int N = 1e5+5;int e[N],ne[N],h[
2021-01-16 01:44:51
315
原创 tokitsukaze and Event————牛客练习赛50
题目链接https://ac.nowcoder.com/acm/contest/1080/D思路 题意是给你一个 n 个点 m 条边的无向图,不存在重边和自环,也没有负权边,但是每条边实际上存在两个权值,一个是原状态对应 ai 权值,一个是夜战状态对应 bi 权值,只能在途中某个位置切换形态且只能切换一次,最后到达终点时必须是夜战状态;此外,还增加了一个要求是游戏难度,当难度为 k 时,在1,2,3……,k-1处都不能切换形态,然后
2021-01-14 03:16:34
177
原创 Holy Grail————计蒜客
题目链接https://nanti.jisuanke.com/t/41305/思路 题意是给一个n个点m条有向边的图,题目保证可能会存在负权边,不存在重边和自环,也不存在负环,然后给出六条边的起点u和终点v,题目保证在添加前不会有能从u到达v的路径。 每次添加都要保证:第一,按照题意,是要添加一条反向边将本来能从v到u的最短路变成权重为0(题目说花费,一个意思)
2021-01-13 04:26:56
217
1
原创 线性dp入门经典题——数字三角形——AcWing
题目链接https://www.acwing.com/problem/content/900/思路闫氏dp法:所以状态转移方程就是f [ i ] [ j ] = max(f [ i - 1 ][ j - 1 ] , f [ i - 1 ][ j ]) + a [ i ] [ j ] 。需要注意的是在初始化dp数组的时候要多处理一列,因为处于边界的值会访问边界外的值。c++代码#include<bits/stdc++.h>using namespace std;const in
2021-01-12 21:37:05
173
原创 最短路————杭电OJ
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1874思路套板子的最短路,熟悉板子的题目。Floyd代码#include<iostream>#include<queue>#include<cstdio>#include<cstring>using namespace std;const int INF=0x3f3f3f3f;const int N=110;int n,m;int d[
2021-01-12 04:19:37
170
原创 畅通工程续————杭电OJ
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1874思路n,m的范围不大直接用邻接矩阵存就行,可以训练各种最短路的做法(但可能我太菜了,我用堆优化的dijkstra直接TLE了,不知道为什么QAQ)。Floyd代码#include<iostream>#include<queue>#include<cstdio>#include<cstring>using namespace std;con
2021-01-12 03:39:55
154
原创 通讯录系统课程设计——链表实现——c语言
概要设计数据结构选择单链表来完成所有操作,便于插入和删除,不利于排序。程序模块共11个模块,分别是主函数模块实现操作指令和10个子函数模块,分别是主菜单界面、新建联系人、浏览所有联系人、修改联系人信息、删除联系人、查找联系人信息、插入联系人、保存联系人信息(写入文件)、读取文件信息、对所有联系人按照姓名进行字典序排序。详细设计数据类型定义定义了一个结构体类型PHONE变量,内部有五个字符数组和一个整型变量分别存放——name(姓名)、home(籍贯)、phone1(电话号码1)、phon
2021-01-10 00:26:49
2866
5
原创 CF-1385E——Directing Edges
题目链接https://codeforces.com/problemset/problem/1385/E思路题目大意就是给你一个图,有无向边也有有向边,那么能不能把所有无向边都变成某个方向的有向边形成有向无环图,如果不行输出“NO”,可以输出"YES"并输出所有有向边(包括已有的有向边和把无向边变成有向边的有向边)。做法:首先对所有有向边进行拓扑排序并存放这个排序的序列,如果已经成环,直接输出“NO”即可,反之输出“YES”,然后对于每个无向边都将起点终点通过拓扑序列进行比较,前面的点是不依赖后面
2021-01-03 23:06:31
191
原创 ACboy needs your help————杭电OJ
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1712思路分组背包模板题(刚开始忘了清空dp数组,一直WA,QAQ),压缩成一维后f[j]表示在只能选 i 门的情况下,不超过 j 天的收益,c++代码#include<bits/stdc++.h>using namespace std;const int N=105;int n,m;int f[N];int main(){ while(1) { s
2020-12-30 20:31:20
122
原创 银河英雄传说————牛客
题目链接https://ac.nowcoder.com/acm/problem/16889思路(如果是在AcWing上做这题把size数组的名字改成其他变量名吧)如果是M操作即将a列战舰挪到b列的尾部,那么a列战舰的的每个d都要变,即加上size[find(b)],因为路径压缩,所以只需要头部改变即可,即d[find(a)]=size[find(b)]。路径压缩的步骤首先要找到根节点root,然后计算父结点到上一个父结点的距离d[p[x]],d[x]初始是x到p[x]的距离,加完后是d[x]=d[x
2020-12-30 11:16:19
202
原创 程序自动改错————AcWing
题目链接https://www.acwing.com/problem/content/239/思路看了算法进阶指南和别人的题解才明白这题需要用离散化处理10的9次方的范围,本题需要将所有待验证的组,即第三个值为0的边,全部先存放起来,这里采用pair<int,int>类型的vector存放。关键是离散化的操作,主要步骤就是存放输入进来的数、利用sort排序,再利用unique去重计数,最后利用lower_bound查找到对应的数,除了离散化部分,剩余的都是并查集的传统操作。c++代码#
2020-12-30 01:01:05
341
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人