Codevs 5914 [SXOI2016]最大值


70分算法+30分打表
#include<ctime>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define lc k<<1
#define rc k<<1|1
#define EF if(ch==EOF) return x;
using namespace std;
const int N=1e5+;
const int inf=2e9;
typedef long long ll;
int n,Q,ans,a[N],mx[N];
ll sum[N<<];bool tag[N<<];
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;EF;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void build(int k,int l,int r){
if(l==r){
sum[k]=mx[l];
return ;
}
int mid=l+r>>;
build(lc,l,mid);
build(rc,mid+,r);
sum[k]=sum[lc]+sum[rc];
}
void pushdown(int k,int l,int r){
if(!tag[k]||l==r) return ;
int mid=l+r>>;
sum[lc]=sum[k]/(r-l+)*(mid-l+);
sum[rc]=sum[k]/(r-l+)*(r-mid);
tag[lc]=tag[rc]=;tag[k]=;
}
void change(int k,int l,int r,int x,int y,int v){
if(l==x&&r==y){
sum[k]=1LL*(r-l+)*v;
tag[k]=;
return ;
}
pushdown(k,l,r);
int mid=l+r>>;
if(y<=mid) change(lc,l,mid,x,y,v);
else if(x>mid) change(rc,mid+,r,x,y,v);
else change(lc,l,mid,x,mid,v),change(rc,mid+,r,mid+,y,v);
sum[k]=sum[lc]+sum[rc];
}
ll query(int k,int l,int r,int p){
if(l==r) return sum[k];
pushdown(k,l,r);
int mid=l+r>>;
if(p<=mid) return query(lc,l,mid,p);
else return query(rc,mid+,r,p);
// sum[k]=sum[lc]+sum[rc];
}
void ord(){
int Max=-inf;ans=;
for(int j=;j<=n;j++){
Max=max(Max,a[j]);
ans+=Max;
}
printf("%d\n",ans);
for(int i=,x,y;i<=Q;i++){
x=read();y=read();
a[x]+=y;
int Max=-inf;ans=;
for(int j=;j<=n;j++){
Max=max(Max,a[j]);
ans+=Max;
}
printf("%d\n",ans);
}
}
int main(){
n=read();
for(int i=;i<=n;i++) a[i]=read();Q=read();
if(n<=){
ord();
return ;
}
mx[]=-inf;
for(int i=;i<=n;i++) mx[i]=max(mx[i-],a[i]);
build(,,n);printf("%I64d\n",sum[]);
for(int i=,x,y;i<=Q;i++){
x=read();y=read();
a[x]+=y;
int l=x,r=n,pos=;
while(l<=r){
int mid=l+r>>;
if(query(,,n,mid)<a[x]) l=mid+,pos=mid;
else r=mid-;
}
if(pos) change(,,n,x,pos,a[x]);
printf("%I64d\n",sum[]);
}
return ;
}
如果你会线段树log^2求单调栈的话..此题可做
你考虑。。
维护每个区间的答案
以及一个看似暴力的询问函数(x,y)
表示从x节点出发 左边max是y的答案
然后你会发现每次只需要递归到一侧
就log^2了
对啊……好像是维护斜率啥的吧……
不是斜率
讨论最大值的来源
是这样的
对于x
左边最大值是y
如果你发现x左儿子最大值<=y
那么显然没有递归左儿子的必要
否则递归完左儿子后,右儿子的答案与y无关
因为变成了x左儿子的最大值
这个通过线段树之前维护的信息就可以知道
每次都只会递归一侧
不管是查询还是信息合并都用这个logn的函数就好了
线段树维护的是什么呀?
区间最大值
以及区间的答案
可以参考:上帝之手
Codevs 5914 [SXOI2016]最大值的更多相关文章
- codevs 3289 花匠
题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1052 地鼠游戏
1052 地鼠游戏 http://codevs.cn/problem/1052/ 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不 ...
- codevs 1245 最小的N个和
1245 最小的N个和 http://codevs.cn/problem/1245/ 题目描述 Description 有两个长度为 N 的序列 A 和 B,在 A 和 B 中各任取一个数可以得到 N ...
- [题解]vijos & codevs 能量项链
a { text-decoration: none; font-family: "comic sans ms" } .math { color: gray; font-family ...
- Codevs 1021 (玛丽卡)
题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...
- 求最大边/最小边的比值最小的路径 codevs 1001 舒适的路线
codevs 1001 舒适的路线 2006年 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Z小镇是一个景色宜人 ...
- codevs 1051 接龙游戏
codevs 1051 接龙游戏 http://codevs.cn/problem/1051/ 题目描述 Description 给出了N个单词,已经按长度排好了序.如果某单词i是某单词j的前缀,i- ...
- CODEVS 1817 灾后重建 Label:Floyd || 最短瓶颈路
描述 灾后重建(rebuild) B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两 ...
随机推荐
- 使用zlib模块实现HTTP服务端与客户端实现传输数据压缩
现如今在处理http请求的时候,由于请求的资源较多,如果不启用压缩的话,那么页面请求的流量将会非常大.启用gzip压缩,在一定程度上会大大的提高页面性能. 因此这写一个使用Node.js实现在http ...
- Linux更改Apache网站目录出错:Document root must be a directory解决
Linux更改Apache网站目录出错:Document root must be a directory解决 修改 DocumentRoot <Directory " ...
- mybatis的#和$的差别
在项目中假设使用mybatis保存形如"1,2,3"这种字符串.你须要使用"#"号取值.假设使用$符号会报错, 假设是查询形如"id in (1,2, ...
- 禁止apache显示目录索引 apache禁止列目录
禁止Apache显示目录索引的常见的3种方法. 要实现禁止Apache显示目录索引,只需将Option中的Indexes去掉即可. 禁止Apache显示目录索引,禁止Apache显示目录结构列表,禁止 ...
- COM方式实现C++调用C#代码的一些总结
首先这个测试没成功,只在本机上可行,在不同机器上测试失败.可能是GUID不对或者没注册成功. 既然已经花了一上午时间去研究,还是总结一下 1.网上说要创建一个snk证书,但不创建也可以.只不过不能放入 ...
- 关于 initWithNibName 和 loadNibNamed 的区别和联系-iPhone成长之路
转自:http://blog.sina.com.cn/s/blog_7b9d64af01018f2u.html 关于 initWithNibName 和 loadNibNamed 的区别和联系.之所以 ...
- action(四)
void ActionDelayTime::onEnter() { ActionsDemo::onEnter(); alignSpritesLeft(); CCActionInterval* move ...
- vue 和ng的区别
vue: 读音: v-u-e view vue到底是什么? 一个mvvm框架(库).和angular类似 比较容易上手.小巧 mvc: ...
- layui的点击table行选中复选框
$(document).on("click",".layui-table-body table.layui-table tbody tr",function() ...
- A+P+M+W
安装之前先做个目录的安排, D盘根目录建立”Dev”文件夹,在文件夹下建立: Php Apache Mysql 三个文件夹 所需软件: 0. 安装Apache的前必须安装VC11 vcredis ...