![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
多校----牛客/hdu
#
夕林山寸
这个作者很懒,什么都没留下…
展开
-
2020牛客暑期多校训练营(第四场)C Count New String 巧妙的思维转化 + 广义后缀自动机板子
这一题很巧妙啊!首先题目给的式子就很吓人,但仔细分析我们就发现:其实就是求:这个只要把式子展开就能发现了。为啥能想到这?因为题目就是问本质不同的字串,我们肯定尽可能往这里构造(有后缀自动机可以解决这个问题)好了到这里我们就可n^2暴力做这题了。——把n个后缀离线插入到字典树中,然后BFS建立SAM,跑一下就行,其实就是广义后缀自动机。但显然AC不了。我们还需要优化。看题目字符集大小K=10,他这个条件肯定是有用的(除非出题人毒瘤,故意坑你,一般正常情况不会这样搞得,反正我没做原创 2020-10-01 19:26:29 · 223 阅读 · 5 评论 -
2020牛客暑期多校训练营(第四场)A Ancient Distance 二分 + 调和级数优化 +线段树维护
#include <bits/stdc++.h>using namespace std;typedef long long ll;#define re register#define ls (o<<1)#define rs (o<<1|1)#define m (l+r)/2#define pb push_backconst double PI= acos(-1.0);const int M = 2e5+7;int head[M],cnt=1;...原创 2020-09-27 15:44:39 · 131 阅读 · 0 评论 -
2020牛客暑期多校训练营(第三场)D Points Construction Problem 构造思维题
巧妙的思维构造题。如果直接手画找规律还是蛮难的。一般这种题需要先分析一下性质,找出最优最方便的构造方法。题目要求连接黑白的边的数量。显然上界是4*n;下面分析下界:仔细分析可知,若黑点位于不同的r行,c列,则连接边数量最少为:2*(a+b),因为每一行至少存在 白(-oo)-黑 黑-白(+oo)列同理。所以我们只需要枚举a,b就能找出最小的下界了。下界构造:从下往上,从左往右填色。每次把一个点移到很远的地方,总数量会加2或者加4.最后如果数量超出m(一定...原创 2020-09-26 10:07:13 · 118 阅读 · 0 评论 -
2020牛客暑期多校训练营(第二场)I Interval 最小割模型 + 转化为对偶图nlogn处理最小割
https://blog.csdn.net/MaxMercer/article/details/77976666?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.channel_param不会对偶图的可以学习这位博主原创 2020-09-07 11:13:09 · 176 阅读 · 0 评论 -
2020牛客暑期多校训练营(第二场) E Exclusive OR 异或卷积 FWT
经典FWT题型:设数组Fi:表示从原数组中恰好选i个数相互异或后,是否能凑出j。若Fi[j]=1 ,则说明能凑出j。显然:F1数组:原数组每个数位置上为1,其余为0;比如样例:41 4 5 7F1={1,0,0,1,1,0,1};显然有如下递推式:这就是FWT的通式。https://zhuanlan.zhihu.com/p/65998145https://zhuanlan.zhihu.com/p/41867199想学FWT的可以看看这两位大佬的知乎专栏。原创 2020-09-04 18:18:59 · 231 阅读 · 0 评论 -
2020牛客暑期多校训练营(第二场) K Keyboard Free 叉积求三角形面积+期望面积
题解给的数学方法太难了。还是看看正常人怎么解这题的吧:下面一张图就解释了做法:由于题目对精度要求比较低,只要1位小数。我们完全可以枚举OA,OB,OC的夹角,然后算出每一种情况的面积,最终估算出期望。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define re register#define ls (o<<1)#define rs (o<<1|1)原创 2020-09-04 13:39:32 · 347 阅读 · 1 评论 -
2020牛客暑期多校训练营(第二场)H Happy Triangle 线段树维护相邻两个元素的差
思路比较简单,这题主要考验码力。显然:分情况讨论:1: a<b<x 时, ab尽量大2:a<x<b时,a尽量大,b尽量小3: x<a<b时, b-a尽量小1.2直接用set维护即可。3用线段树维护,每次单点更新最多修改线段树2个点的值。主要是细节问题。具体看代码。#include <bits/stdc++.h>using namespace std;#define ls (o<<1)#define r..原创 2020-09-03 19:36:32 · 124 阅读 · 0 评论 -
2020牛客暑期多校训练营(第二场)G Greater and Greater bitset+思维
暴力很简单,复杂度:On*m =6e9;这个复杂度比较容易想到bitset(虽然我没想到,但做过这种题就很容易想到了)优化为:O(n*m/32)=2e8 完全可以接受。那么我们考虑如何用bitset来做:对于样例:1 4 2 8 5 72 3 3b[1]=2时:我们维护一个bitset:011111 , 表示 a[i]是否大于等于b[1]。对于b[2],b[3]同样维护:则三个bitset分别为:011111010111010111而我们要找的是一个子原创 2020-09-02 18:20:56 · 160 阅读 · 0 评论 -
2020牛客暑期多校训练营(第二场) A All with Pairs KMP+hash
题目求的是前缀与后缀匹配长度平方和。由于后缀总共就1e6个。所以我们可以用hash把后缀存下来。然后枚举每个串的前缀,计算f(s,t)^2.但这样会重复:比如 :abbaaba枚举s为aba时当t是aba时,a计算了一次,ab也计算了一次,aba又计算了一次。所以我们从前往后枚举s串的前缀时,要减去与当前 前缀匹配的后缀,与之前前缀匹配的结果。比如:s为aba时。枚举到a,有ba,aba 的后缀与它匹配 ,ans+= 2* 1*1;枚举到ab,有...原创 2020-09-02 17:02:50 · 111 阅读 · 0 评论 -
2020牛客暑期多校训练营(第二场) A All with Pairs AC自动机 fail树上处理
有一个比较显然的思路:先把每个串插入到字典树中建立AC自动机枚举每个字符串做为t串,求f(s,t),我们知道AC自动机上fail[i]即:根节点到i节点路径上字符串最长的(当前字符串的后缀)与模式串的前缀匹配。类似于于KMP里的next。所以枚举了一个字符串t,s串一定在t串结尾字符节点u的fail树祖先链上。我们沿fail树链求贡献即可。但有个问题:上图是样例的字典树,红线是fail数组。绿线枚举t串为aba时,遍历6号节点的fail树链。贡献为: 在6号节点,有3*3=9原创 2020-09-01 21:14:51 · 134 阅读 · 0 评论 -
2020牛客暑期多校训练营(第二场) B Boundary 计算几何,三点确定圆心
暴力做法就是枚举两个点,再枚举其他点是否在这个圆上。但n=2000.我们可以考虑n^2的做法:枚举两个点,确定一个圆心:然后存下来每个圆心出现的次数。加入一个圆上有n个点,则圆心出现次数为:n*(n-1)/2.最后找圆心出现次数最多的圆心,再求n即可。另外:圆上三点确定圆心可以用圆的曲线方程求解,现场求太浪费时间,直接记结论就行:#include <bits/stdc++.h>using namespace std;typedef long long原创 2020-08-25 11:50:27 · 190 阅读 · 0 评论 -
2020牛客暑期多校训练营(第一场) E Counting Spanning Trees 论文结论题
像这种论文结论题,现场基本不可能证明出来,猜都很难猜出来,只有看过论文知道。。而对于我这种不是学有余力的人来说,记住结论就行了,这个论文就不看了。性价比太低。https://arxiv.org/pdf/0706.2918.pdf 各位大牛有兴趣可以看看https://www.cnblogs.com/LiuRunky/p/2020_Nowcoder_Multi_University_Contest_1.html直接用了这位同学的总结。(没错我太懒了,论文都没打开过)然后根据这篇..原创 2020-08-24 22:33:00 · 189 阅读 · 0 评论 -
2020牛客暑期多校训练营(第一场)D Quadratic Form 拉格朗日乘数法+求矩阵的逆
证明过程如下。然后求个矩阵逆,矩阵乘法一下即可。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define re registerconst int M = 200+7;const int mod =998244353;ll a[M][M<<1];ll b[M],c[M];ll qpow(ll a,ll b){ ll ans=1; while(b) {原创 2020-08-24 17:10:42 · 153 阅读 · 0 评论 -
2020牛客暑期多校训练营(第一场)B Infinite Tree 虚树
https://blog.csdn.net/weixin_37517391/article/details/82744605这里学习了虚树的建立。https://blog.csdn.net/weixin_44282912/article/details/107346986然后看了这篇blog,做出了这道题。这道题如果n很小,比如n^2<=1e5,则可以直接建树,然后变成经典换根dp问题:选择一个源点,求出所有标记点到源点的距离乘标记点的点权和,最小。但这题n<=1e5,显然无原创 2020-08-23 19:02:29 · 194 阅读 · 0 评论 -
2020牛客暑期多校训练营(第一场) A B-Suffix Array 后缀数组
显然每个后缀只有第一次出现ab的的前面不同。要么是 ab要么是aaaaab,bbbbba要么是aaaa,bbbbO1判断,后面的部分用rank比较即可#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 1e6+7;struct suffix_array{ int str[M],sa[M],rank[M],t1[M],t2[M],c[M]; //原创 2020-08-22 12:18:21 · 174 阅读 · 0 评论 -
2020牛客暑期多校训练营(第八场)GIK
G:#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#define pb push_backconst double PI= acos(-1.0);const int M = 1e3+7; char s[M];struct node{ int a[5];}p[M];unordered原创 2020-08-03 21:55:54 · 234 阅读 · 0 评论 -
2020牛客暑期多校训练营(第七场) BDH
B:n*m个口罩分成最少的组使得可以这样分配:n个医院,每个医院m个口罩。m个医院,每个医院n个口罩。为了使得数量最少,每组的口罩尽可能要大。假设n<mn个医院,每个医院m个口罩,我们最多可以让 m/n*m组有n个口罩(当前最大值)。然后问题转化为了:n个医院每个医院需要m%n个口罩m%n个医院,每个医院需要n个口罩。变化为了子问题,dfs下去即可。#include <bits/stdc++.h>using namespace std;.原创 2020-08-02 21:39:57 · 173 阅读 · 0 评论 -
2020牛客暑期多校训练营(第六场) Harmony Pairs 数位DP
经典数位DP,两个限制条件。AB同时跑。B由N限制,A由B限制。然后就变成经典数位DP的题目了。细节看代码。还有两个限制最好开到数组里,虽然浪费点空间,但能省好多时间,我就因为这里T了。。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#define pb push_backconst原创 2020-07-29 23:27:46 · 285 阅读 · 0 评论 -
2020牛客暑期多校训练营(第六场)BCEK
232 北林一队 北京林业大学 4 10:02:35 B:队友写的,等会再看看。#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define mod 1000000007#define ll long long#define N 30000007int n,a[N],b[N],mul[N]; int Pow(int a,in.原创 2020-07-27 23:29:01 · 358 阅读 · 0 评论 -
2020牛客暑期多校训练营(第六场) G:Grid Coloring 构造 (较简单的构造+证明)
题解的构造,比较麻烦。以下是更简单的构造:设a数组a[M][M];a[i*2-1][j],表示第i行(横线)第j个横着的线的颜色。a[i*2][j],表示第i行(竖线)第j个竖着的线的颜色。如代码中这样赋值,以下是样例涂色的图例。这样构造有个显然的好处:首先任意相邻两个横线(左右)的颜色一定不同,这样规则3就满足一半了。下面证明任意相邻两个竖线(上下)的颜色不同:这样规则3完全满足。且:任意相邻两个竖线(上下)的颜色不同不就说明:任意大小为4的环均不同颜色原创 2020-07-27 23:08:46 · 215 阅读 · 0 评论 -
2020牛客暑期多校训练营(第五场)BDEFI
F:模拟即可,记得开long long#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#define pb push_backconst double PI= acos(-1.0);const int M = 1e5+7; ll a[110];int main(){ ll n;原创 2020-07-25 18:02:07 · 529 阅读 · 4 评论 -
2020牛客暑期多校训练营(第三场)G Operating on a Graph 并查集+链表 维护图上染色
操作一个颜色组时:与其相连的所有点所代表的颜色全部消失。对于每个点至多会有一次把相邻的点和自己变成相同颜色的操作,经过该次操作后,就永远和相邻的点同色了。我们开一个链表组,记录第i种颜色所相邻的点(注意这里时点不是颜色)。一次x操作后,把颜色x相邻的点y相邻的点集并变成点x相邻的点集,y所在集合的颜色变为x。然后发现:由于每个点最多进行一次把相邻点变成自己的操作,所有每个点x最多访问与x相连的点个数nm+1。总访问次数(n+m)次。再加上并查集,复杂度为O((n+m)*logn)原创 2020-07-20 23:16:44 · 182 阅读 · 0 评论 -
2020牛客暑期多校训练营(第二场) J Just Shuffle
只要数量掌握置换群的概念这题就比较简单了:对于一个排列A,给定一个置换P,置换 K 次后得到B(题目给你B和K让你求A)。A ^ K = B那么我们让B置换z次,使得z*K%r==0,(r为置换循环节)则会得到A。证明:B ^ K =,显然K*Z%r,形成循环,又回到自身A,即排列1,2,3,4……我们要求的置换P等于A再 置换一次。那么我们令Z:Z *K % r == 1.求出Z,然后让B置换Z次即可。显然Z就是K的逆元(百度逆元定义你就知道为什么了)现在就差循环...原创 2020-07-13 23:15:30 · 1828 阅读 · 6 评论 -
2020牛客暑期多校训练营(第二场)F Fake Maxpooling 单调队列+筛法
筛法求Onm出lcm,然后二维单调队列。细节看代码就懂了#include <bits/stdc++.h>using namespace std;typedef long long ll;#define pb push_backconst int M = 5000+7;int a[M][M],b[M][M],q[M]; int main(){ ios::sync_with_stdio(false); cin.tie(0); int n,m,sz; sc原创 2020-07-13 21:18:46 · 432 阅读 · 0 评论 -
2020牛客暑期多校训练营(第二场) 总结
296 北林一队 北京林业大学 现场AC: CDFD水题。C把叶子节点按dfs序排列,然后连接p和p+x/2;F:筛法ONM建出矩阵,然后二维单调队列即可https://blog.csdn.net/bjfu170203101/article/details/107325399补题:...原创 2020-07-13 21:19:03 · 795 阅读 · 0 评论 -
2020牛客暑期多校训练营(第一场) I 1 or 2 一般图的最大匹配+多重匹配拆点
一般图的最大匹配用带花树算法:O(n^3)。具体实现我也不太清楚,但当成黑匣子用即可。https://www.cnblogs.com/xiongtao/p/11189452.html可以参考这篇博客。下面说下我的想法:这题难点在于建图。如果度数全是1,那么直接套模板就行。但度数有不为1的情况。回顾二分图拆点(不会的话看 lyd的算法竞赛-进阶指南上有),简单说下思路:对于一个二分图的多重匹配:左部点i至多与kl[i]条边相连,右部点j最多与kr[i]条边相连则这个二分图多重匹原创 2020-07-12 23:11:54 · 443 阅读 · 0 评论 -
2020牛客暑期多校训练营(第一场) 总结
现场AC: F , I , J149 北林一队 北京林业大学 3 06:05:53 补题:原创 2020-07-12 22:56:26 · 473 阅读 · 0 评论 -
2020牛客暑期多校训练营(第一场) H Minimum-cost Flow
这题思路还是比较简单的。因为整个图的每条边的容量都相同设为x。所以在跑费用流的时候,每次的增广路流量一定是容量x。目标是总流量等于1,每次流量+x。只需要满流 [1/x] (下取整)次,再加上最后一次跑一个流量为1-x*[1/x](下取整) 的增广路即可。所花费为: [1/x] (下取整)*(每次的最小花费)+最后一次的最小花费。具体实现看代码主函数部分。#include<bits/stdc++.h> using namespace std;typedef lo原创 2020-07-12 22:52:09 · 344 阅读 · 0 评论 -
2020 多校补题情况
牛客:第一场J:AEHIJ第二场:CDFJ第三场:ABCEFGL第四场:BFH第五场:BDEFI第六场:BCEGHK第七场:CDHhdu——原创 2020-08-21 18:02:08 · 133 阅读 · 0 评论 -
2020 Multi-University Training Contest 10 1010 Tic-Tac-Toe-Nim NIM博弈
由于双方第一次必须取一整堆:我们可以先枚举先手选择的格子:(x1,y1)后手显然不能选择与(x1,y1)同行或者同列的格子,(否则先手直接同列或同行取胜)再枚举后手选择了(x2,y2),此时剩下的7个格子,有6个与(x1,y1)或(x2,y2)同行或同列,当任意玩家取走这六堆的最后一枚石子时,他就必败了,而最后一堆石子可以任取。这7堆石子就构成了NIM博弈,谁无石子可取,谁就必败了。枚举判断异或和即可。#include <bits/stdc++.h>using nam原创 2020-08-21 15:05:36 · 195 阅读 · 0 评论 -
2020 Multi-University Training Contest 7 07,09,10
AC:09,10hdu6850 1007 Game很容易想到,如果先手到达最长点对之一,则必败。(后手可以走最长点对的另一点,使得先手无处可走)对于一个游戏,把他转化为无向图。先找出当前图中最长的边d。然后把边长为d的所有边连接的点都删去(这些点称为必败点,到达即必败),然后这些点设为一层(称为必败层,即先手到这一层必败)然后得到新的无向图。重复上述操作。直到图只剩一个点,或者为空,最后的一个点设为一层。显然这是一个分层图,只能由底层走向高层,且先跨层的人必败。而且每层.原创 2020-08-12 18:27:59 · 233 阅读 · 0 评论 -
2020 Multi-University Training Contest 5 1001,1003,1009
316 team0691 北京林业大学 3 09:56:39 1001 Tetrahedron由体积相同可以化成:然后枚举求期望,线性求逆元即可。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#define pb push_backconst double P.原创 2020-08-04 21:28:20 · 120 阅读 · 0 评论 -
2020 Multi-University Training Contest 3 1004,1005,1007,1009
168 team0691 北京林业大学 4 11:47:00 1004:如果是求和等于p,则直接用滑动窗口。而这里是取模,我们依然可以类比滑动窗口,用map进行快速维护。总体思想:贪心,前面能构造出尽量构造,给后面的数多一些选择空间#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<&l原创 2020-07-28 19:15:13 · 206 阅读 · 0 评论 -
2020 Multi-University Training Contest 2 1012 hdu 6774 String Distance 序列自动机+dp
一道很考验dp功底的题目。思维性强。首先分析题目,对于A[l,r],与B[1,m]的距离为:r-l+1+m-2*LCS(A(l,r),B(1,m));因为最后一定是AB相同,如果用插入操作,一定是在LCS的基础上,B有的字符,且A没有(或者反过来),然后在A这个位置插入一个字符串,次数等价于直接删去。(而同时加两个字符串就更没必要了)。所以等价于AB,字符同时删去到A,B的LCS。到这里还是比较简单的。下面是这题的难点:怎么在比较短的时间内维护任意A(l,r)与B的LCS?这个我也是原创 2020-07-24 15:02:29 · 295 阅读 · 0 评论 -
2020 Multi-University Training Contest 2 1001,1006,1010
224 team0691 北京林业大学 3 1001:每次显然极大连通量。正着做最优是n^2。正难则反。倒着做发现:每次把最大值降到其周围相邻的最小值,知道降到0;我没每次加入一个点(从点权大到小),把它与其相连的点,且已被加入的点并到一个集合里,代表这些点在一个连通快内可以一起缩小。缩小到当前节点的权值。设有nm个连通快,则执行到当前步的花费为:nm*(a[i]-a[i-1]).加入n个点后的花费即最终花费。#include <bits/stdc++.原创 2020-07-23 20:31:26 · 445 阅读 · 0 评论 -
HDU 6756 2020 Multi-University Training Contest 1 1006 分块+均摊复杂思想 做到n * sqrt(n)复杂度
更新一下这题的n*sqet(n)解法。我们发现:这题要么更新是O(n),查询是O(1),要么更新是O(1),查询是O(n).我们可以采取均摊复杂度的思想,让查询和更新都做到O(sqrt(n)).每次更新:若当前节点的度数小于等于根号n,那么则暴力更新其周围节点。否则不管,其影响留到查询时更新。查询时:点x的周围节点,度数小于等于根号n的节点更新对x造成的影响已经更新。只需要考虑度数大于根号n的节点更新对x造成的影响。由于x周围度数大于根号n节点不会超过根号n个,所以此次更新影响也是根号n级别原创 2020-07-22 13:53:50 · 275 阅读 · 0 评论 -
HDU 6756 2020 Multi-University Training Contest 1 1006 线段树+三元环计数复杂度的思想
#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#define pb push_backconst int M = 1e5+7;int du[M],a[M];vector<int>v[M],vq[M];vector<int>g[M];vector<int&g...原创 2020-07-21 18:47:07 · 410 阅读 · 8 评论 -
2019牛客暑期多校训练营(第七场) H Pair 数位DP 维护两个数 异或 与 关系
ll dp[33][2][2][2][2][3][3];表示: A和B 填到第i位,(前面i-1位已经填完,现在开始填第i位),前面i-1位是否达到A的上界(la),是否达到B的上界(lb);A的第i-1位是否是前导0(ifa0),B的第i-1位是否是前导0(ifb0) , 前i-1位填的结果,A &B > C 则为2,A & B == C 则为1,A & B < C 则为0.(比较的是AB前i-1位填的结果与C的前i-1位比较),最后是:前i-1位填的结..原创 2020-09-20 21:59:16 · 1456 阅读 · 0 评论 -
2019牛客暑期多校训练营(第二场)A,B,D,E,F,H,J
以后每周打牛客重现赛F. Partition problem递归组合数枚举。先把所有人当成红队,再组合数枚举7个人移到白队,每次移动改变的竞争值可以在On的复杂度内算出。#include <bits/stdc++.h>using namespace std;typedef long long ll;//typedef __int128 LL;//typedef...原创 2019-12-09 15:27:44 · 348 阅读 · 0 评论 -
2019暑期多校补题情况 hdu
hdu:Ο 以补. 未补题号 A B C D E F G H I J K L 状态 . Ο . Ο Ο . . . . . . . 第一场:现场:1004:思路1005:板子最短路+最小割--存了板子RANK:196...原创 2019-07-24 21:19:33 · 170 阅读 · 0 评论