[JZOJ4944]Monument
来源:互联网 发布:ubuntu开机显示grub 编辑:程序博客网 时间:2024/04/29 08:57
题目大意
有
现在你最多可以删除
题目分析
首先我们可以想到二分答案。那么怎么判定答案
可以发现,两个人没有相遇当且仅当在零时刻两人的相对顺序和
那么我们删掉最少的人=保留最多的人使得这些相对顺序不发生变化。
那可以一开始将所有人按照
令
代码实现
使用lower_bound来实现LIS真短!
#include <algorithm>#include <iostream>#include <cfloat>#include <cstdio>#include <cctype>using namespace std;typedef long double db;int read(){ int x=0,f=1; char ch=getchar(); while (!isdigit(ch)) f=ch=='-'?-1:f,ch=getchar(); while (isdigit(ch)) x=x*10+ch-'0',ch=getchar(); return x*f;}const db INF=2e+9;const db EPS=1e-5;const int N=100050;int v[N],p[N],kth[N];db f[N],x[N];db ans;int n,K;bool judge(db t){ for (int i=1;i<=n;i++) x[i]=1.0*v[kth[i]]*t+1.0*p[kth[i]]; for (int i=1;i<=n;i++) f[i]=DBL_MAX/3; f[0]=-DBL_MAX/3; int len=0; for (int i=1;i<=n;i++) { int id=lower_bound(f,f+len+1,x[i])-f; f[id]=x[i],len=max(len,id); } return n-len<=K;}void binary_search(){ for (db l=0.0,r=INF,mid;r-l>EPS;) { mid=(l+r)/2.0; if (judge(mid)) l=(ans=mid)+EPS; else r=mid-EPS; }}bool cmp(int x,int y){return p[x]<p[y];}int main(){ freopen("monument.in","r",stdin),freopen("monument.out","w",stdout); n=read(),K=read(); for (int i=1;i<=n;i++) p[i]=read(),v[i]=read(),kth[i]=i; sort(kth+1,kth+1+n,cmp); binary_search(); if (judge(ans+1.0)) printf("Forever\n"); else printf("%.4lf\n",(double)ans); fclose(stdin),fclose(stdout); return 0;}
0 0
- [JZOJ4944]Monument
- JZOJ4944. Monument
- JZOJ4944. 【WC模拟】Monument
- Monument & Lightbot 玩后感
- 【WC模拟】Monument
- 【WC模拟】Monument
- JZOJ 4944 【WC模拟】Monument
- Python--结巴分词
- c++(一)
- JavaScript初探三
- Linux开机自动启动ORACLE设置
- 动态参数查询
- [JZOJ4944]Monument
- MFC ADO连接数据库
- NO.7_136. Single Number
- CCF201312--模拟练习试题参考答案(C++)
- oracle group by用法
- 在做springmvc框架时出现404的情况
- 码云与与GitHUB的对比及使用码云细节
- 算法竞赛入门经典 习题1-1 平均数(average)
- 倒序和正序迭代元组和列表