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}\rceil}*a\}+k[i]*a-m[i]\) ,这里由于\(b[i]\)是\(c[i]\%z\)的余数,所以说只有\(b[i]>b[j]\)的时候,这一部分\(\lceil{\frac{b[i]-b[j]}{z}\rceil}*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\)的点对,他们满足这样的条件:\(l\le x\)且\(x\le 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优化的高级题目,超纲了超纲了 暂且做不来。