zoukankan      html  css  js  c++  java
  • CF1333 简要题解

    构造场,虽然题目有点毒瘤但是还是很有趣的,请多来点这样的 round,我什么都不会做的。

    • A

    考虑第一列和第一行染黑,其余染白的情况,发现恰好满足条件。什么,你问怎么想到的?这……

    • B

    由于只能从左向右加,显然先让右边的元素满足条件最合适。因此无解的条件是:

    1. (a_i<b_i),且 (forall j<i, a_{j}leq 0)

    或者

    1. (a_i>b_i),且 (forall j<i, a_jgeq 0)
    • C

    还算简单的题目,稍微卡了一小会。

    (s_i=sum_{j=1}^i a_i),则一个区间 ([l, r]) 是 “不好的”,当且仅当 (s_{r}-s_{l-1}=0),即 (s_r=s_{l-1})(注意 (s_0=0))。

    由左向右枚举答案的右端点 (x),考虑哪些左端点 (y) 是合法的:显然对于其左的所有 “不好的” 区间 ([l_i, r_i]),有 (y>l_i),除此之外没有其他限制。

    因此,扫描时对于每个子区间的右端点 (r_i),求出它左边可以和它构成 “不好的” 区间的最大的 (l_i),就可以算出每个 (x),在哪段范围内的 (y) 是合法的,这一步可以用 map 简单完成。

    • D

    考虑两个学生翻转方向的过程,其实相当于互相交换了位置。因此,原序列可以看作一个 (01) 串,我们的目的是将它排序,每次可以选中若干个的 10,并将它们交换位置。要求在恰好 (k) 次内完成。

    注意到每次交换一个 10,都恰好消除了一个逆序对。因此 (k) 大于逆序对总数的情况下无解。

    另外,每次选中一些 10 前,每个 10 都是互不相交的,因此可以每次将所有可能的 10 都选中,不难看出这是最快消除所有逆序对的方式。设如此操作一共花了 (x) 步,那么 (k<x) 的情况下也无解。

    否则,我们需要把 (x) 步中每一步选出的位置分成若干个非空子集,使得最后有恰好 (k) 个子集,方案不难构造。

    • E

    看起来是最难的一道题,实际上……确实是最难的(

    vp 场上没做出来,赛后花了点时间研究出来了。

    首先 (nleq 2) 的时候,queen 可以一步到达任意位置,所以无解。

    (n=3) 的时候可以先打个表,然后发现可行的方案非常多(虽然大部分方案都是对称的)。

    如果你运气好或者善于观察,可以发现这样一个 (3 imes 3) 的矩阵(或者它对称后的样子):

    [egin{array}{ccc}9 & 6 & 5\7 & 1 & 8\3 & 2 & 4\end{array} ]

    发现一直到 (6) 为止,rookqueen 的行动路线都是一样的,但是 queen 会选择 (6 ightarrow7 ightarrow8),从而无法回到 (9)。这启发我们,由于 queen 包含了 rook 可能的所有操作,我们先诱导它们,在前面的绝大部分路程中都走过相同的路径,而在临近终点时,利用 queen 可以斜向贪心的性质,将它引诱到某个岔路上去。

    在上面的矩阵中,(6 ightarrow7 ightarrow8) 这条路线就引诱了 queen 贪心地追求 (7)

    因此我们可以直接在这个矩阵的基础上拓展,详见代码:

    	for (R int i = 2; i < n; ++i) ans[2][i] = ++cnt;
    	for (R int i = 3; i <= n; ++i) {
    		if (i & 1) {
    			for (R int j = n - 1; j; --j)
    				ans[i][j] = ++cnt;
    		}
    		else {
    			for (R int j = 1; j < n; ++j)
    				ans[i][j] = ++cnt;
    		}
    	}
    	for (R int i = n; i > 2; --i)
    		ans[i][n] = ++cnt;
    	for (R int i = n; i > 2; --i)
    		ans[1][i] = ++cnt;
    	ans[1][2] = ++cnt, ans[2][1] = ++cnt;
    	ans[2][n] = ++cnt, ans[1][1] = ++cnt;
    

    注意此处实际上将上面的 (8) 看作放在了第 (n) 列。

    • F

    诶 dls 怎么秒了,大概是原题,先做这个吧。

    诶大家怎么都秒了,哦原来是真的水(

    首先一个直观的认识是,(k) 比较小的时候只选质数和 (1),可以保证 (max(gcd)=1)

    考虑某个合数 (x=pcdot q),则对于任意的 (y),有 (gcd(x, y)geq max(gcd(p, y), gcd(q, y)))。也就是说,如果我们选了某个合数 (x),必然会先选它所有的因子,否则必然不优。

    此时考虑一个新加入的 (x) 的贡献:由于 (x) 在之前还没有选,(x) 的倍数也不可能被选。因此新增 (x) 后,它产生的贡献是 (gcd(x, frac{x}{p})=frac{x}{p}),其中 (p)(x) 最小的质因子。

    于是就做完了,筛出每个 (x) 最小的质因子 (p),按照 (frac{x}{p}) 排序后逐个加入即可。

    实际上由于不需要输出方案,考虑每个 (y) 作为答案存在的区间,其实就是有多少个 (x) 满足 (frac{x}{p}=y) 而已,按照 (y) 从小到大输出它对应的区间长度次即可。复杂度 (O(n)),瓶颈在于线性筛最小质因子。

    所以为什么不让 (nleq 3 imes 10^7),并输出答案序列的哈希值呢。


    顺便提一句,抢在官方题解之前发布,很开心(

  • 相关阅读:
    面试题系列---【字符串常用方法、数组常用方法、Number常用方法】
    面试题系列---【箭头函数和普通函数的区别?箭头函数的优缺点?】
    面试题系列---【什么是Promise,解决什么问题?Promise.all解决了什么问题?实现原理?回调地狱?】
    面试题系列---【data数据改变,页面不更新原因及解决方案】
    JavaScript课程——Day20(jQuery:使用、选择器、节点遍历操作、其他属性操作)
    JavaScript课程——Day18(本地存储、JSON方法)
    JavaScript课程——Day16(扩展原型上的方法、继承)
    JavaScript课程——Day15(编程思想、对象的读写、面向对象的创建、面向对象的案例)
    JavaScript课程——Day14(回调函数、自执行函数、闭包、递归、防抖与节流、call与apply)
    JavaScript课程——Day13(4、无缝轮播图)
  • 原文地址:https://www.cnblogs.com/suwakow/p/12669947.html
Copyright © 2011-2022 走看看