题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4816

2013长春区域赛的D题。

很简单的几何题,就是给了一条折线。 然后一个矩形窗去截取一部分,求最大面积。

现场跪在这题,最后时刻TLE到死,用的每一小段去三分,时间复杂度是O(n log n) , 感觉数据也不至于超时。

卧槽!!!!代码拷回来,今天在HDU一交,一模一样的代码AC了,加输入外挂6s多,不加也8s多,都可AC,呵呵·····(估计HDU时限放宽了!!!)

现场赛卡三分太SXBK了,我艹!!!! 好好的一个现场赛绝杀错过了。

以下是现场赛源码,在HDU顺利AC! 现场TLE到死!

其实O(n)也可以搞,因为是三分的是一个二次函数,求对称轴就可以了。现场没有想到这个优化,等下简单修改成O(n)代码。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <queue>
  6. #include <map>
  7. #include <set>
  8. #include <vector>
  9. #include <string>
  10. #include <math.h>
  11. using namespace std;
  12. const int MAXN = ;
  13. int x[MAXN],y[MAXN];
  14. int d;
  15. int n;
  16. int L;
  17. int nowx ;
  18. int nextx;
  19. int r1,l2;
  20. const double eps = 1e-;
  21. double solve()
  22. {
  23. double left = nowx,right = nextx;
  24. double ret1,ret2;
  25. for(int cc = ;cc <= ;cc++)
  26. {
  27. double mid = (left + right)/;
  28. double midmid = (mid + right)/;
  29. double h1 = y[r1] + (double)(y[r1-] - y[r1]) * (mid - x[r1])/(x[r1-] - x[r1]);
  30. double h2 = y[l2] + (double)(y[l2+] - y[l2])*(mid + *d - x[l2])/(x[l2 + ] - x[l2]);
  31. ret1 = (double)(x[r1] - mid)*(h1 + y[r1])/ + (double)(mid + *d - x[l2])*(h2 + y[l2])/;
  32.  
  33. h1 = y[r1] + (double)(y[r1-] - y[r1]) * (midmid - x[r1])/(x[r1-] - x[r1]);
  34. h2 = y[l2] + (double)(y[l2+] - y[l2])*(midmid + *d - x[l2])/(x[l2 + ] - x[l2]);
  35. ret2 = (double)(x[r1] - midmid)*(h1 + y[r1])/ + (double)(midmid + *d - x[l2])*(h2 + y[l2])/;
  36. if(ret1 < ret2)
  37. left = mid+eps;
  38. else right = midmid-eps;
  39. }
  40. return ret1;
  41. }
  42.  
  43. int input()
  44. {
  45. char ch;
  46. ch = getchar();
  47. while(ch < '' || ch >'')
  48. {
  49. ch = getchar();
  50. }
  51. int ret = ;
  52. while(ch >= '' && ch <= '')
  53. {
  54. ret *= ;
  55. ret += ch -'';
  56. ch = getchar();
  57. }
  58. return ret;
  59. }
  60.  
  61. int main()
  62. {
  63. //freopen("D.txt","r",stdin);
  64. //freopen("out.txt","w",stdout);
  65. int T;
  66. scanf("%d",&T);
  67. while(T--)
  68. {
  69. scanf("%d%d",&n,&L);
  70. for(int i = ;i <= n;i++)
  71. {
  72. //x[i] = input();
  73. //y[i] = input();
  74. scanf("%d%d",&x[i],&y[i]);
  75. }
  76. //scanf("%d%d",&x[i],&y[i]);
  77. scanf("%d",&d);
  78. double ans = ;
  79. r1 = ;
  80. l2 = ;
  81. double tmp = ;
  82. while(l2 < n && x[l2+] < *d)l2++;
  83. for(int i = r1;i < l2;i++)
  84. {
  85. tmp += (double)(x[i+] - x[i])*(y[i] + y[i+])/;
  86. }
  87. if(l2 == )
  88. {
  89. tmp -= (double)(x[] - x[])*(y[] + y[])/;
  90. }
  91. x[n+] = x[n];
  92. y[n+] = y[n];
  93. nowx = ;
  94. //printf("%d %d\n",r1,l2);
  95. while(l2 < n && r1 <= n)
  96. {
  97. int p1 = x[r1];
  98. int p2 = x[l2 + ] - *d;
  99. if(p1 < p2)
  100. nextx = p1;
  101. else nextx = p2;
  102. nextx = min(L- *d,nextx);
  103. //printf("%d %d\n",nowx,nextx);
  104. ans = max(ans,tmp + solve());
  105. if(p1 < p2)
  106. {
  107. nowx = p1;
  108. if(r1 < n)tmp -= (double)(x[r1+] - x[r1])*(y[r1+] + y[r1] )/;
  109. r1++;
  110. }
  111. else
  112. {
  113. nowx = p2;
  114. tmp += (double)(x[l2+] - x[l2])*(y[l2+] + y[l2])/;
  115. l2++;
  116. }
  117. }
  118. printf("%.3lf\n",ans//d);
  119. }
  120. return ;
  121. }

改成了O(n)的解法。

因为三分的那个函数是二次函数。

找最大值,只要找两个端点和对称轴处就足够了!

还是太弱,现场没有想到这个优化,改起来很容易的。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <queue>
  6. #include <map>
  7. #include <set>
  8. #include <vector>
  9. #include <string>
  10. #include <math.h>
  11. using namespace std;
  12. const int MAXN = ;
  13. int x[MAXN],y[MAXN];
  14. int d;
  15. int n;
  16. int L;
  17. int nowx ;
  18. int nextx;
  19. int r1,l2;
  20. const double eps = 1e-;
  21. double solve()
  22. {
  23. double left = nowx,right = nextx;
  24. //求出二次函数的a,b,c系数
  25. double tmp11 = x[r1];
  26. double tmp12 = -;
  27. double tmp13 = (double)y[r1] - (double)x[r1]*(y[r1-] - y[r1])/(x[r1-] - x[r1])/;
  28. double tmp14 = (double)(y[r1-] - y[r1])/(x[r1-] - x[r1])/;
  29. double tmp21 = *d - x[l2];
  30. double tmp22 = ;
  31. double tmp23 = y[l2] + (double)(*d - x[l2])*(y[l2+] - y[l2])/(x[l2+] - x[l2])/;
  32. double tmp24 = (double)(y[l2+] - y[l2])/(x[l2+] - x[l2])/;
  33. //函数Y = (tmp11 + tmp12 * x)*(tmp13 + tmp14 * x) + (tmp21 + tmp22 * x)*(tmp23 + tmp24*x)
  34. double a = tmp12 * tmp14 + tmp22 * tmp24;
  35. double b = tmp11 * tmp14 + tmp12 * tmp13 + tmp21 * tmp24 + tmp22 * tmp23;
  36. double c = tmp11 * tmp13 + tmp21 * tmp23;
  37.  
  38. double x0 = -b /(*a);//对称轴
  39. double ret = max(a*left*left + b*left + c,a*right *right + b * right + c);
  40. if(x0 >= left && x0 <= right)
  41. ret = max(ret,a * x0 * x0 + b*x0 + c);
  42. return ret;
  43.  
  44. /*
  45. double ret1,ret2;
  46. for(int cc = 0;cc <= 30;cc++)
  47. {
  48. double mid = (left + right)/2;
  49. double midmid = (mid + right)/2;
  50. double h1 = y[r1] + (double)(y[r1-1] - y[r1]) * (mid - x[r1])/(x[r1-1] - x[r1]);
  51. double h2 = y[l2] + (double)(y[l2+1] - y[l2])*(mid + 2*d - x[l2])/(x[l2 + 1] - x[l2]);
  52. ret1 = (double)(x[r1] - mid)*(h1 + y[r1])/2 + (double)(mid + 2*d - x[l2])*(h2 + y[l2])/2;
  53.  
  54. h1 = y[r1] + (double)(y[r1-1] - y[r1]) * (midmid - x[r1])/(x[r1-1] - x[r1]);
  55. h2 = y[l2] + (double)(y[l2+1] - y[l2])*(midmid + 2*d - x[l2])/(x[l2 + 1] - x[l2]);
  56. ret2 = (double)(x[r1] - midmid)*(h1 + y[r1])/2 + (double)(midmid + 2*d - x[l2])*(h2 + y[l2])/2;
  57. if(ret1 < ret2)
  58. left = mid+eps;
  59. else right = midmid-eps;
  60. }
  61. return ret1;
  62. */
  63. }
  64.  
  65. int input()
  66. {
  67. char ch;
  68. ch = getchar();
  69. while(ch < '' || ch >'')
  70. {
  71. ch = getchar();
  72. }
  73. int ret = ;
  74. while(ch >= '' && ch <= '')
  75. {
  76. ret *= ;
  77. ret += ch -'';
  78. ch = getchar();
  79. }
  80. return ret;
  81. }
  82.  
  83. int main()
  84. {
  85. //freopen("D.txt","r",stdin);
  86. //freopen("out.txt","w",stdout);
  87. int T;
  88. scanf("%d",&T);
  89. while(T--)
  90. {
  91. scanf("%d%d",&n,&L);
  92. for(int i = ;i <= n;i++)
  93. {
  94. //x[i] = input();
  95. //y[i] = input();
  96. scanf("%d%d",&x[i],&y[i]);
  97. }
  98. //scanf("%d%d",&x[i],&y[i]);
  99. scanf("%d",&d);
  100. double ans = ;
  101. r1 = ;
  102. l2 = ;
  103. double tmp = ;
  104. while(l2 < n && x[l2+] < *d)l2++;
  105. for(int i = r1;i < l2;i++)
  106. {
  107. tmp += (double)(x[i+] - x[i])*(y[i] + y[i+])/;
  108. }
  109. if(l2 == )
  110. {
  111. tmp -= (double)(x[] - x[])*(y[] + y[])/;
  112. }
  113. x[n+] = x[n];
  114. y[n+] = y[n];
  115. nowx = ;
  116. //printf("%d %d\n",r1,l2);
  117. while(l2 < n && r1 <= n)
  118. {
  119. int p1 = x[r1];
  120. int p2 = x[l2 + ] - *d;
  121. if(p1 < p2)
  122. nextx = p1;
  123. else nextx = p2;
  124. nextx = min(L- *d,nextx);
  125. //printf("%d %d\n",nowx,nextx);
  126. ans = max(ans,tmp + solve());
  127. if(p1 < p2)
  128. {
  129. nowx = p1;
  130. if(r1 < n)tmp -= (double)(x[r1+] - x[r1])*(y[r1+] + y[r1] )/;
  131. r1++;
  132. }
  133. else
  134. {
  135. nowx = p2;
  136. tmp += (double)(x[l2+] - x[l2])*(y[l2+] + y[l2])/;
  137. l2++;
  138. }
  139. }
  140. printf("%.3lf\n",ans//d);
  141. }
  142. return ;
  143. }

HDU 4816 Bathysphere (2013长春现场赛D题)的更多相关文章

  1. hdu 4813(2013长春现场赛A题)

    把一个字符串分成N个字符串 每个字符串长度为m Sample Input12 5 // n mklmbbileay Sample Outputklmbbileay # include <iost ...

  2. HDU 4821 String(2013长春现场赛I题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4821 字符串题. 现场使用字符串HASH乱搞的. 枚举开头! #include <stdio.h ...

  3. HDU 4818 Golden Radio Base (2013长春现场赛B题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4814 进制转换. 现场根据题目给的两个公式,不断更新!!! 胡搞就可以了. 现场3A,我艹,一次循环开 ...

  4. HDU 4815 Little Tiger vs. Deep Monkey(2013长春现场赛C题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4815 简单的DP题. #include <stdio.h> #include <st ...

  5. HDU 4815 Little Tiger vs. Deep Monkey 2013 长春现场赛C题

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4815 [题意] n个题目,每题有各自的分数,A有50%的概率答对一道题目得到相应分数,B想要在至少P的概率 ...

  6. HDU 4764 Stone (2013长春网络赛,水博弈)

    Stone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  7. HDU 4762 Cut the Cake (2013长春网络赛1004题,公式题)

    Cut the Cake Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  8. HDU 4759 Poker Shuffle(2013长春网络赛1001题)

    Poker Shuffle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  9. HDU 4768 Flyer (2013长春网络赛1010题,二分)

    Flyer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

随机推荐

  1. pwd、ln和重定向命令

    pwd命令 命令功能: ​ 使用pwd命令可以显示当前的工作目录,该命令很简单,直接输入pwd即可,后面不带参数. ​ pwd命令以绝对路径的方式显示用户当前工作目录.命令将当前目录的全路径名称(从根 ...

  2. PhpStorm,Pycharm,Goland破解

    phpstorm是一个轻量级且便捷的PHP IDE,其旨在提供用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查.不但是php开发的利器,前端开发也是毫不逊色的.下面记录Php ...

  3. CMT跟踪算法学习笔记(一)

    关于这个算法,已经有网友写出笔记. 这位网友用画图的方式总结出了算法的各个流程,并总结了源码中的各个类:http://blog.csdn.net/roamer_nuptgczx/article/det ...

  4. 通过微信Android和iOS版,看两大系统的差异

    由于设计师或者产品经理使用的移动设备大部分是iPhone,所以在做设计时,容易忽略Android和iOS的差异,按照自己的使用习惯进行设计,导致大部分设计师或产品经理做出的设计都是基于iOS规范或习惯 ...

  5. ruby on rails在fedora18上install

    ruby on rails 在fedora18下的安装 天朝的网络原因,安装不是很顺畅,所以把过程记录下备用 前面下载rubygem什么的都比较快,新建一个project的时候会出问题 gem new ...

  6. 关于NOIP2018初赛

    题面 这次PJ初赛有点傻了,可能是因为兴华水土不服吧(在这荒度了六年级的光阴). 选择题 DDDBBAAAABABBBB 第四题 当时懵了,我啥也不知道,于是就开始蒙 A.LAN B.WAN C.MA ...

  7. React项目

    React项目 React项目搭建与部署 一,介绍与需求 1.1,介绍 1.1.1,React简介 React 是一个用于构建用户界面的 JAVASCRIPT 库. React主要用于构建UI,很多人 ...

  8. 【LOJ】#2525. 「HAOI2018」字串覆盖

    题解 写后缀树真是一写就好久,然后调好久QAQ 我们把两个串取反拼一起建后缀树,这样的话使得后缀树是正串的后缀树 然后我们把询问挂在每个节点上,每次线段树合并,对于大于50的每次暴力跳着在线段树找,对 ...

  9. miniblink+golang开发windows gui应用

    golang的优点自不必说了,这么好的语言怎么能缺少界面库呢?所以我使用miniblink开发了一个可以用html,css,js开发界面的浏览器,通过它你能为你的golang开发简单的界面.说白了其实 ...

  10. 高能天气——团队Scrum冲刺阶段-Day 3

    高能天气--团队Scrum冲刺阶段-Day 3 今日完成任务 于欣月:完成天气预报部分收尾工作 余坤澎:进行特别关心的实现 康皓越:实现闹钟部分添加音乐 范雯琪:初步开始界面优化,寻找天气预报部分的背 ...