hdu 6406 Taotao Picks Apples 线段树 单点更新
Taotao Picks Apples
Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 2506 Accepted Submission(s): 786
When Taotao picks apples, Taotao scans these apples from the first one to the last one. If the current apple is the first apple, or it is strictly higher than the previously picked one, then Taotao will pick this apple; otherwise, he will not pick.
Given the heights of these apples h1,h2,⋯,hn, you are required to answer some independent queries. Each query is two integers p,q, which asks the number of apples Taotao would pick, if the height of the p-th apple were q (instead of hp). Can you answer all these queries?
Each test case begins with a line of two integers n,m (1≤n,m≤105), denoting the number of apples and the number of queries. It is then followed by a single line of n integers h1,h2,⋯,hn (1≤hi≤109), denoting the heights of the apples. The next m lines give the queries. Each of these m lines contains two integers p (1≤p≤n) and q (1≤q≤109), as described in the problem statement.
给你长度为n的序列, 然后从位置1,寻找单调栈的最大长度
然后修改 v[pos] = val, 再求 单调栈的最大长度
但是队友说是单调栈 ,我就用线段树维护了个单调栈,但是我维护的好像有些SB,就是每次左区间的最大值+(用单调栈跑一次最大长度)
然后完美的T了 ,然后就没管这道题了
后来看了一个人的题解,是这样子分析的
对于每一个区间, 贡献只能从左区间 + 右区间的部分选择
然后 考虑: 两种情况 ,如果 右区间的最大值 <= 左区间最大值,那么右区间肯定没有贡献,为0
然后考虑 :如果右区间的最大值 > 左区间最大值,那么问题可以递归 右区间的左儿子 和 右儿子的情况
这样的复杂度 大概是T*m*logn*logn (单点更新val值一个log 然后每次 合并区间的时候又要一个log)
#include <bits/stdc++.h>
using namespace std; const int N = 1e5+;
#define ls rt<<1
#define rs rt<<1|1 int mx[N<<],cnt[N<<]; int query(int rt,int l,int r,int v) {
if(l==r) return mx[rt] > v;
if(mx[rt] <= v) return ;
int m = (l+r)>>;
if(mx[ls] <= v) return query(rs,m+,r,v);
else return cnt[rt]-cnt[ls]+query(ls,l,m,v);
}
int n,m,v[N];
void build(int rt,int l,int r) {
mx[rt] = cnt[rt] =;
if(l == r) {
mx[rt]=v[l]; cnt[rt]=;
return ;
}
int m=(l+r)>>;
build(ls,l,m);
build(rs,m+,r);
mx[rt]=max(mx[ls], mx[rs]);
cnt[rt] = cnt[ls] + query(rs,m+,r,mx[ls]);
} void update(int rt,int l,int r,int pos,int val) {
if(l==r && l == pos) {
mx[rt]=val;
cnt[rt] = ;
return ;
}
int m = (l+r)>>;
if(pos <= m)
update(ls,l,m,pos,val);
else
update(rs,m+,r,pos,val);
mx[rt]=max(mx[ls], mx[rs]);
cnt[rt] = cnt[ls] + query(rs,m+,r,mx[ls]);
} int main() {
//freopen("in.txt","r",stdin);
int T; scanf("%d",&T);
while (T--) {
scanf("%d %d", &n, &m);
for(int i=;i<=n;i++)
scanf("%d",&v[i]);
build(,,n);
while (m--) {
int pos, val;
scanf("%d %d",&pos,&val);
//pos位置 更新成val
update(,,n,pos,val);
printf("%d\n",cnt[]);
//还原
update(,,n,pos,v[pos]);
}
}
return ;
}
hdu 6406 Taotao Picks Apples 线段树 单点更新的更多相关文章
- HDU 6406 Taotao Picks Apples 线段树维护
题意:给个T,T组数据: 每组给个n,m:n个数,m个操作: (对序列的操作是,一开始假设你手上东西是-INF,到i=1时拿起1,之后遍历,遇到比手头上的数量大的数时替换(拿到手的算拿走),问最后拿走 ...
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
- HDU 1166 敌兵布阵(线段树单点更新,板子题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1754 I Hate It 线段树单点更新求最大值
题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...
- HDU 1166 敌兵布阵(线段树单点更新)
敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...
- HDU 1166 敌兵布阵(线段树单点更新,区间查询)
描述 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况 ...
- hdu 6406 Taotao Picks Apples (线段树)
Problem Description There is an apple tree in front of Taotao's house. When autumn comes, n apples o ...
- [乱搞]hdu 6406 Taotao picks apples 笛卡尔树+倍增
题目链接 Problem Description There is an apple tree in front of Taotao's house. When autumn comes, n app ...
随机推荐
- oracle(一)复习起航
住了三年的宿舍,前几天不得不搬走.也断了好几天网,所以顺手拿了本以前买的<oracle编程艺术>,感觉翻译的书就是有些地方读起来不通顺,好吃力. 还好以前有点oracle经验,不然真看不懂 ...
- Idempotent --------幂等
1.在某二元运算下,幂等元素是指被自己重复运算的结果等于它自己的元素.例如,乘法下唯一两个幂等实数为0和1.
- mysql 内置功能 存储过程介绍
存储过程介绍 就是mysql内置功能把逻辑写好 的功能给封装好,封装成一个接口名,把接口名丢给应用程序,应用程序直接调用接口名实现一系列增删改查功能 这个接口叫存储过程 基于存储过程封装成一个功能 存 ...
- Andrew Ng-ML-第九&十章-神经网络
1.神经网络模型1 图1 这是一个神经网络的模型,通常设置一个x0,作为偏执单元或者偏置(bias)神经元. 图2 这里最后一句话,说的是系数矩阵θ,神经网络模型中,如果当前在j层有s_j个单元,在j ...
- Groovy介绍
关于 Groovy 这一节将学习 Groovy 的基础知识:它是什么,它与 Java 语言和 JVM 的关系,以及编写 Groovy 代码的一些要点. 一.什么是 Groovy? Groovy 是 J ...
- Selenium - Xpath 使用方法
由于最新版火狐不在支持FireBug等开发工具,可以通过https://ftp.mozilla.org/pub/firefox/releases/下载49版本以下的火狐就可以增加Firebug等扩展了 ...
- C#可扩展数组转变为String[]数组
简单备忘: 由于需要将数据最终以逗号隔开来拼接,因而写了下面的处理方法. public void GetJoinString() { ArrayList arr = new ArrayList(); ...
- 机器学习 python库 介绍
开源机器学习库介绍 MLlib in Apache Spark:Spark下的分布式机器学习库.官网 scikit-learn:基于SciPy的机器学习模块.官网 LibRec:一个专注于推荐算法的j ...
- 用python实现一个简单的socket网络聊天通讯 (Linux --py2.7平台与windows--py3.6平台)
windows --> windows 写法均在py3.6 客户端写法 import socket client = socket.socket() client.connect(('192 ...
- VS2010/MFC编程入门之三十六(工具栏:工具栏资源及CToolBar类)
上一节中鸡啄米讲了菜单及CMenu类的使用,这一节讲与菜单有密切联系的工具栏. 工具栏简介 工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成.当用户用鼠标单击工具栏上某个按钮时,程 ...