您的位置:首页 > 运维架构

2002-2003 ACM-ICPC Northeastern European Regional Contest (NEERC 02)

2015-09-04 23:34 555 查看

B Bricks 计算几何乱搞

题意:

给你个立方体,问你能不能放进一个管道里面。

题解:

这是一道非常迷的题,其问题在于,你可以不正着放下去,你需要斜着放。此时你需要枚举你旋转的角度,来判断是否可行。至于枚举的范围和步长,看脸乱搞。

代码:

//#include<iostream>
#include<fstream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<string>
#include<cmath>
#define MAX_N 10004
using namespace std;

int N,M,K;

int d[4];

struct knife {
public:
int from, to, dir;

knife(int f, int t, int d) : from(f), to(t), dir(d) { }

knife() { }
};

knife kn[MAX_N];

int cnt[MAX_N];

vector<int> G[MAX_N];

int main() {
ifstream cin("inlay.in");
ofstream cout("inlay.out");
cin.sync_with_stdio(false);
cin >> M >> N >> K;
d[0] = 2 * M + 1;
d[1] = 1;
d[2] = M + 1;
d[3] = M;
for (int i = 0; i < K; i++) {
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
if (y1 > y2 || (y1 == y2 && x1 > x2)) {
swap(x1, x2);
swap(y1, y2);
}
int u = x1 * d[1] + y1 * d[0];
int v = x2 * d[1] + y2 * d[0];
int t;
if (x1 == x2)t = 0;
else if (y1 == y2)t = 1;
else if (x2 > x1)t = 2;
else t = 3;
kn[i] = knife(u, v, t);
}
kn[K++] = knife(0, M, 1);
kn[K++] = knife(N * d[0], N * d[0] + M * d[1], 1);
kn[K++] = knife(0, N * d[0], 0);
kn[K++] = knife(M, N * d[0] + M, 0);
for (int i = 0; i < K; i++) {
int u = kn[i].from, v = kn[i].to, t = kn[i].dir;
while (u != v) {
cnt[u]++;
u += d[t];
}
cnt[v]++;
}
int V = -1;
for (int i = 0; i < K; i++) {
int u = kn[i].from, v = kn[i].to, t = kn[i].dir;
int p = u;
while (u != v) {
u += d[t];
if (cnt[u] > 1) {
V = max(V, u);
V = max(V, p);
G[p].push_back(u);
G[u].push_back(p);
p = u;
}
}
}
int ans = 0;
V++;
for (int u = 0; u < V; u++)
sort(G[u].begin(), G[u].end());
for (int u = 0; u < V; u++)
for (auto v:G[u])
for (auto c:G[v]) {
if (c == u)continue;
int t = lower_bound(G[c].begin(), G[c].end(), u) - G[c].begin();
if (G[c][t] == u)ans++;
//cout<<c<<" "<<u<<" "<<v<<endl;
}
cout << ans/6 << endl;
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: