利普希茨【NOIP2017模拟8.7A组】
来源:互联网 发布:煤炭行业数据 编辑:程序博客网 时间:2024/06/04 08:21
题目
Input
输入文件名为lipschitz.in。
第一行一个整数n。
接下来一行n个整数,描述序列A。
第三行一个数q 。
接下来q行,每行三个整数。其中第一个整数type表示操作的类型。 type=0对应修改操作, type=1对应查询操作。
Output
输出文件名为lipschitz.out。
对于每个查询,给出f(A[l..r]) 。
Sample Input
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
Sample Output
78
85
Data Constraint
对于30%的数据,n,q<=500
对于60%的数据,n,q<=5000
对于100%的数据,n,q<=100000,0<=ai,val<=10^9
思路
比赛时是猜想应该只和相邻的有关系,不过没时间去证了。
解法
首先能证明出最优答案一定是选择两个相邻的数。
假设三个数a < b < c,a与b间有x个数,b与c之间有y个数。我们令选a,c比选a,b与b,c更优。
选a,b代价为
选a,c代价为
令
则
两个式子一加,发现左边=右边,这就意味着两个式子至少有一项不符合。
所以只需要用一个数组存下相邻两个数的差的绝对值,每次修改是修改两个,维护最大值,用上一些数据结构即可。
时间O(n log n).
代码
#include<cstdio>#include<algorithm>#include<cstring>#include<cstdlib>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;const int maxn=1e5+5;int tree[maxn*4],a[maxn],n,q,ans,b[maxn];void maketree(int p,int l,int r){ if (l==r) tree[p]=b[l]; else { int mid=(l+r)>>1; maketree(p<<1,l,mid); maketree(p<<1|1,mid+1,r); tree[p]=max(tree[p<<1],tree[p<<1|1]); }}void change(int p,int l,int r,int pos,int val){ if (l==r) tree[p]=val; else { int mid=(l+r)>>1; if (pos<=mid) change(p<<1,l,mid,pos,val); else change(p<<1|1,mid+1,r,pos,val); tree[p]=max(tree[p<<1],tree[p<<1|1]); }}int getans(int p,int l,int r,int a,int b){ if (l==a&&r==b) ans=max(ans,tree[p]); else { int mid=(l+r)>>1; if (b<=mid) getans(p<<1,l,mid,a,b); else if (a>mid) getans(p<<1|1,mid+1,r,a,b); else { getans(p<<1,l,mid,a,mid); getans(p<<1|1,mid+1,r,mid+1,b); } }}int main(){ freopen("lipschitz.in","r",stdin); freopen("lipschitz.out","w",stdout); scanf("%d",&n); fo(i,1,n) scanf("%d",&a[i]),b[i-1]=abs(a[i]-a[i-1]); maketree(1,1,n-1); scanf("%d",&q); fo(i,1,q){ int t,x,y; scanf("%d%d%d",&t,&x,&y); if (!t) { a[x]=y; b[x-1]=abs(a[x]-a[x-1]); b[x]=abs(a[x]-a[x+1]); change(1,1,n-1,x-1,b[x-1]); change(1,1,n-1,x,b[x]); } else { ans=0; if (x!=y) getans(1,1,n-1,x,y-1); printf("%d\n",ans); } }}
阅读全文
0 0
- [jzoj5236]【NOIP2017模拟8.7A组】利普希茨
- 利普希茨【NOIP2017模拟8.7A组】
- JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨
- JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨
- JZOJ 5234. 【NOIP2017模拟8.7A组】外星人的路径
- JZOJ5235. 【NOIP2017模拟8.7A组】好的排列
- jzoj5234. 【NOIP2017模拟8.7A组】外星人的路径
- JZOJ 5235. 【NOIP2017模拟8.7A组】好的排列
- JZOJsenior5234.【NOIP2017模拟8.7A组】外星人的路径
- A【NOIP2017提高组模拟12.18】
- 【JZOJ4928】【NOIP2017提高组模拟12.18】A
- 【NOIP2017提高组模拟12.18】A
- 【JZOJ4928】【NOIP2017提高组模拟12.18】A
- 【NOIP2017提高A组模拟7.7】图
- 【NOIP2017提高A组模拟7.13】abcd
- 区间【NOIP2017提高A组模拟7.10】
- 【NOIP2017模拟8.8A组】Trip
- 【NOIP2017模拟8.8A组】Competing Souls
- php神函数之strtotime
- 润乾集算报表应用开发之直接导出Excel/PDF文件
- 1064. Complete Binary Search Tree
- 电脑缺少msvcr110.dll的解决方法汇总
- 防止 e-mail 注入的最好方法是对输入进行验证?
- 利普希茨【NOIP2017模拟8.7A组】
- 前端小白的问题
- UI10-UIView视图添加阴影效果
- 廖雪峰《python3 基础教程》读书笔记——第十章 错误、调试和测试
- Flask知识点汇总(持续更新)
- 如何在 Vivaldi 浏览器中设置 百度 搜索
- PHP MySQL Insert Into
- leetcode--Add Binary
- CSS关于颜色使用的理解(单词、RGB、十六进制)