祭奠 HDU 1255

事先声明:这题没过。。。 那为什么还要发出来呢?? 答曰:为了纪念我死去的HDU1255。

TLE了。我用的矩形切割来做这题, 看来我今天割出瘾了。—_—

这样做的话,矩阵其实会越割越多,超时也在所难免了~~~

这题让我发现了原先提交的POJ1151的代码是错的,在此再次感慨下,那数据真叫那个弱啊。。

 

正解好像是线段树,不过不会是二维的吧。。。 以后慢慢做了。

 

#include <cstdio> #include <list> #include <algorithm> using namespace std; struct Rectangle { double x1, y1, x2, y2; bool operator < (const Rectangle& b) { if(x1 != b.x1) { return x1 < b.x1; } else { return y1 < b.y1; } } Rectangle() {} Rectangle(double a, double b, double c, double d) { x1 =a ; y1 = b; x2 = c; y2 = d; } }; list<Rectangle> lst; bool is_intersect(Rectangle a, Rectangle b) { if(b < a) { swap(a, b); } if(b.x1>=a.x1 && b.x1 < a.x2) { if(b.y1 < a.y2) { if(b.y1 >= a.y1) { return true; } else { if(b.y2 > a.y1) { return true; } } } } return false; } void getIntersection(double l1, double r1, double l2, double r2, double& x, double& y) { //这里保证了有交集 x = max(l1, l2); y = min(r2, r1); } void add(double x1, double y1, double x2, double y2) { lst.push_back(Rectangle(x1, y1, x2, y2)); } double cutAndPush(Rectangle a, Rectangle b) { double x, y, x1, y1; getIntersection(a.x1, a.x2, b.x1, b.x2, x, y); // x is on top-left relative to y if(a.x1 < x) { add(a.x1, a.y1, x, a.y2); } if(a.x2 > y) { add(y, a.y1, a.x2, a.y2); } getIntersection(a.y1, a.y2, b.y1, b.y2, x1, y1); if(a.y1 < x1) { add(x, a.y1, y, x1); } if(a.y2 > y1) { add(x, y1, y, a.y2); } return (y-x)*(y1-x1); } int main() { Rectangle r; int n, flag, cas; scanf("%d", &cas); while(cas--){ flag = 1; scanf("%d", &n); for(int i = 0; i < n; i++) { scanf("%lf%lf%lf%lf", &r.x1, &r.y1, &r.x2, &r.y2); lst.push_back(r); } double sum = 0.0; while(!lst.empty()) { list<Rectangle>::iterator i = lst.begin(); list<Rectangle>::iterator b = ++i; i--; list<Rectangle>::iterator tend = lst.end(); for(list<Rectangle>::iterator j = b; j != tend; j++) { if(is_intersect(*i, *j)) { sum+=cutAndPush(*j, *i); cutAndPush(*i, *j); lst.erase(j); break; } } lst.pop_front(); } printf("%.2lf/n", sum); lst.clear(); } return 0 ; } 

你可能感兴趣的:(c,iterator)