T1: 直接搜索会超时,先预处理f[300][300][300]中的所有值,然后直接输出. f[i][j][k]=f[i-1][j][k]+f[i][j-1][k]+f[i][j][k]; 初始化f[1][0][0]=f[0][1][0]=f[0][0][1]=1; 注意:快读!!!快输!!!可以开long long防爆. T2: 在每次确定M输入k时计算"过程中最小值",二分判断答案即可. 注意:快读!!!快输!!! 最小值为负,与mid加和后判断结果正负. 不用开long long,开的话注意数组不能开太大. T3: 输入时预处理出基础E值(先求出连续长度,再进行赋值),O(2*n). (1~long/2递增,long/2+1~long递减,从1开始). 再对所有E值计算并求前缀和. 注意:开long long (不开貌似会Wa,算E^2可能会爆int),快读!!!快输!!! T4: 30分:计算所有子区间和后快排输出第k大的值. 正解: 设答案为ans,易知ans=[0,1e14],我们用二分答案的方法来求解. 所以设l=0,r=1e14,mid=(l+r)/2. 设两个指针从a[1]开始枚举,并用tmp记录a[i]~a[j]的最大区间和(因为a[x]>=0,所以tmp=从a[i]加到a[j]), 用cnt来记录a[i]~a[j]的区间和的个数. 如果cnt>=k,那么说明真正的ans在[l,mid]上,反之则在[mid+1,r]上. 因为循环结束条件为l==r,此时ans=l=r,所以最后输出r即可. 注意:开long long!!! O(2*n*log1e14)=1e7左右,不会超时.


