13938:Robot

#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define fi first
#define se second
const int N=1e5+10;
const int M=5e5+10;
inline int read(){
    int X=0,w=0;char ch=0;
    while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
    while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
vector<pii>a[N];
int t[N+M],q[M],lim,n,m;
char s[20];
struct node{
    int l,r;
    ll k,b;
    node(int L=0,int R=0,ll K=0,ll B=0){
    l=L,r=R,k=K,b=B;
    }
    ll point(int x){return k*x+b;}
}mx[(N+M)*4],mn[(N+M)*4];
inline int LSH(int x){
    return lower_bound(t+1,t+lim+1,x)-t;
}
ll query(int a,int l,int r,int k){
    ll a1=abs(mx[a].point(t[k])),a2=abs(mn[a].point(t[k]));
    if(l==r)return max(a1,a2);
    int mid=(l+r)>>1;ll ans;
    if(k<=mid)ans=query(a<<1,l,mid,k);
    else ans=query(a<<1|1,mid+1,r,k);
    return max(ans,max(a1,a2));
}
void upt(int a,int l,int r,node k){
    int mid=(l+r)>>1;
    if(k.point(t[mid])>mx[a].point(t[mid]))swap(k,mx[a]);
    if(l==r)return;
    if(min(mx[a].point(t[l]),mx[a].point(t[r]))>=max(k.point(t[l]),k.point(t[r])))return;
    if(mx[a].k>k.k)upt(a<<1,l,mid,k);
    else upt(a<<1|1,mid+1,r,k);
}
void dwn(int a,int l,int r,node k){
    int mid=(l+r)>>1;
    if(k.point(t[mid])<mn[a].point(t[mid]))swap(k,mn[a]);
    if(l==r)return;
    if(max(mn[a].point(t[l]),mn[a].point(t[r]))<=min(k.point(t[l]),k.point(t[r])))return;
    if(mn[a].k<=k.k)dwn(a<<1,l,mid,k);
    else dwn(a<<1|1,mid+1,r,k);
}
void insert(int a,int l,int r,node k){
    if(r<k.l||k.r<l)return;
    if(k.l<=l&&r<=k.r){
        upt(a,l,r,k);dwn(a,l,r,k);
        return;
    }
    if(l==r)return;
    int mid=(l+r)>>1;
    insert(a<<1,l,mid,k);insert(a<<1|1,mid+1,r,k);
}
int main(){
    n=read(),m=read();
    for(int i=1;i<=n;i++)a[i].push_back(pii(0,read()));
    t[++lim]=0;
    for(int i=1;i<=m;i++){
        int x=read();t[++lim]=x;scanf("%s",s);
        if(s[0]=='c'){
        int id=read(),v=read();
        a[id].push_back(pii(x,v));
        }else q[++q[0]]=x;
    }
    for(int i=1;i<=n;i++)a[i].push_back(pii(1e9,0));
    t[++lim]=1e9;
    sort(t+1,t+lim+1);
    lim=unique(t+1,t+lim+1)-t;
    for(int i=1;i<=n;i++){
        int sz=a[i].size();
        ll now=a[i][0].se;
        node p=node(LSH(a[i][0].fi),LSH(a[i][1].fi),0,now);
        insert(1,1,lim,p);
        for(int j=1;j<sz-1;j++){
        int l=a[i][j].fi,r=a[i][j+1].fi,k=a[i][j].se;
        p=node(LSH(l),LSH(r),k,now-(ll)k*l);
        insert(1,1,lim,p);
        now=now+(ll)k*(r-l);
        }
    }
    for(int i=1;i<=q[0];i++)
        printf("%lld\n",query(1,1,lim,LSH(q[i])));
    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Robot Framework是一款业内著名且常用的关键字+数据驱动双内核自动化测试框架,简称为RF框架。它是一个开源的自动化测试框架,使用简单且易于上手,特别适合自动化测试新手使用。 RF框架的特点包括: 1. 关键字驱动:RF框架使用关键字来描述测试步骤和操作,使得测试用例的编写更加简洁和易于维护。 2. 数据驱动:RF框架支持使用数据表格来组织测试数据,可以通过数据驱动的方式执行多组测试数据。 3. 插件化扩展:RF框架支持丰富的插件和库,可以方便地扩展功能,满足不同项目的需求。 4. 多语言支持:RF框架支持多种编程语言编写关键字库,包括Python、Java、.NET等,方便开发人员选择适合自己的语言进行开发。 5. 强大的报告和日志:RF框架提供了丰富的测试报告和日志功能,可以方便地查看测试结果和定位问题。 下面是一个使用RF框架编写的示例测试用例: ```robotframework *** Settings *** Library SeleniumLibrary *** Variables *** ${BROWSER} Chrome ${URL} https://www.example.com *** Test Cases *** Open Browser and Verify Title Open Browser ${URL} ${BROWSER} Title Should Be Example Domain Close Browser ``` 上述示例中,首先通过`Library`关键字引入了SeleniumLibrary库,然后定义了两个变量`${BROWSER}`和`${URL}`,分别表示浏览器类型和要访问的URL。接着定义了一个测试用例`Open Browser and Verify Title`,其中使用了`Open Browser`关键字打开浏览器,`Title Should Be`关键字验证页面标题,最后使用`Close Browser`关键字关闭浏览器。 通过以上示例,你可以看到RF框架的简洁和易用性。你可以根据自己的需求编写更多的测试用例,并使用RF框架提供的丰富功能进行自动化测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值