游记
某校某院与某院联合培养机制给排了两场讲座,讲完吃饭,讲座时间\(8:00-12:00,\)拖堂\(10\)min
,到食堂\(10\)min
,吃饭\(30\)min
,走回去\(10\)min
,打开网址发现时间只够看榜的
一看榜我草\(5\)小时连\(4\)个题都做不出来
翻题面发现A,L
纯签到,B
半签到,遂确信成分
题解
A
验证是否\(\prod\limits^{n}_ {i=1}a_{i}\leq 10^7\cdot m\)即可
B
判断条件:
\(1.\sum\limits_{i=1}^{n}a_i\equiv 0\pmod{3}\)
很显然,如果你要分给3个人一样的整数块糖果,那总数必然是这个整数乘\(3\),也就是总数为\(3\)的倍数
构造:
首先要把所有\(2\)和\(3\)均分,这是一切的基础
然后考虑\(3\)的情况:
不剩\(3\)自然万事大吉
剩两个\(3\),一堆拿出两个\(2\)换成两个\(3\),拿出来的两个\(2\)均分到没动的两堆
如果每堆只有一个\(2\)那就寄
剩一个\(3\),
先三堆各自拿出一个\(3\)来准备换
然后选两堆把一个\(2\)换成一个\(3\),拿出来的两个\(2\)给到没动的那堆
如果总共只有一个\(3\),不能让三堆各自拿出来还是寄
C
构造考虑格雷码
即a[i]=lowbit(i)
嗯,现成的构造方法
至于有没有解,其实是看\(x\geq 2^{\lfloor\log_{2} n\rfloor}\)
为啥呢?因为lowbit
函数取得的值\(l\leq n\)显然成立,等号只会是\(n=2^t,t\in \mathbb{N}\)
这里边\(t\)的取值集合显然是\(\left\{ t\in \mathbb{N}|t\in [0,\lfloor\log_{2} n\rfloor]\right\}\)
最大的那个数就是\(2^t,t=\lfloor\log_{2} n\rfloor\)
所以\(x\geq 2^{\lfloor\log_{2} n\rfloor}\)才能有解
D
傻逼贪心
每个订单选能用的最大的
鉴于减免限制小的红包可以用在金额大的订单上,反之不能,所以先把减免限制小的加进取值集合里
然后红包金额排序,挨个扫就完事了
E
没看明白,题面连着题解都是依托
照着题解写代码结果没过。
F
看着像大模拟,其实不是
对于每一列,维护一个数组表示考虑到当前行最终情况下石头的最高点
空行不管
一旦遇到新的石头,取石头所在区间当前所有最高点的最大值,然后把这些区间的最高点统一更新成当前石头的最高位置
G
就给边定向完了之后根号分治
边定向规则
度数小指向度数大,度数相同编号小指向编号大
这样定出来边之后一定是\(\text{DAG}\)
证明就是如果度数不变的话从编号小的点出发走边一定到编号更大的点,回不去的
度数变化也一定是度数从小变大,因为没有往回的边
取完以后枚举即可
然后是根号分治的思路:
度数大于\(\sqrt{m}\)的点个数不超过\(\sqrt{m}\)个
那么这些度数大于\(\sqrt{m}\)的点至多能和\(\sqrt{m}\)个点连边,因为连有向边要求度数小向度数大连
如果度数小于\(\sqrt{m}\),那么这些度数不会全部变成出度,所以边数至多\(\sqrt{m}\)
所以枚举每个点时间复杂度\(O(\sqrt{m})\)
总时间复杂度\(O(m\sqrt{m})\)
H
官方做法是哈希,
大概预处理之后去个重然后类似字符串哈希干就完了
但是\(O(n)\)做法还有双指针
对于每个\(x\),能够符合条件的\(y\)必然是个连续段,而且满足左右端点各自单调不减
维护两个数组\(c,d\),
\(c_i\)表示第\(c_i\)种糖果是否在\(a\)中当前位置出现过
\(d_i\)表示第\(d_i\)种糖果在\(b\)有没有出现过,就是一个要左端点动,一个要右端点动
移动指针:左指针\(l\)右移,一直移到当前位置的糖果出现在\(b\)中
右指针\(r\)右移,只要\(b_{r+1}\)在\(a\)中已经出现过
至于如果出现不同元素的话,
由于不在已有集合中,右端点不动
同理,左端点会一直往右找,这样就必然造成\(l>r\)
题解还有莫队做法,怕是学数据结构学傻了
直接双指针就可做了,还硬要分个块,没有观察到可行区间端点各自不减的性质吗
I
二分图博弈
二分图的话挺板子的,因为建图挺板子
和"跳马问题"相关的,基本上就是二分图
证明一律考虑\(gcd(a,b)=1\)的情况,别的情况同除\(gcd(a,b)\)
一奇一偶按行列之和划分,奇数和偶数构成二分的点集
两个奇数按行号划分,奇数和偶数构成相应点集
博弈的结论:
如果起始点在所有最大匹配里,先手必胜,否则后手必胜(证明不会)
找起始点是不是在所有最大匹配里,直接匈牙利两遍,带一遍起点,另一遍不带
如果最大匹配不是同一个就寄
J
诈骗题
真正搞人的地方就是操作不影响结果
K
诈骗题
这个题真正最搞的地方真就是拿python
写个print(1)
然后它过了
考虑到随机生成的数规模不小,并且\(n\geq 100\cdot k\geq 100\)
为什么不考虑会生成一个\(1\)呢?
就算不会生成\(1\),剩下的随机数里出两个数互质的概率会低吗?
显然并不
所以print(1)
就是对的
L
和A
一样签到题
不过生写字数太多,扔了