- 博客(51)
- 收藏
- 关注
原创 2021-06-17
//完整代码在文件末尾B题意:给出一个 n∗mn*mn∗m 的方格,定义“山”的合法情况是:山顶是同一个高度,在山顶的前面是非递减,山顶后面是非递增。对方格进行涂色,求有多少种涂法是合法的“山”。思路:枚举山顶两端,枚举高度,然后山顶两侧则是组合数学方格走法,得到朴素的公式:1+∑l=0n∑r=l+1n∑h=1m(Cl+h−1h−1∗Cn−r+h−1h−1)1 + \sum_{l = 0}^{n}\sum_{r = l + 1}^{n}\sum_{h = 1}^{m}(C_{l + h -
2021-06-17 17:17:09
153
原创 2016 icpc沈阳部分题解
hdu5948 hdu5949 hdu5950 hdu5952 hdu5954A Thickest Burger 对于每对 A B, 输出 max(2A+B,2B+A)max(2A + B, 2B + A)max(2A+B,2B+A)B Relative atomic mass 给出一个字符串,只包含CHO,原子质量分别是12,1,16,求出这个字符串总的质量即可C Recursive sequence 矩阵快速幂,式子是 a[i]=2a[i−2]+a[i−1]+i4a[i] = 2a[i
2021-05-17 12:00:39
301
原创 Educational Codeforces Round 109 D题(DP)
D 因为我太菜了,没看出这是一道DP,QAQ 状态表示:f[i][j]f[i][j]f[i][j] 表示前 iii 个 1 和前 jjj 个 0 匹配的最小代价。假设有 n1n_1n1 个 1 和 n2n_2n2 个0,那么最终的答案就是 f[n1][n2]f[n_1][n_2]f[n1][n2] 状态转移:在求 f[i][j]f[i][j]f[i][j] 时,考虑第 iii 个 1 是否和第 jjj 个 0 匹配 如果第 iii 个1 和第 jjj 个 0 匹配,那么此时的代价
2021-05-16 20:54:58
299
2
原创 PageRank算法原理,以及优化思路+并行思路
学习的B站UP:https://www.bilibili.com/video/BV1m4411P76G?p=9用有向图表示网页的连接,所以可以用 邻接矩阵 AAA 来表示连接情况;核心公式:PR(a)i+1=∑i=0nPR(Ti)iL(Ti)PR(a)_{i + 1} = \sum_{i = 0}^{n}\frac{PR(Ti)_i}{L(Ti)}PR(a)i+1=i=0∑nL(Ti)PR(Ti)iTiTiTi 表示出链指向 a 节点的节点,PR(x) 表示 网页/节点 x 的权
2021-05-01 17:58:16
856
原创 Educational Codeforces Round 107 (Rated for Div. 2)
A. 由于英语太烂读错题QAQ,意思其实是:有一部电影,需要让大家来投票。1表示喜欢,2表示不喜欢,3表示还没看过投票则看系统中哪样的人多,如果喜欢的票数更多就投喜欢,否则投不喜欢,相等也投喜欢。而这里有两个系统,可以操控,把1和2分别放在不同的系统里。遇到3就给他们看喜欢的系统,所以他们看到的是“所有人都是喜欢的”,所以他们都投喜欢了。所以答案就是1和3的数量之和。B. a,b,c分别表示三个数的长度,用x,y,z表示这三个数,要求满足gcd(x, y) = z。直接构造c是10的次方或者是1,然后先让
2021-04-14 10:34:14
136
原创 Divide by Zero 2021 and Codeforces Round #714 (Div. 2)
A需要找到一个满足长度为n的含有k个峰的排列,直接将前k大的数都作为峰就好了;峰的位置为2,4,…这样安排就能安排最多的峰,剩下的按照顺序插入空余位置;不能满足的情况:n为奇数时,k > n / 2;n为偶数时,k >= n / 2(这里除法都是下取整)。B看题目第一眼感觉就是找规律,可是卡了好久,先过的C…先来验证一个推论:a1=a2&a3&...&ana_1 = a_2\&a_3\&...\&a_na1=a2&am
2021-04-12 11:25:27
595
6
原创 Codeforces Round #713 (Div. 3)
(我是菜鸡,A被Hack了)A给n个数,其中有一个不一样,直接找B找到两个*的坐标(x1, y1), (x2, y2),答案就是(x1, y1), (x1, y2), (x2, y1), (x2, y2)为*,如果存在x1 == x2的情况,x2 = x1 + 1或者x2 = x1 - 1即可,在合法范围即可,y坐标同理C先遍历一遍,将必须改变的?进行记录,如01?这个问号必须变成0才是合法的,这样最后剩下的?要么是成对的,要么是n为奇数是最中间的,直接进行讨论即可D将b从小到大sort一遍
2021-04-11 01:51:11
207
原创 icpc昆明区域赛 热身赛第三题(DP)
昆明热身赛第三题(DP)赛后AC最为难过。。。。。。。。。。题意:n栈路灯,在其中k栈路灯下都有一个雕像,每个雕像都有一个大小s。路灯从1标记到n。要做的是将这k个雕像按照s从小到大放到这n个路灯的其中k个位置中即可。将第某个雕像从i位置移动到j位置耗时 s* |i - j| ,求最小总耗时多少可以将雕像排序完毕。每一个路灯有两个输入量,p表示雕像初始放置的路灯位置,s表示大小。思路:先将路灯按照大小递增排序,大小相同时按照原来先后顺序。dp[i][j]:表示前 i 个雕像放到前 j 个位置时的总
2021-04-02 23:31:10
215
原创 对负数进行取模C/Java和Python不一样!
取模根据y=k∗x+r y = k * x + ry=k∗x+r求的是r这个数字r=y−y/x∗xr = y - y / x * xr=y−y/x∗x产生不同的地方是 y / x这个地方,有向下取整floor和小数截取truncate两种方法C/Java中对负数取模:采用的是truncate除法,直接将小数部分去除Python中对负数取模:采用的是floor除法,向下取整下面是我自己计算机上的运行结果,可以手算验证一下C/C++printf("%d ", 15 % 10);prin
2021-03-04 18:58:43
194
1
原创 HDU4296-Buildings-贪心(说说所以然)
先讲一下题目的意思:给我们n个砖块,每个砖块有重量w和承重s,需要把这些砖块累起来。每一层的PDV值是其上所有重量减去当前的承重s,需要求的是一种排序使得总的PDV值最小。正确的排序:当第 i 块砖在第 j 块上面,应满足p[i] - s[j] < p[j] - s[i]当我们不知道第 i 块和第 j 块谁在上面时,我们直接进行比较。设这两块砖之上还有 W 的重量,那么当 i 在下面时,下面(即 i 这一层)的PDV值为PDV(i) = W + p[j] - s[i]当 j 在下面时,下
2021-01-20 19:00:04
128
原创 2020杭电多校第7场1010 Jogging
题目链接:这里题意: 题目乍一看有点复杂,二维平面上的点(x, y),如果gcd(x, y) > 1则说明这个点good,good的点意思是可到达的(初始点是good的)。对任意一个good的点,假设它相邻一圈8个点中有zzz个点是good的,那么从这点出发,下一步到这z个点以及停留的概率是一样的。即停留起始点的概率是1z+1\frac{1}{z+1}z+11,到其他z个good点中任意一点的概率也是1z+1\frac{1}{z + 1}z+11。求经过 t 步后仍在原点的概率,用分数表示
2020-08-11 18:40:36
896
原创 一个组合数的简单模板
用到了阶乘和阶乘逆元预处理(线性求逆元)/*组合数 C(n, m) 模板lzh007 2020/6/1****使用注意N的范围设定和模mod的范围设定****/#include<iostream>#include<cmath>#include<string>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;con
2020-06-02 12:37:14
149
原创 P2017 Dizzy Cows(经典拓扑排序)
本题算是一个比较经典的拓扑模板题,只添加了一个标记拓扑顺序的数组top就可以了在加入单向边后进行拓扑排序,拓扑排序中进行top数组记录再加入双向边时,根据拓扑排序的性质(top值表示拓扑排序的位置),任意两个点,添加的边只要是top值小的点指向top值大的点就是可以满足的(等于也可以,在我实现的代码中,等于的只有0值,即入度为零的节点)入门小白一个,请多多指教#include<iostream>#include<cstring>#include<cstdio>
2020-06-02 12:25:50
157
原创 HDU1119 Simple Algorithmetics(POJ 1396)
这题血wa。首先要做到的是大数运算,在考虑其他。“----”的长度只决定于上下两行的数字长度贡献一个不知道有没有用的数据吧121*9
2020-04-28 11:36:23
269
原创 HDU3336 Count the string (KMP,next数组)
因为初次学习KMP,所以这题开始有点不好理解,看了许多的题解觉得有点复杂,因为这里是只求数量,所以感觉可以进行简化。思路如下:先求出next数组,增加的操作是在计算next数组的过程中监视每一个next[i]值是否为零,不为零则说明存在与前缀相同的字串,这时直接进行数量加1。当next数组计算完成,答案也就出来了。我也不确定这个思路会不会露了什么数据,如果有的话欢迎大家批评指正,感谢。//H...
2020-03-05 11:41:12
142
原创 HOJ 2177 取(2堆)石子游戏 (威佐夫博弈)
首先要明白威佐夫博弈的原理:[百度百科]讲得十分的详细了,还不会的可以先看懂原理。(https://baike.baidu.com/item/%E5%A8%81%E4%BD%90%E5%A4%AB%E5%8D%9A%E5%BC%88/19858256?fr=aladdin)给出一个局势(a,b),其中a<=b。我们要判断它是不是奇异局势,如果是的话就已经输了。如果不是奇异局势的话,我们可以...
2020-02-14 17:19:27
323
原创 HOJ 2897 邂逅明下(完全巴什博弈)
完全的巴什博弈,只要理清楚了就很简单了。①n%(p+q) == 0:只要先手第一次取q个,后面的每一次无论后手取多少个(记为k),先手取p+q-k个,最后必定是后手面对p个,故后手取完,先手胜。②0<n%(p+q)<=p:因为双方都是最聪明的,故每一次先手无论取多少(记为k),后手都取p+q-k,到最后必定是先手面对n%(p+q)个,先手取完,后手胜。③n%(p+q)>p:...
2020-02-13 19:44:38
115
原创 HOJ 1847 Good Luck in CET-4 Everybody! (博弈、找规律)
把前面的几个数据列出来就会发现,规律非常明显。如果只用想的话,有点难(大神除外)nKikiCici1√2√3√4√5√6√7√8√9√10√11√12√13√14√15√…代码很简单,直接对三取余判断是否为零就可以了...
2020-02-12 21:01:47
176
1
原创 HOJ 1198 Farm Irrigation (并查集)
我直接用了结构体进行操作,看起来有点复杂,其实不难,过程都写在注释了。#include<iostream>#include<cstring>#pragma warning(disable:4996)using namespace std;const int NN = 55;//因为用的是二维数组这样的数据,故使用二元组的结构体存储根节点typedef str...
2020-02-07 14:11:34
151
原创 HOJ 1162 Eddy's picture(最小生成树)
注意数据是实数,直接用了Prime结合并查集就可以了#include<iostream>#include<cstring>#include<cmath>using namespace std;const int NN = 100 + 5, INF = 99999999;double a[NN][NN], xx[NN], yy[NN];int f[N...
2020-02-05 21:39:05
140
原创 HOJ 1301 Jungle Roads (最小生成树)
本题只是输入看起来比较复杂,细心一点处理好就可以了。用三个一维数组代替二维数组存储边,降低时间复杂度。#include<iostream>#include<cstring>using namespace std;const int N = 30, NN = 80, INF = 99999999;int c1[NN], c2[NN], c3[NN], f[N];/...
2020-02-05 21:13:11
135
原创 HOJ 3371 Connect the Cities
本题数据量有点大,暴力的结果是TLE。读入用了scanf没用cin,不知道会不会TLE。使用三个一维数组代替二维数组存储边,降低时间复杂度,如果细看的话也可以知道降低了内存消耗:m <= 25000, n * n <= 250000。还有就是读入数据需要细心一点,基本就可以了。#include<iostream>#include<cstring>us...
2020-02-05 20:11:28
132
原创 HOJ 1879 继续畅通工程(最小生成树和并查集)
畅通工程。。。。。终于畅通了。。。。。本题把给出已建道路的村庄集合先合并,后面再用Prime结合并查集直接暴力就可以了。#include<iostream>#include<cstring>using namespace std;const int NN = 100 + 5, INF = 99999999;int a[NN][NN], f[NN];int f...
2020-02-05 15:55:05
135
原创 HOJ 1875 畅通工程再续
最小生成树需要把给出的坐标转换成岛与岛之间的距离存储在二维数组中,可以用两个一维数组存储,我用了vector,麻烦了。数据是有小数的,所以要注意数据类型,我在这里WA了。#include<iostream>#include<cstring>#include<algorithm>#include<vector>#include<cm...
2020-02-05 15:21:59
140
原创 HOJ 1863 畅通工程
并查集、最小生成树用Prime算法,注意细节即可#include<iostream>#include<cstring>#include<algorithm>#pragma warning(disable: 4996)using namespace std;const int NN = 100, INF = 99999999;int a[NN][NN...
2020-02-05 12:59:16
140
原创 HOJ 1233 还是畅通工程(并查集、最小生成树)
使用Prime,直接暴力过。#include<iostream>#include<cstring>using namespace std;const int NN = 100 + 5, INF = 99999999;int a[NN][NN], f[NN];//a[i][j]为i到j的距离,f[i]为i的根节点,也可以理解为所在集合的标记int find(in...
2020-02-05 12:20:59
152
原创 HOJ 1102 Constructing Roads(最小生成树)
数据量不大,直接暴力过。我用了Prime,过程写在注释中。#include<iostream>#include<cstring>#include<algorithm>#pragma warning(disable: 4996)using namespace std;const int NN = 100 + 5, INF = 99999999;int...
2020-02-05 11:51:30
306
原创 HOJ 1232 畅通工程 (并查集)
这里利用生成树中e = n - 1的关系,其中e是边数,n是顶点数。当然e必须是不含重复的,样例中的输入有“重复”的边。在判断过程中,只要判断到是一条边是能把两个不同的集合进行连接,它就是符合条件的这样一条边。计算这样的边数有多少条,我们需要e = n - 1条,故两者差值就是答案。#include<iostream>#include<cstring>#include...
2020-02-05 10:34:05
128
原创 HOJ 1856 More is better(并查集)
虽然看着数据挺大的,但我看了好几个博客直接for的都AC了。详细要注意的写在代码的注释里了。#include<iostream>#include<cstring>#include<algorithm>#pragma warning(disable:4996)using namespace std;const int NN = 10000 + 5, ...
2020-02-04 22:25:20
110
原创 HOJ 1325 Is It A Tree (并查集)
注意不能成环;节点的出度只能为0或1:0是根节点,1是子节点;只能有一个根节点。#include<iostream>#include<cstring>using namespace std;const int NN = 1000 + 5;typedef struct node{ int a; struct node *p;//指向父节点}node;...
2020-02-04 16:17:47
133
原创 HOJ 1272 小希的迷宫(简单并查集)
这题有点坑,WA了我很久。讲三点需要注意的:是否连通、是否成环、是否空树。空树的意思是存在数据0 0,对,只有两个0。但两个0是符合题目的意思的,应该输出Yes,这就有点坑了。#include<iostream>#include<algorithm>#include<cstring>#include<vector>using namesp...
2020-02-04 14:39:00
156
原创 HOJ 1213 How Many Tables 并查集入门题
一个简单的并查集题目,暴力解决。我这里只用一维数组,时间复杂度为O(n*m),n为人数,m为给定的关系个数。#include<iostream>#include<cstring>#include<algorithm>#pragma warning(disable: 4996)using namespace std;const int NN = ...
2020-02-03 15:21:51
105
原创 HOJ 2844 Coins 多重背包
这题要好好想清楚,可能我写得不是太清楚,经过参考大神的代码,想明白之后,就简单了 #include<iostream> #include<cstring> #include<algorithm> #pragma warning(disable: 4996) using namespace std; const int NN = 100 + 5, NF...
2020-01-31 14:41:13
135
原创 HOJ 2571 命运
这里可以理解为将一维的数据分成了几行就容易了#include<iostream>#include<cstring>#define max(a, b) a > b ? a : b#define INF -99999999using namespace std;const int NN = 1005;int num[21][NN], dp[21][NN];...
2020-01-26 12:00:43
111
原创 HOJ 1087Super Jumping! Jumping! Jumping!简单DP
非连续最大递增子串和#include<iostream>#include<cstring>#define max(a, b) a > b ? a : busing namespace std;const int NN = 1005;int dp[NN], num[NN];int main() { int n; long long mnum; wh...
2020-01-25 17:55:59
141
原创 HOJ 2602 Bone Collecter简单DP
简单使用01背包的方法#include<iostream>#include<cstring>#define max(a, b) a > b ? a: busing namespace std;const int NN = 1005;int N, V, value[NN], volume[NN], cap[NN][NN];int main() { in...
2020-01-25 15:33:30
246
1
原创 HOJ 2084 数塔
初学容易想到的是递归,但这一题递归是致命的(TLE)。用dp思想可以实现。把从上往下的找最大值问题转换成从下往上,避免了重复计算。#include<iostream>#include<cstring>#include<cstdlib>using namespace std;const int N = 100 + 5;int a[N][N], n;...
2020-01-20 17:23:00
107
原创 HOJ 1242 Rescue
这一篇博客质量不咋地,思路有点复杂,建议去看使用优先队列的。基本思路在注释中写了。不行了,渣渣一个,只能写到肝疼,洗洗睡了。#include<iostream>#include<queue>#include<vector>using namespace std;const int MAXN = 200 + 5, INF = 99999999;in...
2020-01-19 02:07:20
96
原创 HOJ 1180 诡异的楼梯
本题在bfs的基础上需要考虑多一点东西,就是题目中的楼梯变化。下面是我个人觉得要注意到的:梯子的改变要注意,思路明白就行可以在梯子前等待,这是我在做的时候没有考虑到的,看了其他博主的分享后才想明白的#include<iostream>#include<queue>using namespace std;const int MAXN = 20 + 3, IN...
2020-01-18 01:22:00
74
原创 HOJ 2579 Dating with girls
因为这里会存在“会消失的墙”,所以存在点可以多个路径有重复,所以vis需要更改,存储的是每个点每个时刻从起点到达该点的最少时间。在搜索过程中,如果检测到有到达该点的耗时比已有到达该点耗时更多的话,则把这些点筛掉,不然直接爆内存。#include<iostream>#include<cstring>#include<queue>using namespac...
2020-01-17 17:38:57
84
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人