多校
多校补题
ddgo
给我高高飞起来啊!(ACM退役,转JAVA后端了)
展开
-
2020CCPC秦皇岛赛后补题
总结:我是傻逼A:签到题。#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long longusing namespace std;typedef pair<int,int> pii;typedef long long ll;const int INF = 0x3f3f3f3f;const double eps = 1原创 2020-10-21 10:57:38 · 447 阅读 · 4 评论 -
2020牛客多校第三场 E
给你一个a序列,让你求出对于某个p序列和q序列,pi!=qi 使得它们花费的费用最少。对于p序列的定义,可以知道,下标和值是交换的,即对于 i,j 这两个位置,有pi = j, pj = i,p(pi) = i,p(pj) = i.对于费用的计算,我们知道,只有两个值差不多相同的减去才可能最小。故把a sort一遍,此时构造p,上面对p序列的定义和对费用计算的理解,知道,只需要将p按1~n构造后,再把相邻的交换一下,就可以的到p数组.q数组为了满足次小,故与p构造差不多,只需要将(1 ~ n)序列原创 2020-08-19 17:32:29 · 143 阅读 · 0 评论 -
hdu 6867 Tree
题目地址题意,给一个有向树,判断加一个有向边之后,使得(x,y)对最大,x,y表示x能到达y。思路,对于根节点,它能到达每一个节点(最多),所以我们可以把叶子节点和根节点链接起来形成一个环,就会得到尽可能多的(x,y)。默认将自己也作为子树的一个节点.(后面处理防止(x,x)重复计算)链接后,对于叶子节点,它能够多到达所有的不是它子树的节点,对于叶子节点的父节点,它能多到达所有的不是它子树的结点,…。所以可以用dfs求出 每个节点子树的大小,再dfs求出某条到叶子节点路径的 ∑(n−siz[])原创 2020-08-19 12:10:07 · 152 阅读 · 0 评论 -
hdu多校1 Distinct Sub-palindromes
题意: 求长度为n的字符串(全为小写)所构成的最少数量的回文子串的数量。当 n = 1 -> 261当n = 2 -> 262 -> ab 和 aa 这种样子当n = 3 -> 263 -> abc 和 aaa 和 aab 和 aba 和baa 即每个位置都可以任意填一个字母,所得到的所有子回文串都为3个。当n>3 是,最短的情况只有 abc-> 这种循环下去,此时要保证每个位置的字母不同,可以取n=4然后再用n=3上面的的几个例子来判断,都会增加,原创 2020-08-17 16:19:25 · 107 阅读 · 0 评论 -
2020牛客多校第十场 E
左边的空位可以由右边的填补,所以只需要求一下前缀和的平均值上取整就可以了。代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long long#define sc scanf#define pf printfusing namespace std;typedef pair<int,int> pii;typedef l原创 2020-08-17 13:04:38 · 99 阅读 · 0 评论 -
2020牛客多校第十场 A
首先大胆猜测,每次先找2 * x%p,如果被找过或为0,则找3 * x%p,且3 * x%p != 0 ,除非找到n-1位,否则输出-1.证明: 对于任意的p,从任意一个数开始, 一直走2 * x%p 或者3 * x%p 一定会形成环(一个或多个)。我们可以从一个环走到另一个环直到构成一个合法序列,或者走不动。例如先从任意一个点出发,比如1。先走2 * x%p ,当走到某个点的时候,从这个点往3 * x%p 这个环跳动,如果都跳不动,则不会有合法序列,循环下去。代码:#define IOS ios原创 2020-08-17 11:27:26 · 118 阅读 · 0 评论 -
2020牛客多校第九场E
求gcd(x,y) 无非就是求x和y的所有质因子表示中,取相同质因子且次数最小的,例如 gcd(2,3) -> 21 31 -> 1(没有相同的) gcd(2,8) 21 23 -> 2 gcd(2,12) -> 21 22 X 31 -> 2先想暴力做法,先把x,y用唯一分解定律分解出来,之后对于每一个相同的质因子,两个循环,判断哪个的次数小就取哪个。这样无非就是超时。cx 为 x的一个质数的次数,cy同理所以,我们可以直接将两个循环拆开,对于i*cx,原创 2020-08-16 16:37:35 · 181 阅读 · 0 评论 -
2020牛客多校第九场 K
题意: a 先沿最近路线靠近 b,然后a再远离b,同时b再去追a因为有n个点n-1条边,所以是一颗树。 求出 a开始的位置需要dfs(inv = 1)去处理。之后分别把a开始的位置到每个点的时间求出来,b到每个点的时间求出来。再用dfs求出max.不过,此max非披max,当有一个节点两个在同一时间都到达的时候,那么那个节点之后的点就不能再继续扩展了,因为已经相遇了。对于dfs_ans函数第一个参数是sa而不是n,因为之前我们让相遇节点之后不被扩展,而以n为起点开始查找,会优先找到sa起点往n靠近的点原创 2020-08-15 23:13:41 · 116 阅读 · 0 评论 -
2020牛客多校第九场 F(双指针,尺取)
思路: 应该尽量找到最小的最大和最大的最小。 将所有衣服按由大到小排序。维护一个区间,当这个区间中有m个不一样的id时就更新一次最小值,第一个指针往后移动一位。还是很好理解。 代码有些注释代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long long#define sc scanf#define pf printfusin原创 2020-08-11 23:40:23 · 91 阅读 · 0 评论 -
2020牛客多校第八场 G (枚举)
题意: 选择3张卡牌,并且每张卡牌中,每个属性要么全部一样,要么全部不一样。暴力枚举3个点。官方题解 最多枚举21次。进不去网站就离谱代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long long#define sc scanf#define pf printfusing namespace std;typedef pai原创 2020-08-11 18:28:14 · 137 阅读 · 0 评论 -
2020牛客多校第八场 I (并查集+离散化)
对于aia_iai 和 bib_ibi1 : 假设aia_iai和bib_ibi没被选,把 aia_iai 选了,那么我们可以把 aia_iai 作为儿子而 bib_ibi 作为父节点。即 fa[aia_iai] = bib_ibi .2: aia_iai没被选和bib_ibi被选,那么我们可以把 aia_iai 作为儿子而 bib_ibi的祖先节点作为父节点。即 fa[aia_iai] = find(bib_ibi) .3: aia_iai被选和bib_ibi没被选原创 2020-08-11 15:23:36 · 107 阅读 · 0 评论 -
2020牛客多多校第七场 D(整除分块)
思路:1 : 从 第一个操作 知道所有 1,k 都是 传奇元组 ,再对(1,1)运用2操作,知道所有(x,1)都是传奇数组。故有 n+k-1个2: 对1,2 1,3 ,1,4 …进行操作2 一直循环操作下去 发现是 第一位数 是 xk+1,故若第一位 - 1 是第二位的倍数则 是传奇数组。3 同上,进行操作3,会发现, 第一位是 xk ,故若第一位是第二位的倍数,则是传奇数组。故即使求 对于所有的1~k,找到n是k的倍数 的个数和k是n-1倍数的个数。找倍数的,n/k 就可以知道有多少个。i原创 2020-08-10 16:53:39 · 92 阅读 · 0 评论 -
牛客多校第七场 B
题意: 给定 n,m 构造出一个方案,可以组合成 n个m,和m个n。n<m, 如果一个箱子大于了n,则后面m个n的情况这个不能用这个箱子,故不能满足,则最多装n个1: 当有n个医院,m个口罩时, 每个医院最多分配 floor(m/n)个装着n个口罩的箱子,此时,分配的箱子总数为floor(m/n) * n->这个既可以表示每个医院分配floor个箱子,有n个医院,故有floor(m/n) * n个箱子,也可以表示一个医院分配floor个箱子,每个箱子有n个口罩,故为每个医院当前分配的口罩原创 2020-08-09 00:33:44 · 105 阅读 · 0 评论 -
2020牛客多校第六场 K
题意:判断给的序列是不是 任意1~n的全排拼接成序列的连续子序列每一个数字应该属于的地方它只能出现一次。从任意点i开始,如果某个点在往后查询的时候出现了两次,那么i点最多能够延伸到那个地方。 然后我们可以把每个点求一下最多能延伸到哪个点,直接记录len。(操作看代码)处理:由于k很大,可以到1e9,但是n只有5*e5,故我们可以把这些点离散化一下(方便pre数组的运用)。所以此时a[]里面存的是离散化后,每个点对应的离散化值。更多详细看代码。最后判断: 枚举开始起点,依次check是都满足条件。代原创 2020-08-07 19:23:15 · 160 阅读 · 0 评论 -
2020牛客多校第六场 E
题意:给你n,k 求是否存在一个 1~n 的某种排列P,使得存在长度为i i属于[1,n] 的连续子序列 的 sum % n == k对于i等于 n的时候 ,作为突破口,由公式 n*(n+1)/2 可以知道n 为 奇数的时候 : 结果是n的倍数,所以k应该为0.look look ((n+1)/2 % n) x (n % n) = 0n 为 偶数的时候: 结果为 n/2 . 再 look look ( (n+1)%n X (n/2) % n) = n/2这样就可以判断出是否可以构造了,接下来是怎原创 2020-08-07 11:25:50 · 81 阅读 · 0 评论 -
2020牛客多校第五场 E
题意: 按p的方法将1~n的序列变下去,当变成以前出现过的就不能变了,求最多变换多少次。当又变成1~n的序列时,变换次数最多对于每一些转换,再转换x次后会变成原样,这样处于转换路径上的点可以构成一个环。之后可以理解为找到所有的环。要使得当所有的环都经过y次变换后,都变成原来1~n 的样子,则y = lcm(x1,x2,x3…)因为 x 之和为n位 ,y <= n位 故不用取模c++ : 求多个数的 lcm 可以用唯一分解定理,将所有x用唯一分解定理后,可以得到所有质数的次数,将每个质数对原创 2020-08-07 08:01:31 · 153 阅读 · 0 评论 -
2020hdu多校 1001 hud6827
选出每个区间,计算每个区间权重的平均值,的期望。si为i 的前缀和 ,inv为逆元,inv_sum为逆元前缀和。故对于每一个区间。会有:草图,当n等于4的时候跑一边循环就可以算出权值和,再和个数的逆元相乘就可以得到答案代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long longusing namespace std;t原创 2020-08-06 18:06:37 · 137 阅读 · 0 评论 -
2020牛客多校第五场 D
题意,有两个操作,求你最少使用的段数(连续使用1操作包括1次也称为1段)对于操作1: 我们可以把 1~n-1看成是一个环,操作一次,环转一次。对于操作2: 我们可以把1~n 看成是一个环,操作一次,环转一次。每使用多次包括1次操作1 之后 再使用多次包括1次操作2 ,就可以把某些数放到最后一个数的后面,即把最后一个数插入到某个位置,再扩展,就是把某个数(操作2免费哦)插入到任意位置。这里用 nlogn 求上升子序列代码:#define IOS ios::sync_with_stdio(fals原创 2020-08-06 16:28:27 · 165 阅读 · 0 评论 -
2020牛客多校第五场 I
将GE斜着构造会得到最多的个数原创 2020-08-05 18:37:28 · 123 阅读 · 0 评论 -
2020牛客多校第4场 H
给你一个1~n的序列 让你求出两个完全不同的集合a,b 使得gcd(ai,bi) > 1 且 尽可能的大。倒序枚举是:因为大一些的质数(x)只能与比它大的匹配(z),而比它大的质数(z)可能会被比它小的质数(y) 匹配,导致x无匹配项。欧拉筛筛质数。按上述方式求解就可代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#define CLOCK printf("Time used:%.2lf\n",(doub原创 2020-08-04 20:06:38 · 165 阅读 · 0 评论 -
2020牛客多校第4场 F
题意: 给两条平行线,求出C D点的顺序。画出一个草图发现把题上给的线全部连接起来。假设图是这样的代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#define CLOCK printf("Time used:%.2lf\n",(double)clock()/CLOCKS_PER_SEC);#include<bits/stdc++.h>#define int long long#define sc原创 2020-08-04 17:49:22 · 142 阅读 · 0 评论 -
2020牛客多校第4场 B
题目给了一个公式,主要就是让你求这个函数能进去的最大次数 cnt。然后求c*c的(cnt-1)次方,即是c的cnt次方想要函数进去的最大,必然是让进去后得到的x最大,对于gcd能得到最大值就一定会是x的最大因数列如 x = 24 . 则 24 -> 12 -> 6 -> 3 -> 1 进去了4次。 可以知道,对于x和它的最大因数(y)相除,可以得到它的最小质因数,同理,对于y的最大因数(z)相除,也可以得到y的最小质因数这也是x的最小质因数。递归下去,发现就是求出尽可能原创 2020-08-04 10:53:30 · 118 阅读 · 0 评论 -
2020牛客多校第八场 K
对于最大人数,由题可以知道第一盘有多少个,就最多有多少个人由题可以把利润求一个前缀和。b数组其实就是控制当前前缀合最多有多少个。将他们合并按前缀和的大小和能选的个数排序(这里前缀和小于第一个就不用加进去了,还不如选第一个)。之后我们只需要从大的开始选,能选就得把它选完,这就表明了它之后的前缀和都不能选了,而它之后的前缀有一个特点就是 b数组严格小于等于它。这样选完后结果就出来了。要开__int128代码:#define IOS ios::sync_with_stdio(false);cin.tie原创 2020-08-03 18:01:18 · 314 阅读 · 0 评论 -
2020牛客多校第三场C(判断三角形是顺时针还是逆时针)
题意: 给20个点,判断是左手还是右手。找到关键的地方,有4个点构成的长度分别为6,9,8.形成突破口。我的想法: 找到关键的4个点。再分情况讨论1: 判断你找到的拇指和小指哪个在左,哪个在右。2: 在1的条件下,特判当前手型是不是反方向,规定手指指向为0到180度为正向。考思维。可能复杂。代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#defin原创 2020-08-02 22:20:47 · 241 阅读 · 0 评论 -
2020牛客多校第三场 B
题意: 让你将最左边或者最右边的x个 移动到最右边或最左边。定义一个 pos 记录开始位置就可以了往左移了开始位置就是 pos+x,右移就是(pos+k+len)%len.防止负号用cin,string超时了,代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long longusing namespace std;typedef原创 2020-08-02 15:47:44 · 199 阅读 · 0 评论 -
2020牛客多校第三场 A
题意:让你在当前状态下选择最合适的一个操作让得到的鱼最多。对于有鱼的,我们直接取就是了,对于0得时候,我们判断是否有饵料。对于1,我们的想一下,如果有饵料我们是换鱼还是继续加饵料呢?这里我们可以先不管,有饵料就加。在最后的时候,饵料如果多出来,那么肯定在某一个1的时候,我们不加饵料而是换鱼,那么饵料的总数就减2,鱼就加1代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++原创 2020-08-02 14:38:38 · 119 阅读 · 0 评论 -
2020牛客多校第二场 C
题意就是求出最少的路径,所有路径走过的边加起来就是全部边。不难知道,最短的方法就是找到两个叶子节点相连,(设总数为叶子节点s)所以下界为ceil(s/2)对于每一个节点,用dfs序标出序号后,将l1 -> ls/2+1… ls/2 -> ls一定是满足的. 假设s为偶数大致证明:对于一个非叶子节点,它儿子中包含的叶子节点序号区间为[L,R], 则:与它左边直接相连的边一定会被 L<= s/2 ? (lL -> ls/2+L) : (lL-s/2 -> lL) 相连。原创 2020-08-02 12:23:46 · 180 阅读 · 0 评论 -
2020牛客多校第一场 J
第一种方法,直接用分部积分的算法,递推下去,最后可以得到结果书写潦草,大致写法方法二: 直接调用贝塔函数,对比系数法,就可以的到公式对于 p/q % mod 这种,当mod为奇数的时候,就可以用快速幂方法求逆元代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long longusing namespace std;t原创 2020-08-01 11:46:32 · 194 阅读 · 0 评论 -
2020牛客多校第二场F (滑动窗口)
题意: 求出每个k x k子矩阵中的最大的数,求他们的和。一个滑动窗口可以处理一维,两个就可以处理二维。滑动窗口后,把每个k*k的的最大值分布更新到了右下角的地方。#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>//#define int long longusing namespace std;typedef pair<int,int> pii;原创 2020-07-28 10:46:10 · 174 阅读 · 0 评论 -
2020牛客多校第一场 A题
题意: 给一个字符串,求出按函数的方法得到的B,B的所有以pi为起点的后缀按字典序排序。得到pi的序列。思路:找后缀数组C(找到第i个后面与它相同字符的距离),可以证明B数组与C数组对应的后缀字典序是相反的。求c数组的时候有些操作也在下面地址里。上面两个的地址 : 大佬地址找出每个后缀数组后,排序就可以了,直接sort排序,比较会超时。所以用Manber和Myers发明的算法,最后反着输出。O(nlogn) 挑战程序设计竞赛(第一版)378页有讲我的代码:#define IOS原创 2020-07-27 12:32:32 · 245 阅读 · 0 评论