| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
被WA逼疯了o(>﹏<)o不会真的测试数据有问题吧……
附代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <set>
#include <cmath>
using namespace std;
const int maxN = 4e4 + 5;
struct Circle
{
double x, y, r;
Circle(double _x = 0, double _y = 0, double _r = 0): x(_x), y(_y), r(_r) {}
void assign(double _x, double _y, double _r)
{
this->x = _x;
this->y = _y;
this->r = _r;
}
bool operator < (const Circle& rhs) const
{
return y < rhs.y || (y == rhs.y && x < rhs.x);
}
};
struct Event
{
static const int circleIn = 0;
static const int circleOut = 1;
int circleId;
int event;
double pos;
Event(int id, int e, double p): circleId(id), event(e), pos(p) {}
bool operator < (const Event& rhs) const
{
return (pos < rhs.pos) || (pos == rhs.pos && circleId < rhs.circleId);
}
};
bool cmpX(const Circle& lhs, const Circle& rhs)
{
return lhs.x < rhs.x || (lhs.x == rhs.x && lhs.y < rhs.y);
}
inline bool isCovered(const Circle& inner, const Circle& outer)
{
double dx = inner.x - outer.x;
double dy = inner.y - outer.y;
double dr = inner.r - outer.r;
return dx * dx + dy * dy <= dr * dr;
}
int N;
Circle circle[maxN];
void input()
{
double x, y, r;
scanf("%d", &N);
for (int i = 0; i < N; i++)
{
scanf("%lf%lf%lf", &r, &x, &y);
//circle[i].assign(x, y, r);
circle[i].assign(y, x, r);
}
}
void initEvent(vector<Event>& vec)
{
for (int i = 0; i < N; i++)
{
vec.push_back(Event(i, Event::circleIn, circle[i].x - circle[i].r));
vec.push_back(Event(i, Event::circleOut, circle[i].x + circle[i].r));
}
sort(vec.begin(), vec.end());
}
void solve()
{
vector<Event> eventVec;
set<Circle> scanSet;
set<int> ansSet;
initEvent(eventVec);
for (vector<Event>::iterator it = eventVec.begin(); it != eventVec.end(); ++it)
{
if (it->event == Event::circleOut)
{
set<Circle>::iterator pos = scanSet.find(circle[it->circleId]);
if (pos != scanSet.end())
{
ansSet.insert(it->circleId);
scanSet.erase(pos);
}
}
else
{
set<Circle>::iterator pos = scanSet.lower_bound(Circle(0, circle[it->circleId].y, 0));
if (pos != scanSet.end() && isCovered(circle[it->circleId], *pos))
continue;
if (pos != scanSet.begin() && isCovered(circle[it->circleId], *(--pos)))
continue;
scanSet.insert(circle[it->circleId]);
}
}
printf("%d\n", (int)ansSet.size());
for (set<int>::iterator it = ansSet.begin(); it != ansSet.end(); ++it)
printf("%d ", 1 + *it);
}
int main()
{
input();
solve();
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator