HDU 6406 Taotao Picks Apples 线段树维护
题意:给个T,T组数据;
每组给个n,m;n个数,m个操作;
(对序列的操作是,一开始假设你手上东西是-INF,到i=1时拿起1,之后遍历,遇到比手头上的数量大的数时替换(拿到手的算拿走),问最后拿走几个)
每次操作是将p位变为q;问此时序列能拿走几个数;
思路:假设p位变了,不管变大变小,我们都得知道一件事,就是要找到在p之前最长的序列;
因为这个是不变的,可以预处理,所以说我们就在第i位置记录1~i的最大值,和最大取走的数量以及最大数的id,这样就可以知道p-1位置的信息就是1~p-1位置最大的数的信息,O(1)得到;
(如果q比1~p-1最大的数小,那么就将q变为那个最大的数,因为这样我们就可以不用分情况去查询)
之后就是要找到比q大的第一个数,我是用线段树维护的,找比q大的第一个数的位置;找到了之后你就会希望能得到以这个数为起点的最大可取数量,那么我们就要计算出每个位置开始可以得到的最大数量;实现方法就是倒过来遍历那n个数,每次查询i~n里比a[i]大的第一个数的位置cnt,然后假设记录数组为dp,那么就是dp[i]=dp[cnt]+1;没找到的情况就令这个位置为1
以下是代码实现:
#include<bits/stdc++.h>
#define mid ((node[now].l+node[now].r)>>1)
#define Max(a, b) (a>b?a:b)
using namespace std;
typedef long long ll;
const int N=1e5+, INF=0x3f3f3f3f, mod=;
int dp[N];
struct Node{
int num, id, len;
}maxn[N];
int sav[N];
struct No{
int ret;
struct no{
int l, r, maxn;
}node[N<<];
void build(int L, int R, int now){
node[now].l=L;
node[now].r=R;
if(L==R) node[now].maxn=sav[L];
else{
build(L, mid, now<<);
build(mid+, R, now<<^);
node[now].maxn=Max(node[now<<].maxn, node[now<<^].maxn);
}
}
void querymax(int v, int now, int L, int R){
if(node[now].l==node[now].r){
if(node[now].maxn>v) ret=min(ret, node[now].l);
return ;
}
if(node[now].r<=R&&node[now].l>=L){
if(node[now<<].maxn>v){
querymax(v, now<<, L, R);
}else{
querymax(v, now<<^, L, R);
}
return ;
}
if(L<=mid)
querymax(v, now<<, L, R);
if(R>mid)
querymax(v, now<<^, L, R);
}
}tree;
int main( ){
int T, m, n, p, q;
register int i, j, k, ans, cnt, sav1;
scanf("%d", &T);
while(T--){
scanf("%d%d", &n, &m);
for(i=; i<=n; ++i){
scanf("%d", sav+i);
if(maxn[i-].num<sav[i]){
maxn[i].num=sav[i];
maxn[i].id=i;
maxn[i].len=maxn[i-].len+;
}else{
maxn[i]=maxn[i-];
}
dp[i]=;
}
tree.build(, n, );
for(i=n; i>; --i){
tree.ret=n+;
tree.querymax(sav[i], , i, n);
cnt=tree.ret;
if(cnt>n)
cnt=;
dp[i]=dp[cnt]+;
}
while(m--){
sav1=ans=;
scanf("%d%d", &p, &q);
if(p==){
tree.ret=n+;
tree.querymax(q, , p+, n);
cnt=tree.ret;
if(cnt<=n) printf("%d\n", dp[cnt]+);
else puts("");
continue;
}
ans=maxn[p-].len;
if(q>maxn[p-].num){
++ans;
}else{
q=maxn[p-].num;
}
tree.ret=n+;
tree.querymax(q, , p+, n);
cnt=tree.ret;
if(cnt<=n)
ans+=dp[cnt];
printf("%d\n", ans);
}
}
}
拙略的代码
HDU 6406 Taotao Picks Apples 线段树维护的更多相关文章
- hdu 6406 Taotao Picks Apples 线段树 单点更新
Taotao Picks Apples Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Ot ...
- 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 ...
- HDU 6406 Taotao Picks Apples & FJUT3592 做完其他题后才能做的题(线段树)题解
题意(FJUT翻译HDU): 钱陶陶家门前有一棵苹果树. 秋天来了,树上的n个苹果成熟了,淘淘会去采摘这些苹果. 到园子里摘苹果时,淘淘将这些苹果从第一个苹果扫到最后一个. 如果当前的苹果是第一个苹果 ...
- hdu 6406 Taotao Picks Apples (2018 Multi-University Training Contest 8 1010)(二分,前缀和)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6406 思路: 暴力,预处理三个前缀和:[1,n]桃子会被摘掉,1到当前点的最大值,1到当前点被摘掉的桃子的 ...
- HDU - 6406 Taotao Picks Apples (RMQ+dp+二分)
题意:N个高度为hi的果子,摘果子的个数是从位置1开始从左到右的严格递增子序列的个数.有M次操作,每次操作对初始序列修改位置p的果子高度为q.每次操作后输出修改后能摘到得数目. 分析:将序列分为左.右 ...
- HDU.5692 Snacks ( DFS序 线段树维护最大值 )
HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...
- hdu6406 Taotao Picks Apples(线段树)
Taotao Picks Apples 题目传送门 解题思路 建立一颗线段树,维护当前区间内的最大值maxx和可摘取的苹果数num.最大值很容易维护,主要是可摘取的苹果数怎么合并.合并左右孩子时,左孩 ...
- hdu 5068 线段树维护矩阵乘积
http://acm.hdu.edu.cn/showproblem.php?pid=5068 题意给的略不清晰 m个询问:从i层去j层的方法数(求连段乘积)或者修改从x层y门和x+1层z门的状态反转( ...
随机推荐
- [2017BUAA软工助教]团队beta得分总表
一.累计得分 项目 α例会 α发布 α测试 α展示 α事后 合计 满分 50 10 10 150 10 230 hotcode5 50 10 9 150 9 228 弗朗明哥舞步 50 10 8 13 ...
- web框架-Struts开始
问题: 为什么有structs 作为一种框架(frameset)可以与传统的mvc进行比较? MVC是一种模式数据处理.显示和数据输入分开,来规范开发,但是却又并不规范.可以这样想:有三家公司,他们对 ...
- RocketMQ 事务消息
RocketMQ 事务消息在实现上充分利用了 RocketMQ 本身机制,在实现零依赖的基础上,同样实现了高性能.可扩展.全异步等一系列特性. 在具体实现上,RocketMQ 通过使用 Half To ...
- 重启Hbase命令
注意先启动hadoop,记得重启zookeeper. 具体操作如下: cd hadoop-2.7.4/sbin/ && ./stop-all.sh && ./start ...
- 初识elasticsearch_2(查询和整合springboot)
初始化 首先将官网所下载的json文件,放入到es中,采用如下命令: curl -H "Content-Type: application/json" -XPOST 'localh ...
- 【刷题】LOJ 6001 「网络流 24 题」太空飞行计划
题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合 \(E = \{ E_1, E_2, \cdots, E_m ...
- STEM 是个怎样高大上的东西?
近几年来,STEM 教育概念传入中国,并且越来越多地成为家长及教育机构关注的焦点. STEM教育概念同时成为了各大小教育机构及公司宣传造势的赚钱工具,可家长.学生.老师们真的理解究竟何为 STEM/S ...
- 沉迷AC自动机无法自拔之:[UVALive 4126] Password Suspects
图片加载可能有点慢,请跳过题面先看题解,谢谢 一看到这么多模式串就非常兴奋,又是\(AC\)自动机 题目就是要求:经过 \(n\) 个节点,把所有单词都遍历一遍的方案数,和那道题差不多嘛 所以这样设: ...
- bzoj1018/luogu4246 堵塞的交通 (线段树)
对于一个区间四个角的点,可以用线段树记下来它们两两的联通情况 区间[l,r]通过两个子区间[l,m],[m+1,r]来更新,相当于合并[l,m],[m+1,r],用(m,m+1)这条边来合并 查询a, ...
- 【hdu3709】 Balanced Number
http://acm.hdu.edu.cn/showproblem.php?pid=3709 (题目链接) 题意 求范围${[a,b]}$之间的平衡数的个数,所谓平衡数就是以某一位为支点,两侧的力矩相 ...