#include<iostream>
#include<sstream>
#include<string>
#include<vector>
#include<list>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<algorithm>
#include<cmath>
#pragma warning(disable:4996)
using namespace std;
class Tree
{
public:
map<long long, long long>edge;
Tree() {}
};
class Rectangle
{
public:
long long xL, yL, xR, yR;
Rectangle(long long a = 0, long long b = 0, long long c = 0, long long d = 0)
{
xL = a, yL = b, xR = c, yR = d;
}
friend bool operator<(const Rectangle&a, const Rectangle&b)
{
if (a.xL != b.xL)
{
return a.xL < b.xL;
}
if (a.yL != b.yL)
{
return a.yL < b.yL;
}
if (a.yR != b.yR)
{
return a.yR < b.yR;
}
return a.xR < b.xR;
}
};
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
long long xL, yL, xR, yR;
while (cin >> xL >> yL >> xR >> yR)
{
if (xL > xR) { swap(xL, xR); }
if (yL > yR) { swap(yL, yR); }
map<Rectangle, long long>rec_serial; rec_serial.insert({ { xL,yL,xR,yR },1 });
Tree tree;
long long n, m; cin >> n >> m;
while (n--)
{
cin >> xL >> yL >> xR >> yR;
if (xL > xR) { swap(xL, xR); }
if (yL > yR) { swap(yL, yR); }
for (auto iter = rec_serial.begin(); iter != rec_serial.end(); iter++)
{
//如果线水平划分某矩形
if (xL == iter->first.xL&&xR == iter->first.xR)
{
//把划分后的上半矩形加入map
rec_serial.insert({ { iter->first.xL,yL,iter->first.xR,iter->first.yR },iter->second * 2 });
//把边加入树中
tree.edge.insert({ iter->second * 2,iter->second });
//把划分后的下半矩形加入map
rec_serial.insert({ { iter->first.xL,iter->first.yL,iter->first.xR,yR },iter->second * 2 + 1 });
//把边加入树中
tree.edge.insert({ iter->second * 2 + 1,iter->second });
//删除原矩形
rec_serial.erase(iter);
break;
}
else if (yL == iter->first.yL&&yR == iter->first.yR)
{
//把划分后的左半矩形加入map
rec_serial.insert({ { iter->first.xL,iter->first.yL,xR,iter->first.yR },iter->second * 2 });
//把边加入树中
tree.edge.insert({ iter->second * 2 ,iter->second });
//把划分后的下半矩形加入map
rec_serial.insert({ { xL,iter->first.yL,iter->first.xR,iter->first.yR },iter->second * 2 + 1 });
//把边加入树中
tree.edge.insert({ iter->second * 2 + 1,iter->second });
//删除原矩形
rec_serial.erase(iter);
break;
}
}
}
//读一个点,判断其在哪个被划分后的小矩形中
while (m--)
{
long long node1;
cin >> xL >> yL;
for (auto iter = rec_serial.begin(); iter != rec_serial.end(); iter++)
{
if (xL > iter->first.xL&&xL < iter->first.xR&&yL > iter->first.yL&&yL < iter->first.yR)
{
node1 = iter->second;
break;
}
}
long long node2;
cin >> xL >> yL;
for (auto iter = rec_serial.begin(); iter != rec_serial.end(); iter++)
{
if (xL > iter->first.xL&&xL < iter->first.xR&&yL > iter->first.yL&&yL < iter->first.yR)
{
node2 = iter->second;
break;
}
}
if (node1 == node2)
{
cout << rec_serial.size() << endl;
continue;
}
long long ans = rec_serial.size();
while (node1 / 2 != node2 / 2)
{
if (node1 / 2 < node2 / 2)
{
node2 /= 2;
}
else
{
node1 /= 2;
}
ans--;
}
cout << --ans << endl;
}
}
return 0;
}
ZOJ_3664_Split the Rectangle_WA
最新推荐文章于 2017-12-06 11:17:59 发布