2017 Multi-University Training Contest 2 solutions BY UESTC

来源:互联网 发布:店铺怎么开通淘宝客 编辑:程序博客网 时间:2024/05/16 08:35

1001:

首先,我们统计出Derek和Alfia答案相同的题目数量k1和答案不同的题目数量k2. 对于两人答案相同的题目,共有以下两种情况:

  • 两人都对

b.两人都错 对于两人答案不同的题目,共有以下三种情况: c.Derek对Alfia错 d.Alfia对Derek错 e.两人都错 于是我们可以列出一些方程: k1+k2=n a+b=k1 c+d+e=k2 a+c=x a+d=y 又a,b,c,d,e均为非负整数,且满足a,b<=k1;c,d,e<=k2 将a,b,d,e全部用c替换后需要同时满足以下四个条件: 0<=c<=k2 x-y<=c<=k2+x-y (x-y)/2<=c<=(k2+x-y)/2 x-k1<=c<=x 我们只需要判断这四段区间存不存在公共的整数点,如果存在,则说明Derek没有说谎;如果不存在,则说明Derek在说谎。

1002:

本题要求在1e6*1e6的矩形内找到一个特定的1e3*1e3的小矩形。 可以选择每隔K行或K列选出一个长宽皆为L的小矩形作为识别矩形,当识别矩形出现在输入矩形时,再进行完全匹配。根据鸽笼原理,当K+2*L<=1000时,输入矩形一定覆盖了至少一个识别矩形。这里选择L=7使得可以用一个int表示一个识别矩形。将hash结果视为随机的,则识别矩形匹配成功进入完全匹配的次数约为(1e6/k)^2*(1e3)^2/2^49,为极小值。

1003:

预处理:a_i -= i ,易证明从最小的b开始选每次选最大的一定可以使结果最大。 证明思路:如果条件改为a_i<=max{a_j-j|b_k<=j<=n},那么b的顺序与最后的结果无关。条件改回来后,由于每次要计算一个数的最大值时都有a_(n+1)...a_(i-1)在范围中,所以每次只需让a_i - i尽可能大,那么就把大的数尽早用上,每次一定考虑尽量多的数字,这样取得的数字就尽可能的大。 所以说每次就是求区间最值,加在答案上。由于贪心的思路,每次要求的区间的下界是单调不降的,故可以用单调队列优化到O(n)的复杂度。 由于1 ≤ b_i ≤ n,对b排序可以用哈希排序(桶排序)完成。 进一步观察,可以发现这样贪心时 a_(n+1)...a_i 其实是单调不增的,所以并不需要每次求区间最值了,选第一个数时就选最大的,后面的选择顺序与最终结果无关了。

1004:

性质1:数列的相邻互换将改变逆序对数的奇偶性。 证明1:易得。 性质2:去掉空格,剩余的木板从左到右从上到下看做数列,【操作】不改变数列逆序对的奇偶性。 证明2:左右移动:生成数列不改变,逆序对不变;上下移动:相当于移动的木板向前或向后进行m-1次相邻互换,但是空格最终要回到右下角,总的上下移动为偶数,所以总的相邻互换为偶数,由性质1可得证。 性质3:所有局面都可通过一定的操作得到如下局面: 以4*7为例

12345678910111213141516171819XX2223242526X 

证明3:

abXXX 

可以证明任意初始2*3局面,无论a、b初始在哪都可以通过一定操作使其位置如图所示。 证明脑补即可。     推广到任意局面:只需按顺序把数字当做a、b进行类似搬动,可保证性质3成立。       由以上性质,考虑完成性质3局面后右下角三个数字等价于2*2局面。 枚举所有6种2*2局面发现:相同逆序对奇偶性的局面可以互相到达。 所以只需考虑原排列的逆序对数的奇偶性:偶的“YES”,奇的“NO”;   按题意生成原始排列,观察发现,每一轮数后方比该数小的数的数量(即对逆序对数的贡献)呈等差数列形式,公差p-1,项数为(num-1)/p+1,照此简化计算,不需要正真求出排列。

1005:

这题由于n变为了3000,因此需要对两处都进行优化,预处理和暴力枚举的区间都要进行优化。预处理的时候会发现其实有很多无用状态,我们可以用la数组来防止这种现象的发生。这样就做到n^2的了。暴力枚举的时候你需要进行枚举两段就行了。这里有个细节就是你枚举删除的第一段的时候和最后一段留下的是要求连接在一起,因此这样会减去很多种无用情况,复杂度最坏情况只有n^2。

1006:

对于任意i>=1,当j>=3时,有 1 通过归纳法可以得到 2 进而推导出 3 通过矩阵快速幂求解

1007:

ggpp的原根,x=g^{a},y=g^{b}x=ga,y=gb,那么有\left(g^{a} + g^{b} \right)^{i} = g^{ai} \% p(ga+gb)i=gai%p,即\left(1 + g^{b-a} \right)^{i} = 1 \% p(1+gba)i=1%p,令1 + g^{b-a} = g^{k}1+gba=gk,则有g^{ki}=1 \% pgki=1%p,即ki \% \left(p - 1 \right) = 0ki%(p1)=0,因为0 < k < p - 10<k<p1,所以kk的取值有gcd\left(i,p - 1 \right) - 1gcd(i,p1)1个,递推回去,可知x = y * inv \left(g^{k} - 1 \right)x=yinv(gk1),故xx的取值也是gcd\left(i,p - 1 \right) - 1gcd(i,p1)1个.
所以我们最后只需要求m \sum_{i=1}^{p-1} \left{ i*gcd(i,p-1)-i \right}mi=1p1{igcd(i,p1)i}.
其中\sum_{i=1}^{p-1}ii=1p1i我们可以直接求出.
而另一部分\sum_{i=1}^{p-1}i*gcd(i,p-1)i=1p1igcd(i,p1),我们可以通过枚举gcdgcd的值,化为\sum_{d|(p-1)}d^{2}\sum_{k=1}^{\frac{p-1}{d}}k*\left [ gcd\left ( k,\frac{p-1}{d} \right )=1 \right ]d(p1)d2k=1dp1k[gcd(k,dp1)=1],然后根据公式\sum_{i=1}^{n} i*\left [ gcd\left ( i,n \right )=1\right ]= \left ( n\varphi \left ( n \right )+\left [ n=1 \right ]\right )/2i=1ni[gcd(i,n)=1]=(nφ(n)+[n=1])/2求解.

1008:

每种数可以单独算出其期望然后相加 对于数量小于13的数,可以用容斥的方式来做 对于大于13的数,可以求出全不含的矩阵个数,然后用全部矩阵减去这部分 复杂度 o(n^4/13*T)

1009:

令F(i)表示是i倍数的方案数,可以容易的通过预处理出前缀和后nlogn的时间内求出,之后利用预处理出莫比乌斯函数后进行简单的反演即可算出答案,加上快速幂,总复杂度nlogn^2

1010:

把T接在S后面,用后缀自动机构造出后缀树,求出他的dfs序(等同于后缀数组)。 这样之后,用树上倍增就可以找到T[a,b]所在的节点。 由于一颗子树在dfs序上是一段区间,我们就可以顺势求出那个节点的dfs所在区间。 我们知道在树上每个节点的right集是它子节点right集的并,我们知道这个节点的Right集是dfs序上的一段区间。 由于我们要求sum{f[yi]},可以直接把right赋值为f[right],最后我们要求的就是这段区间right集中c<=right<=d的权值和sum{f[yi]}。 对于这个问题,由于有在线修改操作不能直接主席树完成。我们可以直接树状数组套权值线段树完成,或者常数更小的静态主席树+树状数组套权值线段树,或者树状数组套平衡树,时空复杂度nlognlogn。

1011:

题意,二维平面上给N个整数点,问能构成多少个不同的正多边形。 题解:容易得知只有正四边形可以使得所有的顶点为整数点。(具体证明可参考杨景钦在2017的国家队论文) 所以正解即求出所有的正四边形个数。 枚举2个点,然后暴力判断另外2个点的位置是否存在。 复杂度 N*N*logN。

阅读全文
0 0
原创粉丝点击