(一)
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 1≤i≤n 且有 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∈{ i−1,i}(1≤i≤n) 知 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+(a1−y)+(a2−y)+⋯+(ai−y)=0
- 由于 a i a_i ai 单调不减, a i − y a_i−y ai−y 同样单调不减,随着 i 的增长, x + ( a 1 − y ) + ⋯ + ( a i − y ) x+(a_1−y)+⋯+(a_i−y) x+(a1−y)+⋯+(ai−y) 一定先不升后不降,二分找到相应的等于 0 的位置即可
实现细节:
- 关于 由不升到不降的边界:
设 1 ≤ i ≤ k 1≤i≤k 1≤i≤k时, x + ( a 1 − y ) + ( a 2 − y ) + ⋯ + ( a i − y ) = 0 x+(a_1−y)+(a_2−y)+⋯+(a_i−y)=0 x+(a1−y)+(a2−y)+⋯+(ai−y)=0不升, k + 1 ≤ i ≤ n k+1≤i≤n k+1≤i≤n时, x + ( a 1 − y ) + ( a 2 − y ) + ⋯ + ( a i − y ) = 0 x+(a_1−y)+(a_2−y)+⋯+(a_i−y)=0 x+(a1−y)+(a2−y)+⋯+(ai−y)=0不降。
那么 a k − y ≤ 0 a_k-y≤0 ak−y≤0, a k + 1 − y ≥ 0 a_{k+1}-y≥0 ak+1−y≥0,即 a k ≤ y ≤ a k + 1 a_k≤y≤a_{k+1} ak≤y≤ak+1。
又因为 a k = k 或 k − 1 a_k=k或k-1 ak=k或k−1、 a k + 1 = k + 1 或 k a_{k+1}=k+1或k ak+1=k+1或k,
所以 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+1−y=0,则在不升段上,这个 i 是唯一的。
但若 a i + 1 − y = 0 a_{i+1}-y=0 ai+1−y=0 ,如果 i + 1 ≤ y i+1≤y i+1≤y,则在不升段上,这个 i 不唯一,这种情况二分无法处理。但因为 a i + 1 = y a_{i+1}=y ai+1=y,所以 i = y − 1 i=y-1 i=y−1或 i = y ( 舍 ) i=y(舍) i=y(舍),即不升段上i不唯一的情况仅有 i 1 = y − 1 , i 2 = y i_1=y-1,i_2=y i1=y−1,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...ai−1的最大一部分和 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...ai−1的最小一部分和 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+2−ave,则
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×n−ave×(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+2−2×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
能猜到结论,但要证明和搞出构造方案是不可能的