题目链接: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题)的更多相关文章

  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. 【webService客户端】webservice客户端工具

    public static Object invokeWebService(String namespaces,String url, String method, Object[] params, ...

  2. Spring bean 配置

    1.传统的创建对象的方式:JedisMall tardition=new JedisMall(); 这样是在程序运行时创建,表示当前模块已经不知不觉和new出的对象耦合了,而我们通常都是更高层次的抽象 ...

  3. 一个查看Access数据库密码的工具

    一个可以查看Access数据库密码的工具AccessCracker.需要.net2.0环境支持. 网盘地址:https://pan.baidu.com/s/1btbsFcsKO0Enj-rjkTlz6 ...

  4. jira ao UpgradeTask

    插件发布到市场后,后续版本迭代的过程中,可能会对ao实体类的字段作添加或删除,或者要将某一字段的值映射解析到另一字段上. 本来这个工作,可以在插件启动的时候,在实现了com.atlassian.sal ...

  5. CentOS 7 之安装 Oracle 11gR2

    一.准备工作 1.下载Oracle安装包:linux.x64_11gR2_database_1of2.zip 和 linux.x64_11gR2_database_2of2.zip ,可以下载到本地, ...

  6. MySQL的lock tables和unlock tables的用法(转载)

    早就听说lock tables和unlock tables这两个命令,从字面也大体知道,前者的作用是锁定表,后者的作用是解除锁定.但是具体如何用,怎么用,不太清楚.今天详细研究了下,总算搞明白了2者的 ...

  7. 线性回归模型的 MXNet 与 TensorFlow 实现

    本文主要探索如何使用深度学习框架 MXNet 或 TensorFlow 实现线性回归模型?并且以 Kaggle 上数据集 USA_Housing 做线性回归任务来预测房价. 回归任务,scikit-l ...

  8. Parcel极速零配置Web应用打包工具

    当听到极速零配置打包,我不经兴奋起来,零配置!!!想起在webpack打包的配置,这个零配置着实让我好奇不已,迅速学习一波. Parcel(parcel 英[ˈpɑ:sl] 美[ˈpɑ:rsl])有以 ...

  9. Java 类的继承详解

    /*文章中用到的代码只是一部分,需要完整代码的可通过邮箱联系我1978702969@qq.com*/ 在面向对象的语言中如C++和JAVA,都有一个比较重要的机制——类的继承.这里将对JAVA中的类的 ...

  10. Java NIO -2

    NIO http://www.cnblogs.com/puyangsky/p/5840873.html -- 操作系统与 Java 基于流的 I/O模型有些不匹配.操作系统要移动的是大块数据(缓冲区) ...