【题目大意】:
详见:http://www.vijos.cn/Problem_show.asp?id=1663
1664与之不同的地方在于最后求的是所有的b[i,j]异或得到的值。
【题目分析】:
这个题我不得不说我残的很严重~
首先感谢Matt神牛的指导………………
下面说一说这道WS的题的解法。
首先我们要明确这样一个问题,一种资源在什么位置上才能算是稀有资源呢~
我们发现,一个资源被判定为稀有资源的范围与他第一次出现的范围有很大的关系。
用样例说话
1 2 3
3 1 2
对于3这个资源,他最先出现的位置(最先扫描到的位置是[1,3]),走到这里的时候我们认为3作为稀有资源的范围就是他的右下方的所有区域。但是随着接下来的读入,我们会有这样的问题。我们主要看的是列之间的关系。
我们记录最左面点的坐标为(x[k],y1[k])(P.s. k为当前这个点的颜色~),第二靠左的点的纵坐标为y2[k]。
对于一个新进入的点(i,j)来说:
(1)如果说j<y1[k],那么我们应该将y1,y2和x的值都更新,更新的时候实际上我们要将他的影响范围确定下来。
那么我们将这一段面积给予补偿,相当于在(x[k],y1[k])到(i-1,y2[k]-1)这个位置上的点都加一来表示当前的资源k在这些位置上可以被算为稀有资源。(想一想为什么~)
(2)如果说y1[k]<=j<y2[k],那么只需更新y2[k],所以要把(x[k],j)到(i-1,y2[k]-1)的这一个矩形上面加1来标记~仔细想想这个补偿的原理跟上一种情况是一样的。因为他们补偿的所有的面积仅仅是中间凹陷下去的应该算作影响范围的面积。
(3)对于j>=y2[k]的情况,可以直接无视~因为他不会造成任何影响。
在这样统计完成了之后,实际上刚好差下了最左边和次左边所夹的影响范围~加上去就好。
对于1663,可以直接累加。但是对于1664情况就要复杂很多。因为要对得到得数进行异或。
有的神牛写的是一种叫做括号法的方法。因为笔者在写这道题的时候天色已晚。没心思研究那种方法,所以决定使用二维树状数组进行处理。方法详见之前的PKU_2155的题解。统计的方法基本一致。
vijos 1663
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 134ms
├ 测试数据 06:答案正确... 274ms
├ 测试数据 07:答案正确... 274ms
├ 测试数据 08:答案正确... 540ms
├ 测试数据 09:答案正确... 586ms
├ 测试数据 10:答案正确... 586ms
-------------------------
Accepted 有效得分:100 有效耗时:2394ms
vijos1664
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 119ms
├ 测试数据 06:答案正确... 400ms
├ 测试数据 07:答案正确... 181ms
├ 测试数据 08:答案正确... 541ms
├ 测试数据 09:答案正确... 634ms
├ 测试数据 10:答案正确... 369ms
-------------------------
Accepted 有效得分:100 有效耗时:2244ms
都挺慢的,本人语无伦次,如果看不明白详见Matt神牛或者是18181818神牛的题解。
Matt:http://user.qzone.qq.com/740436286?ptlang=2052
18181818:http://user.qzone.qq.com/281589210/blog/1255232846
【代码】:
vijos_1663
vijos_1664