http://www.lydsy.com/JudgeOnline/problem.php?id=3938 (题目链接)

题意

  给出数轴上$n$个点,有$m$个操作,在时间$t$让一个点以一定的速度移动,或者询问时间$t$时距离原点最远的点。

Solution

  超哥线段树。时间当做横坐标,负半轴的情况斜率和截距乘上$-1$再做一遍。

  话说我为什么要离散化=  =

细节

  LL

代码

// bzoj3938
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf (1ll<<60)
#define eps 1e-8
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std; const int maxn=1000010;
LL ans[maxn],a[maxn];
int n,m,cnt,tot,last[maxn],tim[maxn],q[maxn];
char ch[100]; struct seg {
LL k,b,l,r;
LL ch(LL x) {return k*x+b;}
}v[maxn];
struct node {int cov;seg mx;}tr[maxn<<2];
double X(seg a,seg b) {
return a.k==b.k ? inf : 1.0*(a.b-b.b)/(b.k-a.k);
} void insert(int k,int l,int r,int s,int t,seg g) {
int mid=(l+r)>>1;
if (l==s && r==t) {
if (!tr[k].cov) tr[k].mx=g,tr[k].cov=1;
else {
seg a1=tr[k].mx,a2=g;double x=X(a1,a2);
if (a1.ch(tim[l])<a2.ch(tim[l]) || (fabs(a1.ch(tim[l])-a2.ch(tim[l]))<eps && a1.k<a2.k)) swap(a1,a2);
if (x<=tim[l] || x>=tim[r]) {tr[k].mx=a1;return;}
if (x<=tim[mid]) tr[k].mx=a2,insert(k<<1,l,mid,s,mid,a1);
else tr[k].mx=a1,insert(k<<1|1,mid+1,r,mid+1,t,a2);
}
return;
}
if (t<=mid) insert(k<<1,l,mid,s,t,g);
else if (s>mid) insert(k<<1|1,mid+1,r,s,t,g);
else insert(k<<1,l,mid,s,mid,g),insert(k<<1|1,mid+1,r,mid+1,t,g);
}
LL query(int k,int l,int r,int x) {
if (l==r) return tr[k].cov ? tr[k].mx.ch(x) : 0;
int mid=(l+r)>>1;LL t=0;
if (x<=tim[mid]) t=query(k<<1,l,mid,x);
else t=query(k<<1|1,mid+1,r,x);
return tr[k].cov ? max(t,tr[k].mx.ch(x)) : t;
}
void clear(int k,int l,int r) {
tr[k].cov=0;
if (l==r) return;
int mid=(l+r)>>1;
clear(k<<1,l,mid);
clear(k<<1|1,mid+1,r);
} int main() {
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%lld",&a[i]);
for (int i=1;i<=n;i++) v[++cnt]=(seg){0,a[i],0,-1},last[i]=cnt;
for (int x,i=1;i<=m;i++) {
scanf("%d",&tim[i]);
scanf("%s",ch);
if (ch[0]=='c') {
scanf("%d%lld",&x,&v[++cnt].k);
v[last[x]].r=v[cnt].l=tim[i];v[cnt].r=-1;
a[x]=v[last[x]].k*tim[i]+v[last[x]].b;
v[cnt].b=a[x]-v[cnt].k*tim[i];
last[x]=cnt;
}
if (ch[0]=='q') q[++tot]=tim[i];
}
m=unique(tim,tim+1+m)-tim-1;
for (int i=1;i<=cnt;i++) {
if (v[i].r==-1) v[i].r=tim[m];
int l=lower_bound(tim,tim+1+m,v[i].l)-tim;
int r=lower_bound(tim,tim+1+m,v[i].r)-tim;
insert(1,0,m,l,r,v[i]);
}
for (int i=1;i<=tot;i++)
ans[i]=query(1,0,m,q[i]);
clear(1,0,m);
for (int i=1;i<=cnt;i++) {
int l=lower_bound(tim,tim+1+m,v[i].l)-tim;
int r=lower_bound(tim,tim+1+m,v[i].r)-tim;
v[i].k*=-1;v[i].b*=-1;
insert(1,0,m,l,r,v[i]);
}
for (int i=1;i<=tot;i++) ans[i]=max(ans[i],query(1,0,m,q[i]));
for (int i=1;i<=tot;i++) printf("%lld\n",ans[i]);
return 0;
}

【bzoj3938】 Robot的更多相关文章

  1. 【转】Robot Framework 快速入门

    目录 介绍 概述 安装 运行demo 介绍样例应用程序 测试用例 第一个测试用例 高级别测试用例 数据驱动测试用例 关键词keywords 内置关键词 库关键词 用户定义关键词 变量 定义变量 使用变 ...

  2. 【转】Robot Framework用法总结

    今天总结下Robot Framework最基本的用法,一来呢,希望自己以后看到这篇总结,很快能回忆起如何使用Robot Framework.二来呢,以初学者的姿态总结Robot Framework,希 ...

  3. 【转】Robot Framework作者建议如何选择自动化测试框架

    原文:http://www.infoq.com/cn/news/2012/06/robot-author-suggest-autotest 软件自动化测试,作为手工测试的替代,越来越受到关注.Pekk ...

  4. 【转】robot framework + python实现http接口自动化测试框架

    前言 下周即将展开一个http接口测试的需求,刚刚完成的java类接口测试工作中,由于之前犯懒,没有提前搭建好自动化回归测试框架,以至于后期rd每修改一个bug,经常导致之前没有问题的case又产生了 ...

  5. 自动化测试===【转】Robot Framework作者建议如何选择自动化测试框架

    原文:http://www.infoq.com/cn/news/2012/06/robot-author-suggest-autotest 软件自动化测试,作为手工测试的替代,越来越受到关注.Pekk ...

  6. 【自动化测试】robot framwork的一点小发现

    我们在搭建完robotframwork框架并开始打开火狐浏览器的时候,总会碰到打不开浏览器的问题.这次,分享一个常见的小问题. 这个问题呢,是因为火狐的版本更新频繁,导致selenium的版本跟不上导 ...

  7. 【CF645D】 Robot Rapping Results Report(拓扑排序,二分)

    题意:有一张N点M边的有向图,求最小的K使根据前K条边就能够确定图是否有唯一的拓扑序, 若没有唯一拓扑序输出-1 思路:二分答案再拓扑排序,以入度为0的节点作为新的一层,若某一层的节点个数<&g ...

  8. 【POJ1573】Robot Motion

    题目传送门 本题知识点:模拟 本题的题意也很简单. 给出一个矩阵,矩阵里面有着东南西北(上下左右)的指示,当机器人走到上面时则会按照指示前进.机器人每次都从最上面一行的某一列进入. 需要判断的是机器人 ...

  9. 【LeetCode】字符串 string(共112题)

    [3]Longest Substring Without Repeating Characters (2019年1月22日,复习) [5]Longest Palindromic Substring ( ...

随机推荐

  1. JavaScript 利用 async await 实现 sleep 效果

    const sleep = (timeountMS) => new Promise((resolve) => { setTimeout(resolve, timeountMS); }); ...

  2. item 1:理解template类型的推导

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 一些用户对复杂的系统会忽略它怎么工作,怎么设计的,但是很高兴去知道它完成的一些事.通过这 ...

  3. Oracle数据库冷备份与热备份操作梳理

    Oracle数据库的备份方式有冷备份和热备份两种,针对这两种备份的实施过程记录如下: 一.Oracle冷备份 概念数据库在关闭状态下完成所有物理系统文件拷贝的过程,也称脱机备份.适合于非归档模式(即n ...

  4. pair project elevator

    结对编程——电梯调度 12061181 高孟烨 12061182 郝倩 1.结对编程的优缺点: 优点:结对编程可以结合两个人各自擅长之地,充分发挥两个人各自的优势,两个人一起合作效率会更高.一份工作两 ...

  5. Note: SE Class's Individual Project

    虽然第一个Project还有点小问题需要修改,但是大体已经差不多了,先把blog记在这里,算是开博第一篇吧! 1.项目预计的用时 本来看到这个题的时候想的并不多,但是看了老师的要求才觉得如此麻烦ORZ ...

  6. 终于做完了这个pj

    首先要说这个博客网站实在是功能太弱!不知道为什么还要每次写博客.直接交作业不好吗- -b 1.估计时间: 看见这个任务就觉得很难啊,估计装vs2012就得半天,然后上学期选修的c++基本上都忘光了,本 ...

  7. #个人博客作业week2——结对编程伙伴代码复审

    General 1.程序能够顺利地运行.程序通过命令行输入,能够向对应的文件中输出符合要求的题目和答案.程序能够根据用户的不同选择,进行题目的生产或答案的校验,生成出的题目符合参数要求和项目的查重等各 ...

  8. 20150401 作业2 结对 四则运算ver 1.0

    Web項目下 Tomcat服務器的路徑 /WebContant/ 目錄下 SE2_2.jsp <%@ page language="java" contentType=&qu ...

  9. JHipster - Generate your Spring Boot + Angular/React applications!

    JHipster - Generate your Spring Boot + Angular/React applications!https://www.jhipster.tech/

  10. [转帖]龙芯下一代处理器微结构GS464E细节曝光

    龙芯下一代处理器微结构GS464E细节曝光 [日期:2015-05-26] 来源:Linux公社  作者:Linux [字体:大 中 小] http://www.linuxidc.com/Linux/ ...