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]最大值的更多相关文章

  1. codevs 3289 花匠

    题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...

  2. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  3. codevs 1052 地鼠游戏

    1052 地鼠游戏 http://codevs.cn/problem/1052/ 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不 ...

  4. codevs 1245 最小的N个和

    1245 最小的N个和 http://codevs.cn/problem/1245/ 题目描述 Description 有两个长度为 N 的序列 A 和 B,在 A 和 B 中各任取一个数可以得到 N ...

  5. [题解]vijos & codevs 能量项链

    a { text-decoration: none; font-family: "comic sans ms" } .math { color: gray; font-family ...

  6. Codevs 1021 (玛丽卡)

    题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...

  7. 求最大边/最小边的比值最小的路径 codevs 1001 舒适的路线

    codevs 1001 舒适的路线 2006年  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description Z小镇是一个景色宜人 ...

  8. codevs 1051 接龙游戏

    codevs 1051 接龙游戏 http://codevs.cn/problem/1051/ 题目描述 Description 给出了N个单词,已经按长度排好了序.如果某单词i是某单词j的前缀,i- ...

  9. CODEVS 1817 灾后重建 Label:Floyd || 最短瓶颈路

    描述 灾后重建(rebuild)  B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两 ...

随机推荐

  1. Python操作redis系列以 哈希(Hash)命令详解(四)

    # -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1. Hset 命令用于 ...

  2. MySQL多线程同步-Transfer使用测试

    由淘宝核心系统研发—数据库组开发的MySQL-Transfer,用于解决MySQL主从同步延迟的问题,从MySQL单线程到多线程的工作模式.可以观看@丁奇的相关资料: MySQL多线程同步-Trans ...

  3. html使用自我知识点总结

    1. 不要忘结束标签 <p>This is a paragraph <p>This is a paragraph 未来的HTML版本号不同意省略结束标签. 2. 没有内容的HT ...

  4. linux命令汇总1

    允许非root用户使用“sudo” root身份登录系统,执行“visudo”,根据示例添加新的一个规则(记住输入的密码是当前用户密码,而不是root密码)#不需要密码执行sudo命令hadoop   ...

  5. MFS排错

    [root@Nginx_Master mfs]# /app/server/mfs/sbin/mfsmaster start working directory: /app/server/mfs/var ...

  6. JAVA多线程之synchronized和volatile实例讲解

    在多线程中,提到线程安全.线程同步,我们经常会想到两个关键字:volatile和synchronized,那么这两者有什么区别呢? 1. volatile修饰的变量具有可见性 volatile是变量修 ...

  7. C#大小写字母转换函数

    ToUpper:小写转大写ToLower:大写转小写 例如: string A="aasiDi778=AA"; string B=""; B=A.ToUpper ...

  8. php代码检查

    最近写php,几个同事都是没写过c的,经常写的变量没有定义,而php没有编译,错误无法发现. 我们现在用的是NetBeans,好在其提供了语法检测,如下图,让编辑器强制显示我错误

  9. [Application]Ctrl+C终止程序代码

    代码如下: #include <stdio.h> #include <stdlib.h> #include <iostream> #include <sign ...

  10. const成员或者引用成员必须使用构造函数初始化列表的方式

    #include<iostream.h> class A { const int a; int b; }; void main() { A obja; }编译出现如下错误:error C2 ...