JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨

5236. 【NOIP2017模拟8.7A组】利普希茨

(File IO): input:lipschitz.in output:lipschitz.out
Time Limits: 1000 ms Memory Limits: 524288 KB Detailed Limits

Description

这里写图片描述

Input

输入文件名为lipschitz.in。
第一行一个整数n。
接下来一行n个整数,描述序列A。
第三行一个数q 。
接下来q行,每行三个整数。其中第一个整数type表示操作的类型。 type=0对应修改操作, type=1对应查询操作。

Output

输出文件名为lipschitz.out。
对于每个查询,给出f(A[l..r]) 。

Sample Input

输入1:
6
90 50 78 0 96 20
6
0 1 35
1 1 4
0 1 67
0 4 11
0 3 96
1 3 5

输入2:
50
544 944 200 704 400 150 8 964 666 596 850 608 452 103 988 760 370 723 350 862 856 0 724 544 668 891 575 448 16 613 952 745 990 459 740 960 752 194 335 575 525 12 618 80 618 224 240 600 562 283
10
1 6 6
1 1 3
0 11 78279
0 33 42738
0 45 67270
1 1 26
1 19 24
1 37 39
1 8 13
0 7 64428

Sample Output

输出1:
78
85

输出2:
0
744
77683
856
558
77683

Data Constraint

对于30%的数据,n,q<=500
对于60%的数据,n,q<=5000
对于100%的数据,n,q<=100000,0<=ai,val<=10^9

题解

可以转化成坐标

这里写图片描述

对于每个点(x,y)y表示Ax,先把公式列出来

f(A)=maxi<j|AjAi|ji

显然,对于任意两点,|AjAi|ji求出来的就是斜率
因此,只用找到斜率最大的就可以了

对于ABC三点,lAB的斜率比lAC
对于ABD三点,lBC的斜率比lAD

所以,在三点中,一定存在相邻的两点最优

因此f(A)=max|Ai+1Ai|
用线段树维护一下Ai+1Ai就行了

代码

#include<cstdio>
#include<algorithm>
#define N 100010

struct node{
    long maxx;
    node *lc,*rc;
}*head;
void init(node* &now)
{
    now=new node;
    now->maxx=0;
    now->lc=now->rc=NULL;
}
void build(long l,long r,node* &now=head)
{
    init(now);
    if(l!=r){
        long mid=(l+r)>>1;
        build(l,mid,now->lc);
        build(mid+1,r,now->rc);
    }
}
void change(long l,long r,long x,long key,node* &now=head)
{
    if(l==r)now->maxx=key;
    else{
        long mid=(l+r)>>1;
        if(x<=mid)
            change(l,mid,x,key,now->lc);
        else
            change(mid+1,r,x,key,now->rc);
        now->maxx=std::max(now->lc->maxx,now->rc->maxx);
    }
}
long query(long l,long r,long x,long y,node *now=head)
{
    if(x<=l&&r<=y)return now->maxx;
    else{
        long mid=(l+r)>>1,maxx=0;
        if(x<=mid)
            maxx=std::max(maxx,query(l,mid,x,y,now->lc));
        if(y>mid)
            maxx=std::max(maxx,query(mid+1,r,x,y,now->rc));
        return maxx;
    }
}

long a[N];

int main()
{   long n,m,i,x,y,z;
    freopen("lipschitz.in","r",stdin);
    freopen("lipschitz.out","w",stdout);
    scanf("%ld",&n);
    build(1,n);
    for(i=1;i<=n;i++){
        scanf("%ld",&a[i]);
        if(i!=1)
            change(1,n,i-1,abs(a[i-1]-a[i]));
    }
    change(1,n,n,a[n]);
    scanf("%ld",&m);
    for(i=1;i<=m;i++){
        scanf("%ld%ld%ld",&x,&y,&z);
        if(!x){
            a[y]=z;
            change(1,n,y-1,abs(a[y-1]-a[y]));
            change(1,n,y,abs(a[y]-a[y+1]));
        }else
            printf("%ld\n",query(1,n,y,z-1));
    }
    return 0;
}
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在 IT 领域,文档格式转换是常见需求,尤其在处理多种文件类型时。本文将聚焦于利用 Java 技术栈,尤其是 Apache POI 和 iTextPDF 库,实现 doc、xls(涵盖 Excel 2003 及 Excel 2007+)以及 txt、图片等格式文件向 PDF 的转换,并实现在线浏览功能。 先从 Apache POI 说起,它是一个强大的 Java 库,专注于处理 Microsoft Office 格式文件,比如 doc 和 xls。Apache POI 提供了 HSSF 和 XSSF 两个 API,其中 HSSF 用于读写老版本的 BIFF8 格式(Excel 97-2003),XSSF 则针对新的 XML 格式(Excel 2007+)。这两个 API 均具备读取和写入工作表、单元格、公式、样式等功能。读取 Excel 文件时,可通过创建 HSSFWorkbook 或 XSSFWorkbook 对象来打开相应格式的文件,进而遍历工作簿中的每个 Sheet,获取行和列数据。写入 Excel 文件时,创建新的 Workbook 对象,添加 Sheet、Row 和 Cell,即可构建新 Excel 文件。 再看 iTextPDF,它是一个用于生成和修改 PDF 文档的 Java 库,拥有丰富的 API。创建 PDF 文档时,借助 Document 对象,可定义页面尺寸、边距等属性来定制 PDF 外观。添加内容方面,可使用 Paragraph、List、Table 等元素将文本、列表和表格加入 PDF,图片可通过 Image 类加载插入。iTextPDF 支持多种字体和样式,可设置文本颜色、大小、样式等。此外,iTextPDF 的 TextRenderer 类能将 HTML、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值