HZOJ 老司机的狂欢
比较神仙的一道题。
第一问还比较简单一点:
t是否可行是单调的,考虑二分。
考虑对于两个人i,j合法的条件,设x(i)<x(j),那么$x(i)+\frac {a(i)*t^2}{2} < x(j)+\frac {a(j)*t^2}{2}$。
那么把x离散作为数组下标,t时间后的位置作为值,合法的最多人数为最长上升子序列。
将t时间后的位置再次离散,树状数组维护即可。
注意此序列的下标为离散后的x,并不是输入的‘老司机’的id,在求解第二问的时候要特别注意。
只需要判断最长上升子序列的长度与k的关系即可。
第二问就比较恶心了:
考虑求解最长上升子序列的同时记录前驱,那么可以找到一种合法的方案。
之后考虑字典序最小这条限制。
问题在于对于点i,之前可能有多个点是最大值,但是需要选择排序之后字典序最小的一个转移。
考虑dp的转移;一个点只能有他之前的一个点转移过来,所以是一个树形结构。
设f[j]=f[k]且都可以转移到i,那么考虑转移的树形结构,j,k处于同意深度,且lca及以上的序列相同。
当j->lca这条路径上的最小值小于k->lca这条路径的最小值时j比k更优。
那么只要倍增维护前驱及最小值即可。
用树状数组维护,转移和第一问类似。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
#define int LL
#define LL long long
using namespace std;
struct edge
{
int u,v,nxt;
#define u(x) ed[x].u
#define v(x) ed[x].v
#define n(x) ed[x].nxt
}ed[1000010];
int firs[100010],num_e;
#define f(x) firs[x]
struct node
{
LL x;int a,id,y;
#define x(i) A[i].x
#define y(i) A[i].y
#define a(i) A[i].a
#define id(i) A[i].id
double dis(int t){return x+a*t*t/2.0;}
}A[100010];
int n,k,ans,tx[100010];
bool v[100010];
vector<int>al1,al2; struct TREE
{
LL C[100010];
#define lowbit(x) ((x)&(-(x)))
void clear(){memset(C,0,sizeof(C));}
void add(int x,int y){if(!x)return;while(x<=n)C[x]=max(C[x],y),x+=lowbit(x);}
LL ask(int x){if(!x)return 0;LL ans=0;while(x)ans=max(ans,C[x]),x-=lowbit(x);return ans;}
}T;
double a[200010],b[200010];LL c[200010],id[200010];int f[100010],pre[100010][26],prm[100010][26];
bool xy(int x,int y)
{
if(!x)return 0;
if(!y)return 1;
int t1=x,t2=y;
int minx=0x7fffffff,miny=0x7fffffff;
for(int i=25;i>=0;i--)
if(pre[x][i]!=pre[y][i])
minx=min(minx,prm[x][i]),
miny=min(miny,prm[y][i]),
x=pre[x][i],y=pre[y][i];
minx=min(minx,prm[x][0]);
miny=min(miny,prm[y][0]);
return minx<miny;
}
#define pair pair<int,int>
#define fir first
#define sec second
#define MP(a,b) make_pair(a,b)
struct TREE2
{
pair C[100010];
#define lowbit(x) ((x)&(-(x)))
void clear(){memset(C,0,sizeof(C));}
void add(int x,int y,int z)
{
if(!x)return;
while(x<=n)
{
if(y>C[x].fir)C[x]=MP(y,z);
else if(y==C[x].fir&&xy(z,C[x].sec))C[x].sec=z;
x+=lowbit(x);
}
}
pair ask(int x)
{
if(!x)return MP(0,0);pair ans=MP(0,0);
while(x)
{
if(C[x].fir>ans.fir)ans=C[x];
else if(C[x].fir==ans.fir&&xy(C[x].sec,ans.sec))ans.sec=C[x].sec;
x-=lowbit(x);
}
return ans;
}
}T2;
int solve(int t)
{
memset(f,0,sizeof(f));T.clear();
for(int i=1;i<=n;i++)a[y(i)]=A[i].dis(t),b[y(i)]=a[y(i)];
sort(b+1,b+n+1);int m=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;i++)c[i]=lower_bound(b+1,b+m+1,a[i])-b; int maxn=0;
for(int i=1;i<=n;i++)f[i]=T.ask(c[i]-1)+1,T.add(c[i],f[i]),maxn=max(maxn,f[i]);
if(maxn<k)return 0;if(maxn==k)return 1;return 2;
}
int sta[200010],top,dis[200010],du[200010];
inline int read();
inline void add(int u,int v);
signed main()
{
// freopen("driver2.in","r",stdin);
// freopen("in.txt","r",stdin);
// freopen("1.out","w",stdout); n=read(),k=read();
for(int i=1;i<=n;i++)
x(i)=read(),a(i)=read(),id(i)=i,tx[i]=x(i);
sort(tx+1,tx+n+1);int m=unique(tx+1,tx+n+1)-tx-1;
for(int i=1;i<=n;i++)y(i)=lower_bound(tx+1,tx+m+1,x(i))-tx;
int l=0,r=86400,mid,ans=0;
while(l<r)
{
mid=(l+r+1)>>1;
int te=solve(mid);
if(te)ans=te,l=mid;
else r=mid-1;
}
printf("%lld\n",l);
if(ans==2){puts("-1");return 0;} memset(f,0,sizeof(f));T2.clear();
for(int i=1;i<=n;i++)a[y(i)]=A[i].dis(l),b[y(i)]=a[y(i)],id[y(i)]=i;
sort(b+1,b+n+1);m=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;i++)c[i]=lower_bound(b+1,b+m+1,a[i])-b; for(int i=1;i<=n;i++)
{
pair tem=T2.ask(c[i]-1);
f[i]=tem.fir+1;pre[id[i]][0]=tem.sec;prm[id[i]][0]=id[i];
for(int j=1;j<=25;j++)
pre[id[i]][j]=pre[pre[id[i]][j-1]][j-1],
prm[id[i]][j]=min(prm[id[i]][j-1],prm[pre[id[i]][j-1]][j-1]);
T2.add(c[i],f[i],id[i]);
}
for(int i=1;i<=n;i++)
if(f[i]>=k)
{
al2.clear();int now=id[i];
while(now){al2.push_back(now);now=pre[now][0];}
if(!al1.size()){al1=al2;continue;}
sort(al1.begin(),al1.end());
sort(al2.begin(),al2.end());
for(int j=0;j<k;j++)
if(al2[j]<al1[j]){al1=al2;break;}
else if(al2[j]>al1[j])break;
}
sort(al1.begin(),al1.end());
for(int i=0;i<k;i++)printf("%lld\n",al1[i]);
}
inline int read()
{
int s=0,f=1;char a=getchar();
while(a<'0'||a>'9'){if(a=='-')f=-1;a=getchar();}
while(a>='0'&&a<='9'){s=s*10+a-'0';a=getchar();}
return s*f;
}
HZOJ 老司机的狂欢的更多相关文章
- [CSP-S模拟测试]:老司机的狂欢(LIS+LCA)
题目背景 光阴荏苒.不过,两个人还在,两支车队还在,熟悉的道路.熟悉的风景,也都还在.只是,这一次,没有了你死我活的博弈,似乎和谐了许多.然而在机房是不允许游戏的,所以班长$XZY$对游戏界面进行了降 ...
- NOIP 模拟 $18\; \rm 老司机的狂欢$
题解 \(by\;zj\varphi\) 一道很有趣的题,我用的动态开点线段树和倍增 首先对于第一问,不难想到要二分,二分时间,因为时间长一定不会比时间短能跑的人多 那么如何 check,先将所有老司 ...
- [BZOJ4200][Noi2015]小园丁与老司机
4200: [Noi2015]小园丁与老司机 Time Limit: 20 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 106 Solved ...
- 老司机学新平台 - Xamarin开发之我的第一个MvvmCross跨平台插件:SimpleAudioPlayer
大家好,老司机学Xamarin系列又来啦!上一篇MvvmCross插件精选文末提到,Xamarin平台下,一直没找到一个可用的跨平台AudioPlayer插件.那就自力更生,让我们就自己来写一个吧! ...
- 老司机学新平台 - Xamarin Forms开发框架之MvvmCross插件精选
在前两篇老司机学Xamarin系列中,简单介绍了Xamarin开发环境的搭建以及Prism和MvvmCross这两个开发框架.不同的框架,往往不仅仅使用不同的架构风格,同时社区活跃度不同,各种功能模块 ...
- 老司机学新平台 - Xamarin开发环境及开发框架初探
随着被微软收购,最近一年间,Xamarin的火爆程度与日俱增.免费.更好的VS2015集成.更好的模拟器,甚至,在windows上运行和调试iOS平台程序,让我这样接触了十几年.NET平台的老司机,即 ...
- FJNU 1196 汪老司机(DP or 建图+最短路)
1196: 汪老司机 Time Limit: 1000 MS Memory Limit: 257792 KB 64-bit interger IO format: %lld ...
- 老司机带你走进Core Animation
为什么时隔这么久我又回来了呢? 回来圈粉. 开玩笑的,前段时间ipv6被拒啊,超级悲剧的,前后弄了好久,然后需求啊什么的又超多,所以写好的东西也没有时间整理.不过既然我现在回来了,那么这将是一个井喷的 ...
- 【Bugly干货分享】老司机教你 “飙” EventBus 3
Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. EventBus对于Android ...
随机推荐
- CentOS + Nginx 的常用操作指令总结
CentOS + Nginx 的常用操作指令总结 一. 关于CentOS 查看 yum 源是否存在 yum list | grep nginx 如果不存在 或者 不是自己想要的版本 可以自己设置Ngi ...
- 告别诊断烦恼 | 应用实时监控 ARMS 上线智能和实时诊断功能
为什么要做这个功能? 作为一款应用性能监控产品,我们通常会给用户展示两类数据: 第一种是统计数据:用户通过使用统计数据设置报警(比如应用响应时间大于2s),缩小问题范围(比如报警时间范围内,是哪一个接 ...
- mac vagrant 虚拟机nfs挂载点
需求:在mac 上安装了虚拟机,虚拟机系统为centos6.5,现在希望讲虚拟机上点目录通过nfs共享给mac使用 下面主要描述通过nfs共享目录给mac调用的过程 过程参考网址: http://ww ...
- LR自带网站飞机订票系统 启动
LR自带的网站:飞机订票系统 可是如何启动自带的网站呢?? 一.启动服务:开始-所有程序--HP Software-HP LoadRunner-Samples-Web-Start Web Server ...
- 20190813「Night」-Blind
夜场. 先说说题面,周,任,飞? 好像是个巨巨巨巨巨巨佬. 郭神?同上. 好像题解包里都有. %%%出题人liu_runda. liu_runda是谁? 凭实力在NOI2017退役的辣鸡蒟蒻. 郭神是 ...
- 关于python的字符串操作
字符串的判断操作: str = "fahaf asdkfja\t \r \n fjdhal 3453" print(str.isspace()) # 如果str中只包含空格,则返回 ...
- Win7下设置WiFi热点
Win7下设置WiFi热点 今天研究了下Win7设置WIFI热点,Connectify神马的都是浮云~亲測可用,现拿出来分享下~ 1.点击"開始",再点击"执行" ...
- MySQL--视图、触发器、事务、存储过程、内置函数、流程控制、索引
视图 触发器 事务 存储过程 内置函数 流程控制 索引 视图 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复 ...
- 查漏补缺·补丁计划
趁着神志清醒赶紧写一下. 多次考试暴露出各种问题.新的知识点先不去搞了,最近多做一些不擅长的类型的题查漏补缺一下吧. 唔,首先是比较考验思维的类型,我智商太低又刷题少不会什么套路,只能最近赶紧赶一下进 ...
- Redhat/Fedora 网络接口的配置文件和网络接口专用配置工具
在Redhat/Fedora 中,与乙太网卡相关的配置文件位于 /etc/sysconfig/network-scripts目录中,比如 ifcfg-eth0.ifcfg-eth1 .... .... ...