NOI2021模拟测试赛 解题报告

(一)

A

暴力:求出所有直线的解析式,对于每个点枚举所有直线看是否经过该点
优化:分块。关键是分块方式,这里是把平面分成sqrt(n)*sqrt(n)块
实现细节:
1.vector直接开二维来表示是哪一块,不要给块编号
2.(a-1)/b+1相当于a/b向上取整
3.不开 long long 见祖宗

(二)

A

  • 每次查询相当于问存在多少个 i ,满足 1 ≤ i ≤ n 1≤i≤n 1in 且有 x + a 1 + a 2 + ⋯ + a i = y x+a_1+a_2+⋯+a_i=y x+a1+a2++ai=y
  • a i ∈ { i − 1 , i } ( 1 ≤ i ≤ n ) a_i \in \{i-1,i\} (1≤i≤n) ai{ i1,i}(1in) a i a_i ai 单调不减
  • x + a 1 + a 2 + ⋯ + a i = y x+a_1+a_2+⋯+a_i=y x+a1+a2++ai=y 移项得 x + ( a 1 − y ) + ( a 2 − y ) + ⋯ + ( a i − y ) = 0 x+(a_1−y)+(a_2−y)+⋯+(a_i−y)=0 x+(a1y)+(a2y)++(aiy)=0
  • 由于 a i a_i ai 单调不减, a i − y a_i−y aiy 同样单调不减,随着 i 的增长, x + ( a 1 − y ) + ⋯ + ( a i − y ) x+(a_1−y)+⋯+(a_i−y) x+(a1y)++(aiy) 一定先不升后不降,二分找到相应的等于 0 的位置即可

实现细节:

  • 关于 由不升到不降的边界:
    1 ≤ i ≤ k 1≤i≤k 1ik时, x + ( a 1 − y ) + ( a 2 − y ) + ⋯ + ( a i − y ) = 0 x+(a_1−y)+(a_2−y)+⋯+(a_i−y)=0 x+(a1y)+(a2y)++(aiy)=0不升, k + 1 ≤ i ≤ n k+1≤i≤n k+1in时, x + ( a 1 − y ) + ( a 2 − y ) + ⋯ + ( a i − y ) = 0 x+(a_1−y)+(a_2−y)+⋯+(a_i−y)=0 x+(a1y)+(a2y)++(aiy)=0不降。
    那么 a k − y ≤ 0 a_k-y≤0 aky0 a k + 1 − y ≥ 0 a_{k+1}-y≥0 ak+1y0,即 a k ≤ y ≤ a k + 1 a_k≤y≤a_{k+1} akyak+1
    又因为 a k = k 或 k − 1 a_k=k或k-1 ak=kk1 a k + 1 = k + 1 或 k a_{k+1}=k+1或k ak+1=k+1k
    所以 y = k y=k y=k时必符合条件,
    所以把 [ 1 , y ] [1,y] [1,y]作为不升段, [ y + 1 , n ] [y+1,n] [y+1,n]作为不降段
  • 关于特判:
    找到一个满足条件的 i 时,
    若 i 在不升段上,
    a i + 1 − y ≠ 0 a_{i+1}-y≠0 ai+1y=0,则在不升段上,这个 i 是唯一的。
    但若 a i + 1 − y = 0 a_{i+1}-y=0 ai+1y=0 ,如果 i + 1 ≤ y i+1≤y i+1y,则在不升段上,这个 i 不唯一,这种情况二分无法处理。但因为 a i + 1 = y a_{i+1}=y ai+1=y,所以 i = y − 1 i=y-1 i=y1 i = y ( 舍 ) i=y(舍) i=y(),即不升段上i不唯一的情况仅有 i 1 = y − 1 , i 2 = y i_1=y-1,i_2=y i1=y1,i2=y,可以直接特判。
    同理可得不降段上i不唯一的情况仅有 i 1 = y , i 2 = y + 1 i_1=y,i_2=y+1 i1=y,i2=y+1

B

  • 最优方案一定只取奇数个元素,证明见题解
  • 考虑枚举中位数,设为 a i a_i ai
  • 当平均数>中位数时,平均数尽可能取大,即取 a 1 , a 2 . . . a i − 1 a_1,a_2...a_{i-1} a1,a2...ai1的最大一部分和 a i + 1 , a i + 2 . . . a n a_{i+1},a_{i+2}...a_n ai+1,ai+2...an 的最大一部分;当平均数<中位数时,平均数尽可能取小,即取 a 1 , a 2 . . . a i − 1 a_1,a_2...a_{i-1} a1,a2...ai1的最小一部分和 a i + 1 , a i + 2 . . . a n a_{i+1},a_{i+2}...a_n ai+1,ai+2...an 的最小一部分 (两部分所取数的个数一致)
  • 在集合S { a 1 , a 2 , . . . , a n } \{a_1,a_2,...,a_n\} { a1,a2,...,an}加入两个新元素 a n + 1 , a n + 2 a_{n+1},a_{n+2} an+1,an+2后,S的平均数变化情况:
    记原平均数为 a v e ave ave,则新平均数为 a v e × n + a n + 1 + a n + 2 n + 2 \frac{ave\times n+a_{n+1}+a_{n+2}}{n+2} n+2ave×n+an+1+an+2
    t = a v e × n + a n + 1 + a n + 2 n + 2 − a v e t=\frac{ave\times n+a_{n+1}+a_{n+2}}{n+2} - ave t=n+2ave×n+an+1+an+2ave,则
    t = a v e × n − a v e × ( n + 2 ) + a n + 1 + a n + 2 n + 2 t=\frac{ave\times n - ave \times (n+2) +a_{n+1}+a_{n+2}}{n+2} t=n+2ave×nave×(n+2)+an+1+an+2 = − 2 × a v e + a n + 1 + a n + 2 n + 2 =\frac{-2\times ave+a_{n+1}+a_{n+2}}{n+2} =n+22×ave+an+1+an+2
    t > 0 t>0 t>0 a n + 1 + a n + 2 > 2 × a v e a_{n+1}+a_{n+2}>2\times ave an+1+an+2>2×ave时,新平均数大于原平均数
    t = 0 t=0 t=0 a n + 1 + a n + 2 = 2 × a v e a_{n+1}+a_{n+2}=2\times ave an+1+an+2=2×ave时,新平均数等于原平均数
    t < 0 t<0 t<0 a n + 1 + a n + 2 < 2 × a v e a_{n+1}+a_{n+2}<2\times ave an+1+an+2<2×ave时,新平均数小于原平均数
  • 尽可能取大时,平均数 随 所取数的个数先增后减;尽可能取小时,平均数 随 所取数的个数先减后增

C

能猜到结论,但要证明和搞出构造方案是不可能的
在这里插入图片描述
在这里插入图片描述

(三)

C

博客

猜你喜欢

转载自blog.csdn.net/Emma2oo6/article/details/114118729