이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
long long int n, m, w, h, r, e;
long long int pared_top, pared_right, pared_bottom, pared_left;
typedef long double ld;
struct Tree {
long long int x, y, r;
};
struct Arista {
long long int nodo, lenght;
};
Tree trees[2002];
vector <Arista> grafo[2008];
long long int output[100002];
bool visited[2008];
/**
struct Question {
int corner, order;
long long int r;
};
Question questions[100002];
*/
queue<long long int> queue_points;
void findpaths(long long int start, long long int maxsize)
{
memset(visited, 0, sizeof visited);
queue_points.push(start);
visited[start] = true;
while (!queue_points.empty()) // y marco elementos hasta que la cola este vacia
{
long long int x = queue_points.front(); // saco el proximo de la cola
queue_points.pop();
for (long unsigned int i = 0; i<grafo[x].size(); i++)
if (!visited[ grafo[x][i].nodo ])
{
if (grafo[x][i].lenght < maxsize)
{
queue_points.push(grafo[x][i].nodo);
visited[grafo[x][i].nodo] = true;
}
else
break;
}
}
}
bool compareInterval(Arista i1, Arista i2)
{
return (i1.lenght < i2.lenght);
}
void create_graph()
{
Arista a;
for (long long int i = 1; i <= n; i++)
{
for (long long int j = i+1; j <= n; j++)
{
a.nodo = i;
a.lenght = sqrt( ld ((trees[i].x-trees[j].x)*(trees[i].x-trees[j].x) + (trees[i].y-trees[j].y)*(trees[i].y-trees[j].y)) ) - trees[i].r - trees[j].r;
grafo[j].push_back(a);
a.nodo = j;
grafo[i].push_back(a);
}
// 0,0 es abajo-izquierda
a.nodo = i;
a.lenght = trees[i].y - trees[i].r;
grafo[pared_bottom].push_back(a);
a.nodo = pared_bottom;
grafo[i].push_back(a);
a.nodo = i;
a.lenght = h - trees[i].y - trees[i].r;
grafo[pared_top].push_back(a);
a.nodo = pared_top;
grafo[i].push_back(a);
a.nodo = i;
a.lenght = trees[i].x - trees[i].r;
grafo[pared_left].push_back(a);
a.nodo = pared_left;
grafo[i].push_back(a);
a.nodo = i;
a.lenght = w - trees[i].x - trees[i].r;
grafo[pared_right].push_back(a);
a.nodo = pared_right;
grafo[i].push_back(a);
}
for (long long int i = 1; i <= n+4; i++)
sort(grafo[i].begin(),grafo[i].end(),compareInterval);
}
int main()
{
cin >> n >> m >> w >> h;
pared_top = n+1;
pared_right = n+2;
pared_bottom = n+3;
pared_left= n+4;
for (long long int i = 1; i <= n; i++)
cin >> trees[i].x >> trees[i].y >> trees[i].r;
create_graph();
/**
for (long long int i = 1; i <= n+4; i++)
{
long long int kk = grafo[i].size();
for (long long int j = 0; j < grafo[i].size(); j++)
cout << "(" << grafo[i][j].nodo << "," << grafo[i][j].lenght << ") ";
cout << "\n";
}
*/
for (long long int i = 1; i <= m; i++)
{
cin >> r >> e;
r = r * 2;
int p1 = 1;
int p2 = 2;
int p3 = 3;
int p4 = 4;
findpaths(pared_top,r);
if (e==1)
{
if (visited[pared_bottom]) { p3 = 0; p2 = 0; }
if (visited[pared_right]) p3 = 0;
if (visited[pared_left]) p4 = 0;
}
else if (e==2)
{
if (visited[pared_bottom]) { p4 = 0; p1 = 0; }
if (visited[pared_right]) p3 = 0;
if (visited[pared_left]) p4 = 0;
}
else if (e==3)
{
if (visited[pared_bottom]) { p4 = 0; p1 = 0; }
if (visited[pared_right]) { p1 = 0; p2 = 0; p4 = 0;}
if (visited[pared_left]) p4 = 0;
}
else if (e==4)
{
if (visited[pared_bottom]) { p2 = 0; p3 = 0; }
if (visited[pared_right]) p3 = 0;
if (visited[pared_left]) { p1 = 0; p2 = 0; p3 = 0; }
}
if (p1+p2+p3+p4 > 1)
{
findpaths(pared_right,r);
if (e==1)
{
if (visited[pared_bottom]) p2 = 0;
if (visited[pared_left]) { p3 = 0; p4 = 0; }
}
else if (e==2)
{
if (visited[pared_bottom]) {p1 = 0; p3 = 0; p4 = 0;}
if (visited[pared_left]) { p3 = 0; p4 = 0; }
}
else if (e==3)
{
if (visited[pared_bottom]) p2 = 0;
if (visited[pared_left]) { p1 = 0; p2 = 0; }
}
else if (e==4)
{
if (visited[pared_bottom]) p2 = 0;
if (visited[pared_left]) { p1 = 0; p2 = 0; }
}
}
if (p1+p2+p3+p4 > 1)
{
findpaths(pared_bottom,r);
if (e==1)
{
if (visited[pared_left]) { p2 = 0; p3 = 0; p4 = 0; }
}
else if (e==2)
{
if (visited[pared_left]) { p1 = 0; }
}
else if (e==3)
{
if (visited[pared_left]) { p1 = 0; }
}
else if (e==4)
{
if (visited[pared_left]) { p1 = 0; }
}
}
if (p1 != 0) output[i] = output[i] * 10 + p1;
if (p2 != 0) output[i] = output[i] * 10 + p2;
if (p3 != 0) output[i] = output[i] * 10 + p3;
if (p4 != 0) output[i] = output[i] * 10 + p4;
}
for (long long int i = 1; i <= m; i++)
cout << output[i] << "\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |