HDU 4816 Bathysphere (2013长春现场赛D题)
题目链接: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)代码。
- #include <stdio.h>
- #include <string.h>
- #include <iostream>
- #include <algorithm>
- #include <queue>
- #include <map>
- #include <set>
- #include <vector>
- #include <string>
- #include <math.h>
- using namespace std;
- const int MAXN = ;
- int x[MAXN],y[MAXN];
- int d;
- int n;
- int L;
- int nowx ;
- int nextx;
- int r1,l2;
- const double eps = 1e-;
- double solve()
- {
- double left = nowx,right = nextx;
- double ret1,ret2;
- for(int cc = ;cc <= ;cc++)
- {
- double mid = (left + right)/;
- double midmid = (mid + right)/;
- double h1 = y[r1] + (double)(y[r1-] - y[r1]) * (mid - x[r1])/(x[r1-] - x[r1]);
- double h2 = y[l2] + (double)(y[l2+] - y[l2])*(mid + *d - x[l2])/(x[l2 + ] - x[l2]);
- ret1 = (double)(x[r1] - mid)*(h1 + y[r1])/ + (double)(mid + *d - x[l2])*(h2 + y[l2])/;
- h1 = y[r1] + (double)(y[r1-] - y[r1]) * (midmid - x[r1])/(x[r1-] - x[r1]);
- h2 = y[l2] + (double)(y[l2+] - y[l2])*(midmid + *d - x[l2])/(x[l2 + ] - x[l2]);
- ret2 = (double)(x[r1] - midmid)*(h1 + y[r1])/ + (double)(midmid + *d - x[l2])*(h2 + y[l2])/;
- if(ret1 < ret2)
- left = mid+eps;
- else right = midmid-eps;
- }
- return ret1;
- }
- int input()
- {
- char ch;
- ch = getchar();
- while(ch < '' || ch >'')
- {
- ch = getchar();
- }
- int ret = ;
- while(ch >= '' && ch <= '')
- {
- ret *= ;
- ret += ch -'';
- ch = getchar();
- }
- return ret;
- }
- int main()
- {
- //freopen("D.txt","r",stdin);
- //freopen("out.txt","w",stdout);
- int T;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d%d",&n,&L);
- for(int i = ;i <= n;i++)
- {
- //x[i] = input();
- //y[i] = input();
- scanf("%d%d",&x[i],&y[i]);
- }
- //scanf("%d%d",&x[i],&y[i]);
- scanf("%d",&d);
- double ans = ;
- r1 = ;
- l2 = ;
- double tmp = ;
- while(l2 < n && x[l2+] < *d)l2++;
- for(int i = r1;i < l2;i++)
- {
- tmp += (double)(x[i+] - x[i])*(y[i] + y[i+])/;
- }
- if(l2 == )
- {
- tmp -= (double)(x[] - x[])*(y[] + y[])/;
- }
- x[n+] = x[n];
- y[n+] = y[n];
- nowx = ;
- //printf("%d %d\n",r1,l2);
- while(l2 < n && r1 <= n)
- {
- int p1 = x[r1];
- int p2 = x[l2 + ] - *d;
- if(p1 < p2)
- nextx = p1;
- else nextx = p2;
- nextx = min(L- *d,nextx);
- //printf("%d %d\n",nowx,nextx);
- ans = max(ans,tmp + solve());
- if(p1 < p2)
- {
- nowx = p1;
- if(r1 < n)tmp -= (double)(x[r1+] - x[r1])*(y[r1+] + y[r1] )/;
- r1++;
- }
- else
- {
- nowx = p2;
- tmp += (double)(x[l2+] - x[l2])*(y[l2+] + y[l2])/;
- l2++;
- }
- }
- printf("%.3lf\n",ans//d);
- }
- return ;
- }
改成了O(n)的解法。
因为三分的那个函数是二次函数。
找最大值,只要找两个端点和对称轴处就足够了!
还是太弱,现场没有想到这个优化,改起来很容易的。
- #include <stdio.h>
- #include <string.h>
- #include <iostream>
- #include <algorithm>
- #include <queue>
- #include <map>
- #include <set>
- #include <vector>
- #include <string>
- #include <math.h>
- using namespace std;
- const int MAXN = ;
- int x[MAXN],y[MAXN];
- int d;
- int n;
- int L;
- int nowx ;
- int nextx;
- int r1,l2;
- const double eps = 1e-;
- double solve()
- {
- double left = nowx,right = nextx;
- //求出二次函数的a,b,c系数
- double tmp11 = x[r1];
- double tmp12 = -;
- double tmp13 = (double)y[r1] - (double)x[r1]*(y[r1-] - y[r1])/(x[r1-] - x[r1])/;
- double tmp14 = (double)(y[r1-] - y[r1])/(x[r1-] - x[r1])/;
- double tmp21 = *d - x[l2];
- double tmp22 = ;
- double tmp23 = y[l2] + (double)(*d - x[l2])*(y[l2+] - y[l2])/(x[l2+] - x[l2])/;
- double tmp24 = (double)(y[l2+] - y[l2])/(x[l2+] - x[l2])/;
- //函数Y = (tmp11 + tmp12 * x)*(tmp13 + tmp14 * x) + (tmp21 + tmp22 * x)*(tmp23 + tmp24*x)
- double a = tmp12 * tmp14 + tmp22 * tmp24;
- double b = tmp11 * tmp14 + tmp12 * tmp13 + tmp21 * tmp24 + tmp22 * tmp23;
- double c = tmp11 * tmp13 + tmp21 * tmp23;
- double x0 = -b /(*a);//对称轴
- double ret = max(a*left*left + b*left + c,a*right *right + b * right + c);
- if(x0 >= left && x0 <= right)
- ret = max(ret,a * x0 * x0 + b*x0 + c);
- return ret;
- /*
- double ret1,ret2;
- for(int cc = 0;cc <= 30;cc++)
- {
- double mid = (left + right)/2;
- double midmid = (mid + right)/2;
- double h1 = y[r1] + (double)(y[r1-1] - y[r1]) * (mid - x[r1])/(x[r1-1] - x[r1]);
- double h2 = y[l2] + (double)(y[l2+1] - y[l2])*(mid + 2*d - x[l2])/(x[l2 + 1] - x[l2]);
- ret1 = (double)(x[r1] - mid)*(h1 + y[r1])/2 + (double)(mid + 2*d - x[l2])*(h2 + y[l2])/2;
- h1 = y[r1] + (double)(y[r1-1] - y[r1]) * (midmid - x[r1])/(x[r1-1] - x[r1]);
- h2 = y[l2] + (double)(y[l2+1] - y[l2])*(midmid + 2*d - x[l2])/(x[l2 + 1] - x[l2]);
- ret2 = (double)(x[r1] - midmid)*(h1 + y[r1])/2 + (double)(midmid + 2*d - x[l2])*(h2 + y[l2])/2;
- if(ret1 < ret2)
- left = mid+eps;
- else right = midmid-eps;
- }
- return ret1;
- */
- }
- int input()
- {
- char ch;
- ch = getchar();
- while(ch < '' || ch >'')
- {
- ch = getchar();
- }
- int ret = ;
- while(ch >= '' && ch <= '')
- {
- ret *= ;
- ret += ch -'';
- ch = getchar();
- }
- return ret;
- }
- int main()
- {
- //freopen("D.txt","r",stdin);
- //freopen("out.txt","w",stdout);
- int T;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d%d",&n,&L);
- for(int i = ;i <= n;i++)
- {
- //x[i] = input();
- //y[i] = input();
- scanf("%d%d",&x[i],&y[i]);
- }
- //scanf("%d%d",&x[i],&y[i]);
- scanf("%d",&d);
- double ans = ;
- r1 = ;
- l2 = ;
- double tmp = ;
- while(l2 < n && x[l2+] < *d)l2++;
- for(int i = r1;i < l2;i++)
- {
- tmp += (double)(x[i+] - x[i])*(y[i] + y[i+])/;
- }
- if(l2 == )
- {
- tmp -= (double)(x[] - x[])*(y[] + y[])/;
- }
- x[n+] = x[n];
- y[n+] = y[n];
- nowx = ;
- //printf("%d %d\n",r1,l2);
- while(l2 < n && r1 <= n)
- {
- int p1 = x[r1];
- int p2 = x[l2 + ] - *d;
- if(p1 < p2)
- nextx = p1;
- else nextx = p2;
- nextx = min(L- *d,nextx);
- //printf("%d %d\n",nowx,nextx);
- ans = max(ans,tmp + solve());
- if(p1 < p2)
- {
- nowx = p1;
- if(r1 < n)tmp -= (double)(x[r1+] - x[r1])*(y[r1+] + y[r1] )/;
- r1++;
- }
- else
- {
- nowx = p2;
- tmp += (double)(x[l2+] - x[l2])*(y[l2+] + y[l2])/;
- l2++;
- }
- }
- printf("%.3lf\n",ans//d);
- }
- return ;
- }
HDU 4816 Bathysphere (2013长春现场赛D题)的更多相关文章
- hdu 4813(2013长春现场赛A题)
把一个字符串分成N个字符串 每个字符串长度为m Sample Input12 5 // n mklmbbileay Sample Outputklmbbileay # include <iost ...
- HDU 4821 String(2013长春现场赛I题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4821 字符串题. 现场使用字符串HASH乱搞的. 枚举开头! #include <stdio.h ...
- HDU 4818 Golden Radio Base (2013长春现场赛B题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4814 进制转换. 现场根据题目给的两个公式,不断更新!!! 胡搞就可以了. 现场3A,我艹,一次循环开 ...
- HDU 4815 Little Tiger vs. Deep Monkey(2013长春现场赛C题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4815 简单的DP题. #include <stdio.h> #include <st ...
- HDU 4815 Little Tiger vs. Deep Monkey 2013 长春现场赛C题
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4815 [题意] n个题目,每题有各自的分数,A有50%的概率答对一道题目得到相应分数,B想要在至少P的概率 ...
- HDU 4764 Stone (2013长春网络赛,水博弈)
Stone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- 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 ...
- HDU 4759 Poker Shuffle(2013长春网络赛1001题)
Poker Shuffle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- HDU 4768 Flyer (2013长春网络赛1010题,二分)
Flyer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
随机推荐
- pwd、ln和重定向命令
pwd命令 命令功能: 使用pwd命令可以显示当前的工作目录,该命令很简单,直接输入pwd即可,后面不带参数. pwd命令以绝对路径的方式显示用户当前工作目录.命令将当前目录的全路径名称(从根 ...
- PhpStorm,Pycharm,Goland破解
phpstorm是一个轻量级且便捷的PHP IDE,其旨在提供用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查.不但是php开发的利器,前端开发也是毫不逊色的.下面记录Php ...
- CMT跟踪算法学习笔记(一)
关于这个算法,已经有网友写出笔记. 这位网友用画图的方式总结出了算法的各个流程,并总结了源码中的各个类:http://blog.csdn.net/roamer_nuptgczx/article/det ...
- 通过微信Android和iOS版,看两大系统的差异
由于设计师或者产品经理使用的移动设备大部分是iPhone,所以在做设计时,容易忽略Android和iOS的差异,按照自己的使用习惯进行设计,导致大部分设计师或产品经理做出的设计都是基于iOS规范或习惯 ...
- ruby on rails在fedora18上install
ruby on rails 在fedora18下的安装 天朝的网络原因,安装不是很顺畅,所以把过程记录下备用 前面下载rubygem什么的都比较快,新建一个project的时候会出问题 gem new ...
- 关于NOIP2018初赛
题面 这次PJ初赛有点傻了,可能是因为兴华水土不服吧(在这荒度了六年级的光阴). 选择题 DDDBBAAAABABBBB 第四题 当时懵了,我啥也不知道,于是就开始蒙 A.LAN B.WAN C.MA ...
- React项目
React项目 React项目搭建与部署 一,介绍与需求 1.1,介绍 1.1.1,React简介 React 是一个用于构建用户界面的 JAVASCRIPT 库. React主要用于构建UI,很多人 ...
- 【LOJ】#2525. 「HAOI2018」字串覆盖
题解 写后缀树真是一写就好久,然后调好久QAQ 我们把两个串取反拼一起建后缀树,这样的话使得后缀树是正串的后缀树 然后我们把询问挂在每个节点上,每次线段树合并,对于大于50的每次暴力跳着在线段树找,对 ...
- miniblink+golang开发windows gui应用
golang的优点自不必说了,这么好的语言怎么能缺少界面库呢?所以我使用miniblink开发了一个可以用html,css,js开发界面的浏览器,通过它你能为你的golang开发简单的界面.说白了其实 ...
- 高能天气——团队Scrum冲刺阶段-Day 3
高能天气--团队Scrum冲刺阶段-Day 3 今日完成任务 于欣月:完成天气预报部分收尾工作 余坤澎:进行特别关心的实现 康皓越:实现闹钟部分添加音乐 范雯琪:初步开始界面优化,寻找天气预报部分的背 ...