CodeForces 703C Chris and Road

数学,递推。

不知道有没有更加神奇的做法,我是这样想的:

首先,如果多边形完全在$y$轴左侧,那么答案为$\frac{w}{u}$。

剩下的情况就要先判断是否能在车开过之前跑过去,如果跑不过去,要在车慢慢开过$y$轴的时候,一起慢慢跑上去。

那么先来判断是否能在车开过之前跑过去:

如上图所示,如果要在车来车前跑过去,那么等价于要求:对于凸包左侧蓝色链上的每一个点$L[i]$,满足$\frac{{L[i].y}}{u} ≤ \frac{{L[i].x}}{v}$,即人要比点先到。如果有一个点不满足,那么就人就无法在车来前跑过去。如果可以的话,答案为$\frac{w}{u}$。

剩下的情况就是凸包右侧黄色链开过$y$轴时,人同时走上去。这种情况的答案,递推一下就能算出来了,如果人走到$(0,R[i].y)$所花的时间为$ans$,那么人走到$(0,R[i+1].y)$的时间$ans$更新为$\max (ans + \frac{{\left( {R\left[ {i + 1} \right].y-R\left[ i \right].y } \right)}}{u},\frac{{R[i].x}}{v})$,想一想也能想明白吧~

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-8;
void File()
{
    freopen("D:\\in.txt","r",stdin);
    freopen("D:\\out.txt","w",stdout);
}

const int INF=2000000000;
const int maxn=10010;
int n,w,v,u,len1,len2;
struct X { int x,y; }p[maxn],L[maxn],R[maxn];

int main()
{
    scanf("%d%d%d%d",&n,&w,&v,&u);
    for(int i=1;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y);

    int ymin=INF,ymax=-INF,f,p1,p2; bool flag;
    for(int i=1;i<=n;i++) ymin=min(ymin,p[i].y), ymax=max(ymax,p[i].y);
    f=INF; for(int i=1;i<=n;i++) if(p[i].y==ymin&&p[i].x<f) f=p[i].x,p1=i;
    f=INF; for(int i=1;i<=n;i++) if(p[i].y==ymax&&p[i].x<f) f=p[i].x,p2=i;

    flag=0; for(int i=p1;i>=1;i--) { L[len1++]=p[i]; if(i==p2) { flag=1; break; } }
    if(flag==0) for(int i=n;i>=p2;i--) L[len1++]=p[i];

    f=-INF; for(int i=1;i<=n;i++) if(p[i].y==ymin&&p[i].x>f) f=p[i].x,p2=i;
    f=-INF; for(int i=1;i<=n;i++) if(p[i].y==ymax&&p[i].x>f) f=p[i].x,p1=i;

    flag=0; for(int i=p1;i>=1;i--) { R[len2++]=p[i]; if(i==p2) { flag=1; break; } }
    if(flag==0) for(int i=n;i>=p2;i--) R[len2++]=p[i];

    for(int i=0;i<len2/2;i++) swap(R[i],R[len2-i-1]);
    bool fail=0; for(int i=0;i<len1;i++) if((LL)L[i].y*(LL)v>(LL)L[i].x*(LL)u) { fail=1; break; }

    int xmax=-INF; for(int i=1;i<=n;i++) xmax=max(xmax,p[i].x);
    if(xmax<=0) fail=0;
    if(fail==0) printf("%.6lf\n",1.0*w/u);
    else
    {
        double ans=0; int pre=0;
        for(int i=0;i<len2;i++)
        {
            ans=ans+1.0*(R[i].y-pre)/u; pre=R[i].y;
            ans=max(ans,1.0*R[i].x/v);
        }
        ans=ans+1.0*(w-pre)/u;
        printf("%.6lf\n",ans);
    }
    return 0;
}
时间: 2024-10-11 22:39:24

CodeForces 703C Chris and Road的相关文章

CodeForces 703C Chris and Road (简单几何)

题意:有一个n边形的汽车向以速度v向x轴负方向移动,给出零时时其n个点的坐标.并且有一个人在(0,0)点,可以以最大速度u通过w宽的马路,到达(0,w)点.现在要求人不能碰到汽车,人可以自己调节速度.问人到达马路对面的最小时间是多少? 析:这个题是一个简单的分类讨论,很明显只有两种情况,第一种,直接到达w,不会被车撞到,答案就是w/u, 第二种是切着车过去,或者是等车过去再过去,只要枚举车的每个顶点,找到最后通过y轴的点就好,或者根本不会与车相切. 代码如下: #pragma comment(l

Chris and Road

E - Chris and Road CodeForces - 703C 题意:查询区间中出现偶数次的数的异或和 树状数组 若是求奇数次的数的异或和,很好求区间[l,r]的异或和,即前r项异或和与前l-1项异或和异或即可 但这要求偶数次的,想办法把偶数的转化成奇数的,即区间中出现奇数次的异或和与不同数的异或和 异或 即可 出现的奇数次的异或和写前缀数组解决,不同数的用树状数组优化,用一个map映射my[x]表示x的上一步的位置 代码如下: #include <iostream> #includ

暑假练习赛 003 B Chris and Road

B - Chris and Road Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice _ uDebug Description Input Output Sample Input Sample Output Hint Description And while Mis

codeforces 711B - Chris and Magic Square

题目链接:http://codeforces.com/problemset/problem/711/B 题目大意: 输入 n ,输入 n*n 的矩阵,有一个占位 0 , 求得将 0 位置换成其他的整数 使得矩阵 行列斜 和全部相等. 代码状态: 一把辛酸泪

CodeForces 711B Chris and Magic Square (暴力,水题)

题意:给定n*n个矩阵,其中只有一个格子是0,让你填上一个数,使得所有的行列的对角线的和都相等. 析:首先n为1,就随便填,然后就是除了0这一行或者这一列,那么一定有其他的行列是完整的,所以,先把其他的算出来,然后再作差就算这个数了, 然后再去验证其他的对不对就好了.除了n为1,其他的都是唯一解应该.或者没有. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #i

Codeforces Round #365 (Div. 2)

5/5 这场CF有毒啊!!好在不计rating(/▽╲) 题A Mishka and Game 题意:略 题解:略 题B Mishka and trip 题意:给你一个图,告诉你一开始围成一个环,然后每个点都有自己的权值,然后两个点的路径权值为这两个点的乘积,然后告诉你某些点是中心点,然后问你权值之和. 题解:这题有点意思,第一题太水了,反而觉得不太好. (1)先算出对于那些中心点的所有权值,这样会重复,画图发现重了的地方就是多算了一次这些中心点形成的完全图,所以只要(2)减去这些中心点形成的完

Codeforces Round #365 (Div. 2) ABCD

A. Mishka and Game 题解: 水题..比较大小即可 代码: #include<bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define se second #define fs first #define ll long long #define CLR(x) memset(x,0,sizeof x) #define SZ(x) ((int)(x).size())

CodeForces 543d Road Improvement

Road Improvement Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces. Original ID: 543D64-bit integer IO format: %I64d      Java class name: (Any) The country has n cities and n - 1 bidirectional roads, it is possible

Codeforces 729C Road to Cinema(二分)

题目链接 http://codeforces.com/problemset/problem/729/C 题意:n个价格c[i],油量v[i]的汽车,求最便宜的一辆使得能在t时间内到达s,路途中有k个位置在g[i]的加油站,可以免费加满油,且不耗时间.每辆车有两种运行模式可以随时切换:1.每米一分钟两升油:2.每米两分钟一升油. 看到10^5次加上循环两次就想到二分或者线段树或者看错题意了. 这题二分查找一下汽油就可以了,找到最少多少汽油够到达,然后再for一遍找汽油量大的且价格便宜的车即可. 还