听说这道题用矩形切割做,于是学习了2004薛矛的oi论文。
我的做法是:弄一个白纸集合,开始里面只有一张白纸(0,0) (A,B)。然后把输入的N个矩形倒序地,每一个都与白纸集合中的所有白纸依次切割。对于输入的矩形rec[i]与每张白纸,用rec[i]去覆盖它。如果有交集,则交集为rec[i]的颜色,把元素个数统计到rec[i]的颜色中,然后把白纸中没被覆盖的地方切成矩形加入到白纸集合,并且把原来被切的白纸从集合中删除。没有交集就什么都不用做。N个矩形都处理过后,白纸集合中矩形就都是颜色为1的矩形,把它们的元素个数统计到颜色1中去即可。
其中矩形切割的函数是按着上面的伪代码写的。
USER: li xiu [lingxiu1] TASK: rect1 LANG: C++
Compiling... Compile: OK Executing...
Test 1: TEST OK [0.000 secs, 3052 KB]
Test 2: TEST OK [0.000 secs, 3052 KB]
Test 3: TEST OK [0.000 secs, 3052 KB]
Test 4: TEST OK [0.000 secs, 3052 KB]
Test 5: TEST OK [0.000 secs, 3052 KB]
Test 6: TEST OK [0.000 secs, 3052 KB]
Test 7: TEST OK [0.000 secs, 3052 KB]
Test 8: TEST OK [0.000 secs, 3052 KB]
Test 9: TEST OK [0.000 secs, 3052 KB]
Test 10: TEST OK [0.000 secs, 3052 KB]
Test 11: TEST OK [0.011 secs, 3052 KB]
All tests OK.
Your program ('rect1') produced all correct answers! This is yoursubmission #12 for this problem. Congratulations!
速度还不错啊~