CF549H Degenerate Matrix

传送门

Time cost:45min

这题还是比较简单的(然后机房就把这个题刷成了AC率100%...)

首先这个题有显然的二分性:小的成立大的一定成立 大的不成立小的一定不成立

观察样例和题意 考虑答案为x的情况 如果我们强制最大化 就是+x或者-x

ad-bc中ad和bc分别有四种情况(+,+)(+,-)(-,+)(-,-)

考虑这些情况的最小值和最大值

如果ad的最大值大于bc的最小值 而且bc的最大值大于ad的最小值

那么就有可能变成ad=bc 就有解 R=mid

否则变化范围就偏小 L=mid

然后由于CF各种玄学的错误 改成cincout 然后setprecision卡精度都不过

最后发现二分最后判断大于的时候加了个eps.....然后凉凉

以后注意只有while判断的时候加eps就好了

Code:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include <iostream>
 6 #include <iomanip>
 7 #define ms(a,b) memset(a,b,sizeof a)
 8 #define rep(i,a,n) for(int i = a;i <= n;i++)
 9 #define per(i,n,a) for(int i = n;i >= a;i--)
10 #define inf 2147483647
11 using namespace std;
12 typedef long long ll;
13 ll read() {
14     ll as = 0,fu = 1;
15     char c = getchar();
16     while(c < '0' || c > '9') {
17         if(c == '-') fu = -1;
18         c = getchar();
19     }
20     while(c >= '0' && c <= '9') {
21         as = as * 10 + c - '0';
22         c = getchar();
23     }
24     return as * fu;
25 }
26 typedef long double D;
27 #define eps (1e-10)
28 #define max(a,b) (((a)>(b))?(a):(b))
29 #define min(a,b) (((a)<(b))?(a):(b))
30 //head
31 D a,b,c,d;
32 D L = 0,R = 1.1e9;
33 D maxx[2],minn[2];
34 bool check(D x) {
35     maxx[0] = max( max((a-x)*(d-x) , (a+x)*(d-x)) , max((a+x)*(d+x) , (a-x)*(d+x)));
36     minn[0] = min( min((a-x)*(d-x) , (a+x)*(d-x)) , min((a+x)*(d+x) , (a-x)*(d+x)));
37     maxx[1] = max( max((b-x)*(c-x) , (b-x)*(c+x)) , max((b+x)*(c+x) , (b+x)*(c-x)));
38     minn[1] = min( min((b-x)*(c-x) , (b-x)*(c+x)) , min((b+x)*(c+x) , (b+x)*(c-x)));
39     if(maxx[0] >= minn[1] && maxx[1] >= minn[0]) return 1;
40     return 0;
41 }
42 
43 int main() {
44     cin >> a >> b >> c >> d;
45     while(R - L > eps) {
46     D m = (L+R) / 2.0;
47     check(m) ? R = m : L = m;
48     }
49     cout << setprecision(10) << fixed << L << endl;
50     return 0;
51 }
View Code
> 别忘了 总有人在等着你
原文地址:https://www.cnblogs.com/yuyanjiaB/p/9811027.html