题目描述:

emmm.
又是个语死早系列.
我们有 N 个 机器人
每个机器人有个初始参量 X
表示 机器人初始位置
初始速度为 0
有 M 个 询问
首先给出一个时间参量 T
操作1 : 在 T 时间更改机器人 W ,W机器人速度变为 K 表示单位时间移动的距离
操作2 :询问 T 时间 走的最远的机器人距离原点的距离

题目分析:

很明显是一道超哥线段树的题目
将时间轴看做X轴 那么每个机器人的行走即为一个一次函数
但与之前的又有些不同
由于每个机器人的速度可以更改 所以其实每个机器人的行走函数是由很多函数组成的分段函数
而且机器人可以为速度可以为负数 那么我们就不能仅仅维护最大值啦
我分了两棵线段树分别维护 一颗线段树维护会导致过度的下放标记,T成SB
当然,我们也不可以直接对时间进行维护
时间最大到了 109 10 9 10^9 而 Q 仅有 105 10 5 10^5 要离散化一下

离散化时间,机器人是在接受到命令的时间才更改速度,对于之前的地方无影响,
导致一个机器人的在每个时间的函数曲线是一条条斜率不同的线段,最后为一条射线,注意分别维护
保证了时间递增 !

所以本题维护的是折线版的超哥!

细节是真的多!
另外一题,无脑全部long long T 成了 SB
慢慢改才A(大概是我写的太丑

题目链接:

BZOJ 3938

Ac 代码:

/*离散化时间,机器人是在接受到命令的时间才更改速度,对于之前的地方无影响,导致一个机器人的在每个时间的函数曲线是一条条斜率不同的线段,注意分别维护保证了时间递增
*/
#include <cstdio>
#include <iostream>
#include <algorithm>
#define ll long long
#define il inline
const int maxm=600005;
struct node{int opt,id;ll tim,k;
};
node q[maxm];
struct tree{ll k,b;int flag;
};
tree st[2][maxm<<2];
int last[maxm];
int tot,cnt,n,m;
ll ans1,ans2,nowb[maxm],nowk[maxm],tim[maxm];
il ll read1()
{ll x=0,w=1;char ch=0;while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*w;
}
il int read2()
{int x=0,w=1;char ch=0;while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*w;
}
il int gettime(ll x)
{return std::lower_bound(tim+1,tim+cnt+1,x)-tim;
}
double getx(ll k1,ll b1,ll k2,ll b2)
{return (b1-b2)/(1.0*(k2-k1));
}
void ins1(int o,int l,int r,int ql,int qr,ll b,ll k)
{int mid=(l+r)>>1;if (ql<=l&&r<=qr){if (!st[0][o].flag){st[0][o].k=k,st[0][o].b=b,st[0][o].flag=1; return; }ll tb=st[0][o].b,tk=st[0][o].k;ll y1=b+k*tim[l],y2=tb+tk*tim[l];ll y3=b+k*tim[r],y4=tb+tk*tim[r];if (y1<=y2&&y3<=y4) return;if (y1>=y2&&y3>=y4){st[0][o].b=b,st[0][o].k=k;return;} double xx=getx(k,b,tk,tb);if (y1>=y2){if (xx<=tim[mid]) ins1((o<<1),l,mid,ql,qr,b,k);else ins1((o<<1)|1,mid+1,r,ql,qr,tb,tk),st[0][o].b=b,st[0][o].k=k;}else{if (xx>tim[mid]) ins1((o<<1)|1,mid+1,r,ql,qr,b,k);else ins1((o<<1),l,mid,ql,qr,tb,tk),st[0][o].b=b,st[0][o].k=k;}return;}if (ql<=mid) ins1((o<<1),l,mid,ql,qr,b,k);if (qr>mid) ins1((o<<1)|1,mid+1,r,ql,qr,b,k);
}
void ins2(int o,int l,int r,int ql,int qr,ll b,ll k)
{int mid=(l+r)>>1;if (ql<=l&&r<=qr){if (!st[1][o].flag){st[1][o].k=k,st[1][o].b=b,st[1][o].flag=1; return; }ll tb=st[1][o].b,tk=st[1][o].k;ll y1=b+k*tim[l],y2=tb+tk*tim[l];ll y3=b+k*tim[r],y4=tb+tk*tim[r];if (y1>=y2&&y3>=y4) return;if (y1<=y2&&y3<=y4){st[1][o].b=b,st[1][o].k=k;return;} double xx=getx(k,b,tk,tb);if (y1<=y2){if (xx<=tim[mid]) ins2((o<<1),l,mid,ql,qr,b,k);else ins2((o<<1)|1,mid+1,r,ql,qr,tb,tk),st[1][o].b=b,st[1][o].k=k;}else{if (xx>tim[mid]) ins2((o<<1)|1,mid+1,r,ql,qr,b,k);else ins2((o<<1),l,mid,ql,qr,tb,tk),st[1][o].b=b,st[1][o].k=k;}return;}if (ql<=mid) ins2((o<<1),l,mid,ql,qr,b,k);if (qr>mid) ins2((o<<1)|1,mid+1,r,ql,qr,b,k);
}
void askmax(int o,int l,int r,int ind)
{if(st[0][o].flag) ans1=std::max(ans1,st[0][o].b+st[0][o].k*tim[ind]);if(l==r) return;int mid=(l+r)>>1;if(ind<=mid) askmax((o<<1),l,mid,ind);else askmax((o<<1)|1,mid+1,r,ind);
}
void askmin(int o,int l,int r,int ind)
{if(st[1][o].flag) ans2=std::min(ans2,st[1][o].b+st[1][o].k*tim[ind]);if(l==r) return;int mid=(l+r)>>1;if(ind<=mid) askmin((o<<1),l,mid,ind);else askmin((o<<1)|1,mid+1,r,ind);
}
int main()
{//freopen("test.in","r",stdin);//freopen("x1.out","w",stdout);n=read2(),m=read2();char s[10];for(int i=1;i<=n;i++) nowb[i]=read1(),nowk[i]=0,last[i]=0;for(int i=1;i<=m;i++){q[i].tim=tim[i]=read2();scanf("%s",s);if(s[0]=='c') q[i].opt=1,q[i].id=read1(),q[i].k=read2();else q[i].opt=0;} tim[tot=m+1]=0;std::sort(tim+1,tim+tot+1);cnt=std::unique(tim+1,tim+tot+1)-tim-1;for(int i=1;i<=m;i++)if(q[i].opt){int x=q[i].id;int pre=gettime(last[x]);int now=gettime(q[i].tim);ins1(1,1,cnt,pre,now,nowb[x],nowk[x]);ins2(1,1,cnt,pre,now,nowb[x],nowk[x]);nowb[x]=nowb[x]+q[i].tim*(nowk[x]-q[i].k);//得出新的线段的截距 nowk[x]=q[i].k;last[x]=q[i].tim;}for(int i=1;i<=n;i++)//最终插入一条从lasttime->inf的射线{int pre=gettime(last[i]);ins1(1,1,cnt,pre,cnt,nowb[i],nowk[i]);ins2(1,1,cnt,pre,cnt,nowb[i],nowk[i]);} //printf("Yes\n");for(int i=1;i<=m;i++)if(!q[i].opt){ans1=ans2=0;int askt=gettime(q[i].tim);askmax(1,1,cnt,askt),askmin(1,1,cnt,askt);printf("%lld\n",std::max(ans1,-ans2));}return 0;
}

[BZOJ 3938] Robot相关推荐

  1. BZOJ.3938.Robot(李超线段树)

    BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...

  2. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  3. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  4. BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)

    题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...

  5. BZOJ 2957楼房重建

    传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...

  6. Robot Framework(十八) 支持工具

    5支持工具 5.1库文档工具(libdoc) libdoc是一种用于为HTML和XML格式的测试库和资源文件生成关键字文档的工具.前一种格式适用于人类,后者适用于RIDE和其他工具.Libdoc也没有 ...

  7. Java Robot对象实现服务器屏幕远程监视

    Java Robot对象实现服务器屏幕远程监视2006-01-16 17:33 作者: xiepan110 出处: BLOG 责任编辑:方舟 摘要: 有时候,在Java应用程序开发中,如:远程监控或远 ...

  8. java robot类自动截屏

    直接上代码: package robot; import java.awt.Rectangle; import java.awt.Robot; import java.awt.event.InputE ...

  9. BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)

    BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...

最新文章

  1. 刻意练习:LeetCode实战 -- Task10. 两数相加
  2. docker操作大全
  3. java filter注入_如何使用Filter过滤请求中的SQL注入攻击
  4. c++一个问题:while(!cin) 的解释
  5. mysql提权_mysql提权总结
  6. 看看腾讯是怎么做产品设计分析的 - 腾讯QQ音乐业务产品规划
  7. 基于 MySQL + Tablestore 分层存储架构的大规模订单系统实践-架构篇
  8. Android 系统(40)Handler的基本概念
  9. (原)ubuntu下cadvisor+influxdb+grafana+supervisord监控主机和docker的containers
  10. 高博的一起做RGB-D SLAM 简单总结的流程框图
  11. reinterpret_cast 最小demo
  12. SQL server常见问题
  13. 华为参与《基于5G技术的医院网络建设标准》的制定
  14. 具有引导性的移动应用界面设计模式
  15. java 东八区日期转换_JavaScript日期转换为东八区的日期
  16. 【吴恩达deeplearning.ai】3.2 特征点检测
  17. C语言实现实数和复数矩阵及其各种运算(二)
  18. Unexpected token u in JSON at position解决方法
  19. 关于AMM解决滑点、无常损失问题的新认知 | TokenInsight
  20. 小米红米Note4X(高配版)解BL锁教程申请BootLoader解锁教程

热门文章

  1. Linux服务器配置深度学习环境
  2. 在图片上动态的写文字
  3. 要求输入一个企业员工的姓名,性别,工号,月基本工资,奖金补贴后,计算个人所得税。系统输出员工姓名,性别,工号,和月应发薪水和实发薪水(月应发薪水-个人所得税)
  4. 关于word转pdf功能实现
  5. 解决服务器磁盘是ssd还是hdd
  6. python 舍去小数_python小数的进位与舍去
  7. windows基于face_recognition实现人脸识别
  8. 湖州师范计算机学院女生宿舍,2018年湖州师范学院新生宿舍条件带空调,宿舍内部环境图片 - 高教网...
  9. wh计算公式_mAh和Wh怎么换算 详解mah和wh的区别
  10. SoftMax温度系数temperature parameter