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

news/2024/11/24 1:49:36/

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 100010struct 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);elsechange(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]));}elseprintf("%ld\n",query(1,n,y,z-1));}return 0;
}

http://www.ppmy.cn/news/165458.html

相关文章

[jzoj5236]【NOIP2017模拟8.7A组】利普希茨

这道像数据结构的结论题传送门 我觉得这断不能怪我 一上来给出操作种类和 Log 形式的数据范围有如套路一般 Solution 60p 容易想到分治 对于整个序列&#xff0c;可以割作三份&#xff0c;分界点为最大值和最小值 因为 如果有一个 (i,j) 跨过了 分界点 k 那么 (i,k)|…

【贪心】hdu5236

题意 DRD经常使用一个文本处理软件&#xff0c;这个软件每输入一个字符就有一定的概率(p)崩溃&#xff0c;并且丢失上次保存之后的所有数据。执行一次保存需要x字符的代价&#xff08;但是不会崩溃&#xff09;问在最优策略下&#xff0c;输入字符的期望是多少 做法 一开始想到…

HDU5236 Article(期望dp)

Article 传送门1传送门2 As the term is going to end, DRD begins to write his final article. DRD uses the famous Macrohard’s software, World, to write his article. Unfortunately this software is rather unstable, and it always crashes. DRD needs to write…

英韧IG5236开卡工具的量产使用教程,IG5236固态开卡简单过程

英韧IG5236固态开卡工具是一款用于量产的工具&#xff0c;可以帮助用户快速对固态硬盘进行开卡&#xff0c;提高生产效率。本教程将详细介绍如何使用IG5236固态开卡工具进行量产。 第一步&#xff1a;准备工作 首先&#xff0c;需要准备好以下材料&#xff1a; 1. IG5236固态…

HDU 5236 Article(概率DP)

http://acm.hdu.edu.cn/showproblem.php?pid5236 题意&#xff1a;现在有人要在文本编辑器中输入n个字符&#xff0c;然而这个编辑器有点问题。 在i0.1s&#xff08;i>0&#xff09;的时刻可以输入一个字符。 在i0.9s&#xff08;i>0&#xff09;的时刻系统可能会崩溃&a…

Article HDU - 5236(概率DP)

题目 https://cn.vjudge.net/problem/HDU-5236 题意 一个打字机 在打完一个字后会有p概率坏掉&#xff0c;只能保留之前保存的&#xff0c;保存需要x秒并且期间打字机不会坏掉 问一个人打n个字采取什么策略需要的时间期望最小是多少 思路 期望DP dp[i] (dp[i-1] 1) / (…

概率dp hdu 5236

说好听一点又一次的涨姿势了&#xff0c;说难听一点又被虐的体无完肤。 感觉这道题难&#xff0c;首先连题目样例都没读懂。 算了直接上代码。 #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<iostream> #in…

Jzoj5236 利普希茨

对于一个整数序列A&#xff0c;我们定义f(A)max{floor(|Ai-Aj|/(j-i))}&#xff0c;这里i<j 给出一个长度为n的序列A&#xff0c;有q此操作 1.修改一个元素的值 2.询问A的一段区间[l,r]组成的序列的f(A[l..r]) 这里有一个很显然的结论&#xff0c;那就是使得f取到最大的i,j一…