AtCoder ABC 130F Minimum Bounding Box

题目链接:https://atcoder.jp/contests/abc130/tasks/abc130_f

题目大意

  给定地图上 N 个点的坐标和移动方向,它们会以每秒 1 个单位的速度移动,设 Ans(t) 为在 t 时刻,$(x_{max} - x_{min}) * (y_{max} - y_{min})$的值,求 Ans(t) 的最小值。(最小值可能不是一个整数)

分析

  稍加思考可以发现,不是所有点的所有坐标都对答案有影响,很多点完全可以忽略不计,下面以 Y 坐标为例,讨论影响$(y_{max} - y_{min})$的值。

  首先我们把 N 个点分为 3 类,向下移动的,向上移动的和水平方向移动的,具体如下图所示:

  其中,UU 代表往下移动的点中 Y 坐标最大值,UD 代表往下移动的点中 Y 坐标最小值,其余同理。

  我们发现,影响$(y_{max} - y_{min})$就是这 6 个值,当它们某两个值重合时就有可能改变答案。

  X 坐标方向上也是同理,只要旋转一下即可。

  当我们把 X 和 Y 坐标上对应的 6 个值都算出来的时候,把它们两两组合,暴力枚举所有可能时刻,就能求出最终答案。

代码如下

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3
  4 #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  5 #define Rep(i,n) for (int i = 0; i < (n); ++i)
  6 #define For(i,s,t) for (int i = (s); i <= (t); ++i)
  7 #define rFor(i,t,s) for (int i = (t); i >= (s); --i)
  8 #define ForLL(i, s, t) for (LL i = LL(s); i <= LL(t); ++i)
  9 #define rForLL(i, t, s) for (LL i = LL(t); i >= LL(s); --i)
 10 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
 11 #define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i)
 12
 13 #define pr(x) cout << #x << " = " << x << "  "
 14 #define prln(x) cout << #x << " = " << x << endl
 15
 16 #define LOWBIT(x) ((x)&(-x))
 17
 18 #define ALL(x) x.begin(),x.end()
 19 #define INS(x) inserter(x,x.begin())
 20 #define UNIQUE(x) x.erase(unique(x.begin(), x.end()), x.end())
 21 #define REMOVE(x, c) x.erase(remove(x.begin(), x.end(), c), x.end()); // 删去 x 中所有 c
 22 #define TOLOWER(x) transform(x.begin(), x.end(), x.begin(),::tolower);
 23 #define TOUPPER(x) transform(x.begin(), x.end(), x.begin(),::toupper);
 24
 25 #define ms0(a) memset(a,0,sizeof(a))
 26 #define msI(a) memset(a,inf,sizeof(a))
 27 #define msM(a) memset(a,-1,sizeof(a))
 28
 29 #define MP make_pair
 30 #define PB push_back
 31 #define ft first
 32 #define sd second
 33
 34 template<typename T1, typename T2>
 35 istream &operator>>(istream &in, pair<T1, T2> &p) {
 36     in >> p.first >> p.second;
 37     return in;
 38 }
 39
 40 template<typename T>
 41 istream &operator>>(istream &in, vector<T> &v) {
 42     for (auto &x: v)
 43         in >> x;
 44     return in;
 45 }
 46
 47 template<typename T1, typename T2>
 48 ostream &operator<<(ostream &out, const std::pair<T1, T2> &p) {
 49     out << "[" << p.first << ", " << p.second << "]" << "\n";
 50     return out;
 51 }
 52
 53 inline int gc(){
 54     static const int BUF = 1e7;
 55     static char buf[BUF], *bg = buf + BUF, *ed = bg;
 56
 57     if(bg == ed) fread(bg = buf, 1, BUF, stdin);
 58     return *bg++;
 59 }
 60
 61 inline int ri(){
 62     int x = 0, f = 1, c = gc();
 63     for(; c<48||c>57; f = c==‘-‘?-1:f, c=gc());
 64     for(; c>47&&c<58; x = x*10 + c - 48, c=gc());
 65     return x*f;
 66 }
 67
 68 template<class T>
 69 inline string toString(T x) {
 70     ostringstream sout;
 71     sout << x;
 72     return sout.str();
 73 }
 74
 75 inline int toInt(string s) {
 76     int v;
 77     istringstream sin(s);
 78     sin >> v;
 79     return v;
 80 }
 81
 82 //min <= aim <= max
 83 template<typename T>
 84 inline bool BETWEEN(const T aim, const T min, const T max) {
 85     return min <= aim && aim <= max;
 86 }
 87
 88 typedef long long LL;
 89 typedef unsigned long long uLL;
 90 typedef pair< double, double > PDD;
 91 typedef pair< int, int > PII;
 92 typedef pair< int, PII > PIPII;
 93 typedef pair< string, int > PSI;
 94 typedef pair< int, PSI > PIPSI;
 95 typedef set< int > SI;
 96 typedef set< PII > SPII;
 97 typedef vector< int > VI;
 98 typedef vector< double > VD;
 99 typedef vector< VI > VVI;
100 typedef vector< SI > VSI;
101 typedef vector< PII > VPII;
102 typedef map< int, int > MII;
103 typedef map< int, string > MIS;
104 typedef map< int, PII > MIPII;
105 typedef map< PII, int > MPIII;
106 typedef map< string, int > MSI;
107 typedef map< string, string > MSS;
108 typedef map< PII, string > MPIIS;
109 typedef map< PII, PII > MPIIPII;
110 typedef multimap< int, int > MMII;
111 typedef multimap< string, int > MMSI;
112 //typedef unordered_map< int, int > uMII;
113 typedef pair< LL, LL > PLL;
114 typedef vector< LL > VL;
115 typedef vector< VL > VVL;
116 typedef priority_queue< int > PQIMax;
117 typedef priority_queue< int, VI, greater< int > > PQIMin;
118 const double EPS = 1e-8;
119 const LL inf = 0x7fffffff;
120 const LL infLL = 0x7fffffffffffffffLL;
121 const LL mod = 1e9 + 7;
122 const int maxN = 1e5 + 7;
123 const LL ONE = 1;
124 const LL evenBits = 0xaaaaaaaaaaaaaaaa;
125 const LL oddBits = 0x5555555555555555;
126
127 #define UU A[0]
128 #define UD A[1]
129 #define MU A[2]
130 #define MD A[3]
131 #define DU A[4]
132 #define DD A[5]
133
134 struct State{
135     double A[6] = {-inf, inf, -inf, inf, -inf, inf};
136     double _max = -inf, _min = inf;
137
138     State operator+ (const double &x) const {
139         State ret = *this;
140         if(fabs(ret.UU) < 1e9) ret.UU -= x;
141         if(fabs(ret.UD) < 1e9) ret.UD -= x;
142         if(fabs(ret.DU) < 1e9) ret.DU += x;
143         if(fabs(ret.DD) < 1e9) ret.DD += x;
144
145         Rep(i, 6) {
146             if(fabs(ret.A[i]) < 1e9) {
147                 ret._max = max(ret._max, ret.A[i]);
148                 ret._min = min(ret._min, ret.A[i]);
149             }
150         }
151         return ret;
152     }
153 };
154
155 int N;
156 State X, Y;
157 double ans = infLL;
158 set< double > T; // 记录关键时间节点
159
160 int main(){
161     //freopen("MyOutput.txt","w",stdout);
162     //freopen("input.txt","r",stdin);
163     //INIT();
164     cin >> N;
165     Rep(i, N) {
166         double x, y;
167         string d;
168         cin >> x >> y >> d;
169
170         if(d[0] == ‘U‘) {
171             Y.DU = max(Y.DU, y);
172             Y.DD = min(Y.DD, y);
173
174             X.MU = max(X.MU, x);
175             X.MD = min(X.MD, x);
176         }
177         if(d[0] == ‘D‘) {
178             Y.UU = max(Y.UU, y);
179             Y.UD = min(Y.UD, y);
180
181             X.MU = max(X.MU, x);
182             X.MD = min(X.MD, x);
183         }
184         if(d[0] == ‘R‘) {
185             X.DU = max(X.DU, x);
186             X.DD = min(X.DD, x);
187
188             Y.MU = max(Y.MU, y);
189             Y.MD = min(Y.MD, y);
190         }
191         if(d[0] == ‘L‘) {
192             X.UU = max(X.UU, x);
193             X.UD = min(X.UD, x);
194
195             Y.MU = max(Y.MU, y);
196             Y.MD = min(Y.MD, y);
197         }
198     }
199
200     Rep(i, 6) {
201         Rep(j, 6) {
202             T.insert(fabs(X.A[i] - X.A[j]));
203             T.insert(fabs(X.A[i] - X.A[j]) / 2);
204             T.insert(fabs(Y.A[i] - Y.A[j]));
205             T.insert(fabs(Y.A[i] - Y.A[j]) / 2);
206             T.insert(fabs(X.A[i] - Y.A[j]));
207             T.insert(fabs(X.A[i] - Y.A[j]) / 2);
208         }
209     }
210
211     foreach(i, T) {
212         if(*i > 1e9) break;
213         State tmpX = X + *i;
214         State tmpY = Y + *i;
215
216         ans = min(ans, (tmpX._max - tmpX._min) * (tmpY._max - tmpY._min));
217     }
218
219     printf("%.10f\n", ans);
220     return 0;
221 }

原文地址:https://www.cnblogs.com/zaq19970105/p/11106168.html

时间: 2024-10-08 11:07:12

AtCoder ABC 130F Minimum Bounding Box的相关文章

Fast algorithm to compute minimum volume oriented bounding box

Computing minimum volume bounding box is a hard problem in computer science. Exact algorithm costs O(n3) time complexity.However, for lots of applications an approximation of the minimum volume oriented bounding box is acceptable and already accurate

Torch 两个矩形框重叠面积的计算 (IoU between tow bounding box)

Torch 两个矩形框重叠面积的计算 (IoU between tow bounding box) 1 function DecideOberlap(BBox_x1, BBox_y1, BBox_x2, BBox_y2, BBox_gt_x1, BBox_gt_y1, BBox_gt_x2, BBox_gt_y2) 2 3 x1 = BBox_x1; 4 y1 = BBox_y1; 5 width1 = BBox_x2 - BBox_x1; 6 height1 = BBox_y2 - BBox_

基于Cocos2d-x的2D空间中的OBB(Orient Bounding Box)碰撞检测算法

基于Cocos2d-x的2D空间中的OBB(Orient Bounding Box)碰撞检测算法 尊重原创:http://cn.cocos2d-x.org/tutorial/show?id=1577

目标检测中bounding box regression

https://zhuanlan.zhihu.com/p/26938549 RCNN实际包含两个子步骤,一是对上一步的输出向量进行分类(需要根据特征训练分类器):二是通过边界回归(bounding-box regression) 得到精确的目标区域,由于实际目标会产生多个子区域,旨在对完成分类的前景目标进行精确的定位与合并,避免多个检出. fast rcnn中SoftmaxLoss代替了SVM,证明了softmax比SVM更好的效果,SmoothL1Loss取代Bouding box回归.将分类

3D空间中的AABB(轴向平行包围盒, Aixe align bounding box)的求法

引言 在前面的一篇文章中讲述了如何通过模型的顶点来求的模型的包围球,并且还讲述了基本包围体除了包围球之外,还有AABB包围盒.在这一章,将讲述如何根据模型的坐标求得它的AABB盒. 表示方法 AABB盒的表示方法有很多,总结起来有如下的三种情况: Max-min表示法:使用一个右上角和左下角的点来唯一的定义一个包围体 Center-radious表示法:我们用center点来表示中点,radious是一个数组,保存了包围盒在x方向,y方向,z方向上的半径. Min-Width表示方法:我们用mi

第二十六节,滑动窗口和 Bounding Box 预测

上节,我们学习了如何通过卷积网络实现滑动窗口对象检测算法,但效率很低.这节我们讲讲如何在卷积层上应用这个算法. 为了构建滑动窗口的卷积应用,首先要知道如何把神经网络的全连接层转化成卷积层.我们先讲解这部分内容,并演示卷积的应用过程. 一 卷积的滑动窗口实现 假设对象检测算法输入一个 14×14×3 的图像,图像很小,不过演示起来方便.在这里过滤器大小为 5×5,数量是 16, 14×14×3 的图像在过滤器处理之后映射为 10×10×16.然后通过参数为 2×2 的最大池化操作,图像减小到 5×

AtCoder ABC 129F Takahashi&#39;s Basics in Education and Learning

题目链接:https://atcoder.jp/contests/abc129/tasks/abc129_f 题目大意 给定一个长度为 L ,首项为 A,公差为 B 的等差数列 S,将这 L 个数拼起来,记作 N,求 N % M. 分析 设 bit(i) 为第 i 项所需要进行的十进制位移. 则 $N = S_0 * 10^{bit(0)} + S_1 * 10^{bit(1)} + \dots + S_{L - 1} * 10^{bit(L - 1)}$. 一项一项地算是肯定要超时的,不过注意

Atcoder ABC 141

Atcoder ABC 141 A - Weather Prediction SB题啊,不讲. #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; char ch[50]; int main() { scanf("%s",ch+1); if(ch[1] == 'S') puts("Cloudy

2. 滑动窗口和 Bounding Box 预测

滑动窗口和 Bounding Box 预测(转) 原文链接:https://www.cnblogs.com/zyly/p/9180485.html 目录 一 卷积的滑动窗口实现 二  Bounding Box 预测 上节,我们学习了如何通过卷积网络实现滑动窗口对象检测算法,但效率很低.这节我们讲讲如何在卷积层上应用这个算法. 为了构建滑动窗口的卷积应用,首先要知道如何把神经网络的全连接层转化成卷积层.我们先讲解这部分内容,并演示卷积的应用过程. 回到顶部 一 卷积的滑动窗口实现 假设对象检测算法