昌邑一中第七届欢乐赛题解

版权声明:转载请注明 https://blog.csdn.net/qq_33831360/article/details/88662675

T1序列(sequence.exe)

#一本正经的胡说八道

    m1<=s2<=m2,于是暴力枚举s2,没有意外应该会T。易发现s[k]和s[k+1]在数轴上关于m[k]对称,我们可以维护s的可行区间[l,r],以m[i]为中心不断对称翻转,超出m[i+1]的部分肯定不合法,不断模拟,答案是最终的r-l+1;
例如:

注意以下情况是无解的


#官方正版做法

  设x = s1,将所有的m自乘2;
x+s1 = m1; s2+s3 = m2; s3+s4 = m3…
s2 = m1-x; s3 = m2-m1+x; s4=m3-m2+m1-x…
所有的s都能用x来表示,又有s2>=s1,s2+s1 = m1 -> 2s2>=m1;
同理2
s3>=m2,2s4>=m3,2s5>=m4…
将x带入,取并集即为x的可行解集。



T2 Oier 军训(tahort)

#一本正经的胡说八道

  1 首先考虑暴力枚举左端点,向右扩展,遇到<=左端点的就break,复杂度 O ( n 2 ) O(n^2) ,然而数据水,可以的90分,我不会告诉你枚举右端点会AC;
  2 转化为RMQ。考虑最小的点,以它为左端点的区间右端点一定是它右边最大的数(如果有多个选最近的),如果是第K大的怎么办?从它到后面第一个比它小的数中找最大数即可,我们可以按从小到大的顺序枚举左端点,查询完后打一个标记,查询时找最近的标记,这也是RMQ,查询区间最大值的位置。复杂度 O ( n l o g ( n ) ) O(nlog(n))
  3 Orz xy的 O ( n ) O(n) 单调栈

#题解 by白乐水

  法一:单调栈预处理然后枚举,针对n很大但单调长度很短的数据增加优化(可行的最大长度(即枚举时只枚举到该点之后的最大数,如果还有坑数据,再预处理该段长度,然后枚举时判断是否需要枚举(如果最长长度都小于ans还枚举干嘛))) (ps:似乎只有90分)
  法二 :先用st或线段树求出区间最大和最小,然后深搜或者广搜都行,推荐深搜,好写.每次搜加两个关键字,分别为区间的左端点l和右端点r,然后用区间最大最小求出他们之间的最大值和最小值的下标ml,mr.如果mr>ml说明区间合法,维护ans,如果ml>=mr说明区间不合法,需要交换.最后就是将区间裂成(l,ml)(ml+1,mr-1)(mr,r),继续搜.
  法三:我知道一定有正解,本人太弱想不出。。。

#官方正版做法

   分治大法好



T3 Yy 的工作(scope.pas/c/cpp)

#一本正经的胡说八道

  暴力枚举m个点,期望得分60,计算面积时有很多技巧,不再多说。
  考虑dp,任意多边形都可以分成多个有一个公共顶点的三角形,枚举这个顶点,用g[i][j]表示选了i个点,最后一个是j的多边形最大面积,g[i][j] = max(g[i-1][k]+S(顶点,k,j));时间复杂度 O ( n 5 ) O(n^5) ,枚举顶点,枚举在前几个选,枚举i,j,k;
关于三角形面积 S = (sin(2* π π (p[b]-p[a]))+sin((2* π π p[c]-p[b]))-sin(2* π π (p[c]-p[a])))$ * $0.5;
大概有三种情况,可以证明都符合

#官方正版做法

  我忘了,似乎是 n 4 n^4 的。
  Orz吴学姐
  f[i][j][k]表示从i到j选k个点,必须选i,j的多边形最大面积。
   枚举k,i,j,l.
  f[i][j][k]=max(f[i][j][k],f[i][l][k-1]+s(i,j,l));

猜你喜欢

转载自blog.csdn.net/qq_33831360/article/details/88662675