JZOJ.5236【NOIP2017模拟8.7】利普希茨
Description
Input
第一行一个整数n。
接下来一行n个整数,描述序列A。
第三行一个数q 。
接下来q行,每行三个整数。其中第一个整数type表示操作的类型。 type=0对应修改操作, type=1对应查询操作。
Output
对于每个查询,给出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
对于60%的数据,n,q<=5000
对于100%的数据,n,q<=100000,0<=ai,val<=10^9
这里有一个结论:f(A)的最大值是相邻的两点的差值。
我们可以设想一下,一个区间被里面min和max分成了三段,其中i=min,j=max,那么设对应的f(A)的值为a,
那么我们可以枚举里面的左端点i右端点j来计算f(A)的值与a比较
首先很肯定的一点 区间[i,j]不能跨过min和max,那么我们会对这三段区间不断细分,到最后也就只剩下相邻的两个点了,此时就是最大值和最小值(这个似乎不能证明)
还有个几何证明:f(A)可以看成一个斜率的绝对值,那么对于坐标上的三个点a,b,c来说,它们三点确定的直线中,很显然横坐标越靠近的两个点斜率会越大

(转自mcw的证明)令$\Delta_i=A_{i+1}-A_i$,则$\left\lceil\frac{|A_j-A_i|}{j-i}\right\rceil=\left\lceil\frac{|\sum_{k=i}^{j-1}\Delta_k|}{j-i}\right\rceil=\overline{\Delta_{i\,..\,j-1}}$,显然会有$\Delta_i\,..\,\Delta_{j-1}$中的一项大于等于$\overline{\Delta_{i\,..\,j-1}}$
所以这题就变成了维护差值的修改和最值了,线段树就可以了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
int maxx[],n,q,a[],x,l,r,d[];
void buildtree(int root,int l,int r){
if (l==r) {maxx[root]=d[l]; return;}
int mid=(l+r)>>;
buildtree(root<<,l,mid);
buildtree(root<<|,mid+,r);
maxx[root]=max(abs(maxx[root<<]),abs(maxx[root<<|]));
}
void change(int root,int l,int r,int x,int c){
if (l==r){
maxx[root]+=c;
return;
}
int mid=(l+r)>>;
if (x<=mid) change(root<<,l,mid,x,c);
if (x>mid) change(root<<|,mid+,r,x,c);
maxx[root]=max(abs(maxx[root<<]),abs(maxx[root<<|]));
}
int get(int root,int l,int r,int x,int y){
if ((x<=l)&&(y>=r)) return abs(maxx[root]);
int ans=;
int mid=(l+r)>>;
if (x<=mid) ans=max(ans,get(root<<,l,mid,x,y));
if (y>mid) ans=max(ans,get(root<<|,mid+,r,x,y));
return ans;
}
int main(){
freopen("lipschitz.in","r",stdin);
freopen("lipschitz.out","w",stdout);
scanf("%d",&n);
for (int i=;i<=n;i++){
scanf("%d",&a[i]);
d[i]=a[i]-a[i-];
}
buildtree(,,n);
scanf("%d",&q);
while (q--){
scanf("%d%d%d",&x,&l,&r);
if (x==) {change(,,n,l,r-a[l]);change(,,n,l+,-r+a[l]); a[l]=r;}
if (x==) printf("%d\n",get(,,n,l+,r));
}
return ;
}
神奇的代码
数学很重要
JZOJ.5236【NOIP2017模拟8.7】利普希茨的更多相关文章
- JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨
5236. [NOIP2017模拟8.7A组]利普希茨 (File IO): input:lipschitz.in output:lipschitz.out Time Limits: 1000 ms ...
- [jzoj 5343] [NOIP2017模拟9.3A组] 健美猫 解题报告 (差分)
题目链接: http://172.16.0.132/senior/#main/show/5343 题目: 题解: 记旋转i次之后的答案为$ans_i$,分别考虑每个元素对ans数组的贡献 若$s_i& ...
- JZOJ 【NOIP2017提高A组模拟9.14】捕老鼠
JZOJ [NOIP2017提高A组模拟9.14]捕老鼠 题目 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕 ...
- JZOJ 5246. 【NOIP2017模拟8.8A组】Trip(trip)
5246. [NOIP2017模拟8.8A组]Trip(trip) (File IO): input:trip.in output:trip.out Time Limits: 1500 ms Memo ...
- JZOJ 5235. 【NOIP2017模拟8.7A组】好的排列
5235. [NOIP2017模拟8.7A组]好的排列 (File IO): input:permutation.in output:permutation.out Time Limits: 1000 ...
- JZOJ 5230. 【NOIP2017模拟A组模拟8.5】队伍统计
5230. [NOIP2017模拟A组模拟8.5]队伍统计 (File IO): input:count.in output:count.out Time Limits: 1500 ms Memory ...
- JZOJ【NOIP2013模拟联考14】隐藏指令
JZOJ[NOIP2013模拟联考14]隐藏指令 题目 Description 在d维欧几里得空间中,指令是一个长度为2N的串.串的每一个元素为d个正交基的方向及反方向之一.例如,d = 1时(数轴) ...
- JZOJ.5281【NOIP2017模拟8.15】钦点
Description
- [jzoj 5178] [NOIP2017提高组模拟6.28] So many prefix? 解题报告(KMP+DP)
题目链接: https://jzoj.net/senior/#main/show/5178 题目: 题解: 我们定义$f[pos]$表示以位置pos为后缀的字符串对答案的贡献,答案就是$\sum_{i ...
随机推荐
- CodeIgniter 无法上传 CSV 文件
本篇文章由:http://xinpure.com/codeigniter-unable-to-upload-a-csv-file/ 解决 CodeIgniter 中使用 Upload 类无法上传 CS ...
- Cocos2d-x开发---关于安卓打包所遇到的错误记录
非常久都没有在安卓打过包了.之前的项目因为某些问题没有考虑做安卓版本号,所以涉及到安卓打包的时候都是自己在折腾. 这段时间离职了,空余时间就有非常多了.所以我能够折腾点事了.想起来 ...
- jquery的onclick(this)方法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Java并发编程(四):线程安全性
一.定义 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 二.线程安 ...
- 纯CSS3实现一个旋转的3D立方体盒子
简单介绍 上网易前端微专业课程,里面有一个课外作业是实现一个3D旋转立方体.花了点时间做了下.还有点意思.写个简单教程.供大家学习. 先放上终于要实现的效果 注:代码在chrome 43.0.2357 ...
- linux学习笔记23--时间命令date和cal
在linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用到时间的运算,熟练运用date命令来表示自己想要表示的时间,肯定可以给自己的工作带来诸多方便. 1.命令格式: date [参数 ...
- redis 优缺点 使用场景
1. 使用redis有哪些好处? (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) (2) 支持丰富数据类型,支持string,li ...
- 远程访问Mysql的解决方案
在网上有很多关于这个的解决方案,我也采用了 写的比较详细的如:1. 改表法. 可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更 ...
- Linux平台使用Freetds连接SQL Server服务器,兼容PHP和Laravel
本文在CentOS 7 64bit和Laravel 4.2环境测试通过. 1.下载源码并解压缩 wget ftp://ftp.freetds.org/pub/freetds/stable/free ...
- C. Beautiful Numbers
C. Beautiful Numbers Time Limit : 4000/2000ms (Java/Other) Memory Limit : 524288/262144K (Java/Oth ...