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地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两 ...
随机推荐
- CString中Format函数与格式输入与输出
CString中Format函数与格式输入与输出 Format是一个非经常常使用.却又似乎非常烦的方法,下面是它的完整概貌.以供大家查询之用: 格式化字符串forma("%d" ...
- 使用多字节字符集的跨平台(PC、Android、IOS、WP)编码/解码方法
随着移动端的发展,跨平台已成为通讯架构设计的重要考虑因素,PC.Android.IOS.WP等跨多平台间的数据通讯,必然要解决字符编码/解码的问题. 多字节字符集MBCS不是跨平台的首选字符集,面向跨 ...
- 打开office提示还有几天过期的处理办法
是多重激活了,把激活码失效的删除即可 1.以管理员权限打开cmd(必须以管理员权限,不然无法删除无效的激活码) 2.输入命令:cd C:\Program Files (x86)\Microsoft O ...
- 公众号的TOKEN配置PHP代码
1.在后台添加好URL和TOKEN和生成43位随机码 注意域名URL需要备案 2.上传到服务器 3.公众号后台要点提交即可 error_reporting(0); $signature=$_REQU ...
- vim列编辑模式快捷键
vi/vim编辑器 多行行首插入 1 在多行行首插入,在nomal模式下按下ctrl+v,然后进行选择(如果想要选择至文件结尾,则再按G) 2 选择好以后按大写的I,则光标会自动跳转到所选择行的第 ...
- C/C++:C++伪函数
C++伪函数: 所谓的伪函数.就是说它不是一个真正的函数,而是一个类或者说是一个结构体. <span style="font-size:18px;"> #include ...
- PL/SQL developer连接oracle出现“ORA-12154:TNS:could not resolve the connect identifier specified”问题的解决
转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/50728536 本文出自[我是干勾鱼的博客] 使用PL/SQL developer ...
- visual studio 2013 触发挂起事件
在 VS2013 中调试 winddows phone 或者 win rt 程序的时候,需要手动触发 “挂起” 事件. 如果找不到这个按钮: 1.打开菜单栏中的 “自定义” 对话框: 2.选择调试位置 ...
- 调用半截的div
不能引用jquery: <script src="${rootUrl }js/jquery/jquery.js" type="text/javascript&quo ...
- 时钟.html
<!DOCTYPE html><html charset="utf-8"> <head> <title>时钟</title&g ...