ZJNU 1422 - 碰撞的小球

完全弹性碰撞可以视作互相穿过

所以直接考虑只有单个小球的时候,从板子上滑下所需要的时间即可

最后以30000为界分开流读入与缓冲区优化的io方法

//Case4用缓冲区io优化会WA??

#pragma GCC optimize(3)
#include<iostream>
#include<algorithm>
#include<cctype>
using namespace std;
int pos[1000000],dir[1000000],ans[1000000];
const int bsz=1<<16;
char bf[bsz],*head,*tail;
inline char gc()
{
    if(head==tail)
    {
        int l=fread(bf,1,bsz,stdin);
        tail=(head=bf)+l;
    }
    return *head++;
}
inline int read()
{
    int x=0,f=1;char c=gc();
    for(;!isdigit(c);c=gc())
        if(c=='-')
            f=-1;
    for(;isdigit(c);c=gc())
        x=x*10+c-'0';
    return x*f;
}
inline void write(int x)
{
    if(x>=10)
        write(x/10);
    putchar(x%10+'0');
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int i,vd,nl,n,m,L;
    cin>>n>>m>>L;
    if(n>30000)
    {
        for(i=0;i<n;i++)
            pos[i]=read();
        for(i=0;i<n;i++)
            dir[i]=read();
        for(i=0;i<n;i++)
        {
            vd=read();
            if(dir[i])
                nl=L+1-pos[i];
            else 
                nl=pos[i];
            ans[i]=nl/vd+(nl%vd?1:0);
        }
        sort(ans,ans+n);
        write(ans[n-m-1]);
    }
    else
    {
        for(i=0;i<n;i++)
            cin>>pos[i];
        for(i=0;i<n;i++)
            cin>>dir[i];
        for(i=0;i<n;i++)
        {
            cin>>vd;
            if(dir[i])
                nl=L+1-pos[i];
            else 
                nl=pos[i];
            ans[i]=nl/vd+(nl%vd?1:0);
        }
        sort(ans,ans+n);
        cout<<ans[n-m-1];
    }
    
    return 0;
}

 

posted @ 2020-01-26 23:55  StelaYuri  阅读(137)  评论(0编辑  收藏  举报