本帖最后由 冰冻西瓜 于 2014-3-25 22:39 编辑
作为曾经的信息学竞赛选手,现在的圈外人士讲一下思路。。
第一题:做法很复杂,我自己不保证写得出来!!
首先按操作分治,写个函数solve(l,r)表示处理第l到第r个操作。那么先分治成solve(l,mid)和solve(mid+1,r),然后我们就只要考虑l~mid中的加点操作对mid+1~r的询问操作所产生的影响。这样就把问题转化成了离线的:已知若干个点和若干个多边形,问每个多边形中包含了多少点。
首先,对于点在边上的情况不太好搞,特判掉。然后我们发现多边形不太好做,就用竖直线剖成若干个纵向的梯形来做,并保证梯形的个数跟多边形点数是一个级别的。(这一步不太好搞,但是是一个经典的梯形剖分算法,代码实现较为复杂,我自己也没尝试过。)后来想了一想不用这么麻烦,我们只要知道对于每条横向或者斜向线段,是它的上方在多边形内部还是下方在多边形内部,也就相当于求出当前这条线段上方有奇数条还是偶数条线段,这个还是比较好做的。
进一步,还可以把求梯形中点的个数问题转化为给定一条线段,求横坐标在这条线段的横坐标范围内且在这条线段下方的点的个数问题。如果这条线段是平行于x轴的话直接用树状数组解决,否则如果是45度角就通过坐标变换变成平行于x轴的情况解决。
第二题:按照经典的动态规划思路,f[j]代表第1~i个物品凑出质量j的方案总数。那么缺第i个物品,凑出质量j的方案数就等于所有凑出质量j的方案数减去必须放入第i个物品凑出质量j的方案数,后者也等于不放入第i个物品凑出质量j-w的方案数。得到递推公式:count[j]=f[n][j]-count[j-w]。
(很久没做题智商真的掉了好多,第二题这种当年可以秒掉的现在还是感觉有些压力!!)
|