[关闭]
@994495jj 2017-07-13T07:58:47.000000Z 字数 2712 阅读 1107

cf139E

(ACM)浮点数精度 201707


http://codeforces.com/problemset/problem/139/E
两种处理浮点数下溢方法:
https://cn.vjudge.net/contest/170571#status/994495jj/H/0/

  1. #include<cstdio>
  2. #include<string>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<queue>
  6. #include<cmath>
  7. #include<iostream>
  8. #include<cstdlib>
  9. #include<cstring>
  10. using namespace std;
  11. typedef long long ll;
  12. #define rep(i,a,b) for(int i=(a);i<(b);++i)
  13. #define mp make_pair
  14. #define pb push_back
  15. #define fi first
  16. #define se second
  17. #define sz(a) (int)a.size()
  18. const int N=100070;
  19. const double eps=1e-4;
  20. int a[N],h[N],l[N],r[N],b[N/10],z[N/10];
  21. struct Node {
  22. int p,x,ty;
  23. Node() {}
  24. Node(int a,int b,int c) {
  25. p=a;
  26. x=b;
  27. ty=c;
  28. }
  29. bool operator < (const Node &tmp) const {
  30. if(x!=tmp.x) return x<tmp.x;
  31. return ty<tmp.ty;
  32. }
  33. }nn[N*5];
  34. double mypow(double x,int y){
  35. double an=1;
  36. while(y){
  37. if(y&1){
  38. an*=x;
  39. }
  40. x*=x;
  41. y>>=1;
  42. }
  43. return an;
  44. }
  45. int main() {
  46. int n,m;
  47. while(~scanf("%d%d",&n,&m)) {
  48. ///read
  49. int cntn=0;
  50. rep(i,0,n) {
  51. scanf("%d%d%d%d",a+i,h+i,l+i,r+i);
  52. nn[++cntn]=Node(100-l[i],a[i]-h[i],0);
  53. nn[++cntn]=Node(100-l[i],a[i]-1,2);
  54. nn[++cntn]=Node(100-r[i],a[i]+1,0);
  55. nn[++cntn]=Node(100-r[i],a[i]+h[i],2);
  56. }
  57. rep(i,0,m) {
  58. scanf("%d%d",b+i,z+i);
  59. nn[++cntn]=Node(z[i],b[i],1);
  60. }
  61. ///solve
  62. sort(nn+1,nn+1+cntn);
  63. // for(int i=1;i<=cntn;++i) printf("%d %d %d\n",nn[i].x,nn[i].ty,nn[i].p);
  64. double ans=0,pre=0;
  65. int cnt0=0;
  66. rep(i,1,cntn+1) {
  67. int p=nn[i].p;
  68. int ty=nn[i].ty;
  69. if(ty==0) {
  70. if(p==0) {
  71. ++cnt0;
  72. } else {
  73. pre+=log(p)-log(100);
  74. }
  75. } else if(ty==1) {
  76. if(!cnt0) ans+=p*exp(pre);
  77. } else {
  78. if(p==0) {
  79. --cnt0;
  80. } else {
  81. pre-=log(p)-log(100);
  82. }
  83. }
  84. }
  85. printf("%.10f\n",ans);
  86. }
  87. return 0;
  88. }
  1. #include<cstdio>
  2. #include<string>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<queue>
  6. #include<cmath>
  7. #include<iostream>
  8. #include<cstdlib>
  9. #include<cstring>
  10. using namespace std;
  11. typedef long long ll;
  12. #define rep(i,a,b) for(int i=(a);i<(b);++i)
  13. #define mp make_pair
  14. #define pb push_back
  15. #define fi first
  16. #define se second
  17. #define sz(a) (int)a.size()
  18. const int N=100070;
  19. const double eps=1e-4;
  20. int a[N],h[N],l[N],r[N],b[N/10],z[N/10],cnt[105];
  21. struct Node {
  22. int p,x,ty;
  23. Node() {}
  24. Node(int a,int b,int c) {
  25. p=a;
  26. x=b;
  27. ty=c;
  28. }
  29. bool operator < (const Node &tmp) const {
  30. if(x!=tmp.x) return x<tmp.x;
  31. return ty<tmp.ty;
  32. }
  33. }nn[N*5];
  34. double mypow(double x,int y){
  35. double an=1;
  36. while(y){
  37. if(y&1){
  38. an*=x;
  39. }
  40. x*=x;
  41. y>>=1;
  42. }
  43. return an;
  44. }
  45. int main() {
  46. int n,m;
  47. while(~scanf("%d%d",&n,&m)) {
  48. ///read
  49. int cntn=0;
  50. rep(i,0,n) {
  51. scanf("%d%d%d%d",a+i,h+i,l+i,r+i);
  52. nn[++cntn]=Node(100-l[i],a[i]-h[i],0);
  53. nn[++cntn]=Node(100-l[i],a[i]-1,2);
  54. nn[++cntn]=Node(100-r[i],a[i]+1,0);
  55. nn[++cntn]=Node(100-r[i],a[i]+h[i],2);
  56. }
  57. rep(i,0,m) {
  58. scanf("%d%d",b+i,z+i);
  59. nn[++cntn]=Node(z[i],b[i],1);
  60. }
  61. ///solve
  62. sort(nn+1,nn+1+cntn);
  63. // for(int i=1;i<=cntn;++i) printf("%d %d %d\n",nn[i].x,nn[i].ty,nn[i].p);
  64. memset(cnt,0,sizeof(cnt));
  65. double ans=0;
  66. rep(i,1,cntn+1) {
  67. int p=nn[i].p;
  68. int ty=nn[i].ty;
  69. if(ty==0) {
  70. ++cnt[p];
  71. } else if(ty==1) {
  72. double res=1;
  73. rep(j,0,101) {
  74. if(cnt[j]) {
  75. res*=pow(j*0.01,cnt[j]);
  76. }
  77. }
  78. ans+=res*p;
  79. } else {
  80. --cnt[p];
  81. }
  82. }
  83. printf("%.10f\n",ans);
  84. }
  85. return 0;
  86. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注