6.9模拟赛赛后总结
赛时历程
大约八点看完题目感到,啥也不会,好像T3的暴力最可做。
打着打着发现第一个性质分也好做,记录个las然后小小讨论一下就好。
对拍很成功,已经九点多。
其它啥也不会怎么搞,T1想到了一个(O(y-x))(y-x<=1e9)的伞兵DP,估计也骗不了分。
慢慢的,到点了。
赛后发现
我发现以前的三段结构很合理,所以现在换回来。
1 T1果然没分。 T3竟然不知道怎么的吧freopen给注释了,光荣抱玲。
2 T3正解可以用CDQ,都写了这么多CDQ了,还是没感觉,发现不了这是CDQ可做的,不够敏感,主要是也不知道能转换成二维平面,就更不谈什么三维偏序了。
3 T1的DP其实并不难,但是基础的(n^2)都没有想到,着实有点菜,应该多思考思考的(猛然想起这句话不是第一次提到,确实需要多思考啊,不能光说)。
简单题解
好好总结。
T1 要考虑DP,首先要考虑特殊点,也就是喜爱的城市的状态,只有他们会影响到决策(不然肯定每次跳z个会最优),因此,考虑喜爱的城市到喜爱的城市的转移,为了直接考虑到起点和终点,把他们当成数值特殊点的喜爱的城市即可。然后考虑(f[i]) 作为到达城市(i)的最小花费,那么有一个转移(f[i]=min{f[j]+frac{c[i]-c[j]}{z}*a}-m[i]) ,考虑快速的找到(j) 这个决策点,这里的思路感觉很难切入,可能只有见过了才能联想到,感觉像是某些数学题会用到的思路:把(c[i]) 拆成(c[i]=k[i]*z + b[i]) 那么,状态的转移变成了(f[i]=min{f[j]-k[j]*a+lceil{frac{b[i]-b[j]}{z} ceil}*a}+k[i]*a-m[i]) ,这里由于(b[i])是(c[i]\%z)的余数,所以说只有(b[i]>b[j])的时候,这一部分(lceil{frac{b[i]-b[j]}{z} ceil}*a) 才会产生 a的贡献,由此,对于已经处理过的(j),可以考虑以(b[j])做下标存储有关它的决策的值(f[j]-a*k[j]),放入到数据结构中,每次决策时针对(0)~(b[i]-1)的部分查找一次最小值,然后再加上贡献 (a) 来更新 (f[i]),针对(b[i])~(z-1)的区间查找一次最小值,并只用这个值来更新(f[i]),这样就能够(O(nlogn)) 的解决问题。
T3 要想到偏序之类的思路,就要把每次要询问的区间((l,r))当作一个点,每次更改一个点的时候,它会产生两种影响:1 这个点如果是状态是0而现在变成1,对于它能够到达的连续的左边的1,最左为L,以及右边的1,最右为R,(用set存0的位置然后二分查找确定边界即可找到这个L和R),跨过x的点对开始计时,对于跨过(x)的点对,他们满足这样的条件:(lle x)且(xle r),把他们当作一个点((l,r)),那么根据这样的关系,可以认为这些点在左下角为((l,x)),右上角为((x,r))的矩形中,所有的点都开始计时,也就是所有的点得到贡献(-i) (i为此时的时刻),对于这样的二维区间修改,单点查询问题,可以用标记永久化的二维线段树来解决,可是我不会 可是代码实现很难。考虑做一下差分的转化,一个左下角为((a,b))右上角为((c,d))的矩形集体(+v),相当于差分区间进行 ((a,d+1)-v),((c+1,b)-v),((a,b)+v) ((c+1,d+1)+v) , 这样,问题就转换为了单点修改,区间查询的问题,然后就是一个偏序的问题了,对于每个点统计它的二维前缀和就好。2 这个点是1而现在变成0,同样有上述的概念,不过所有点的贡献是(+i)。统计这样的二维前缀和,就是CDQ处理二维平面问题,就是一个板子了。
T2 是一道生成函数,二项式反演,NTT优化的高级题目,超纲了超纲了 暂且做不来。