完全弹性碰撞可以视作互相穿过
所以直接考虑只有单个小球的时候,从板子上滑下所需要的时间即可
最后以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; }