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. [Codeforces1137D]Cooperative Game

    [Codeforces1137D]Cooperative Game Tags:题解 题意 这是一道交互题. 给你一张下面这样的地图,由一条长为\(t\)的有向链和一个长为\(c\)的环构成. 现在你有 ...

  2. CF1153F Serval and Bonus Problem FFT

    CF1153F Serval and Bonus Problem 官方的解法是\(O(n ^ 2)\)的,这里给出一个\(O(n \log n)\)的做法. 首先对于长度为\(l\)的线段,显然它的答 ...

  3. 【JVM.6】虚拟机类加载机制

    一.概述 虚拟机类加载机制:虚拟机把描述类的数据从Class文件中加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型. 与那些在编译时需要进行连接工作的语言不同 ...

  4. [译]通往 Java 函数式编程的捷径

    原文地址:An easier path to functional programming in Java 原文作者:Venkat Subramaniam 译文出自:掘金翻译计划 以声明式的思想在你的 ...

  5. SSO单点登录_理解

    SSO核心意义就一句话:一处登录,处处登录:一处注销,处处注销.即:在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 很多人容易把SSO与OAuth搞混.这里简单说明一下: OA ...

  6. sudo 与输出重定向

    本文介绍如何使用 sudo 将输出重定向到当前用户没有权限的文件.注意:本文中 demo 的演示环境为 ubuntu 18.04. Permission denied 问题 如果当前用户没有某个文件的 ...

  7. bootstrap完善按钮组bug

    .btn.active { border: 1px solid #ff9400 !important; color: #ff9400 !important; } <div class=" ...

  8. 《Linux内核设计与实现》第七章读书笔记

    第七章.中断和中断处理 7.1中断 中断使得硬件得以发出通知给处理器.中断随时可以产生,内核随时可能因为新来到的中断而被打断. 不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标志.操作系统给 ...

  9. Linux内核 实践二

    实践二 内核模块编译 20135307 张嘉琪 一.实验原理 Linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一个单内核.单内核由于所有内容 ...

  10. Opentsdb分布式安装

    Opentsdb分布式安装 --李琦 1.下载文件上传到虚拟机 -rw-r--r--.  1 root   root  76793860 Apr 27 10:56 opentsdb-2.2.0.tar ...