题意: 有两种操作  一种是单点改为b  一种是给出区间ab  区间ab的最大上升子序列个数。。

线段树目前学了三种  第一种单点操作很简单   第二种区域操作加上懒惰标记即可

现在这种 为区间合并。。。。多看就好了

#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define lson L,m,pos<<1
#define rson m+1,R,pos<<1|1
#define mid m=(L+R)>>1
#define LL long long
int lsum[N<<],rsum[N<<],ssum[N<<],num[N]; void up(int L,int R,int pos)
{
int mid;
lsum[pos]=lsum[pos<<];
rsum[pos]=rsum[pos<<|];
ssum[pos]=max(ssum[pos<<],ssum[pos<<|]);//向上
if(num[m]<num[m+])
{
if(lsum[pos]==(m-L+))lsum[pos]+=lsum[pos<<|];
if(rsum[pos]==(R-m))rsum[pos]+=rsum[pos<<];
ssum[pos]=max(ssum[pos],lsum[pos<<|]+rsum[pos<<] );
}
} void build(int L,int R,int pos)
{
if(L==R)
{
scanf("%d",&num[L]);
lsum[pos]=rsum[pos]=ssum[pos]=;
return ;
}
int mid;
build(lson);
build(rson);
up(L,R,pos);
} void update(int x,int v,int L,int R,int pos)
{
if(L==R)
{
num[L]=v;
return;
}
int mid;
if(x<=m)update(x,v,lson);
else update(x,v,rson);
up(L,R,pos);
}
int query(int l,int r,int L,int R,int pos)
{
if(l<=L&&r>=R)
return ssum[pos];
int mid;
int ans=;
if(l<=m)ans=max(ans,query(l,r,lson));
if(r>m)ans=max(ans,query(l,r,rson));
if(num[m]<num[m+])
ans=max(ans,min(m-l+,rsum[pos<<])+min(r-m,lsum[pos<<|] ));
return ans;
} int main()
{
char s[];
int cas;
scanf("%d",&cas);
while(cas--)
{
int n,q;
scanf("%d%d",&n,&q);
build(,n,);
while(q--)
{
int a,b;
scanf("%s%d%d",s,&a,&b);
if(s[]=='Q')
printf("%d\n",query(a+,b+,,n,));
else
update(a+,b,,n,);
}
}
return ;
}

LCIS hdu3308 (线段树 区间合并)的更多相关文章

  1. HDU3308 线段树区间合并

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 ,简单的线段树区间合并. 线段树的区间合并:一般是要求求最长连续区间,在PushUp()函数中实 ...

  2. (简单) HDU 3308 LCIS,线段树+区间合并。

    Problem Description Given n integers. You have two operations: U A B: replace the Ath number by B. ( ...

  3. LCIS(线段树区间合并)

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  4. hdu 3308 LCIS(线段树区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3308 LCIS Time Limit: 6000/2000 MS (Java/Others)     ...

  5. hdu3308 线段树——区间合并

    更新一个点: 求某个区间的最长连续上升序列: 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 #include <cstdio> #in ...

  6. hdu3308 线段树 区间合并

    给n个数字 U表示第A个数改为B.A是从0开始. Q输出最大的递增序列个数. 考虑左边,右边,和最大的. #include<stdio.h> #define lson l,m,rt< ...

  7. hdu-3308 LCIS (线段树区间合并)

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  8. LCIS HDU - 3308 (线段树区间合并)

    LCIS HDU - 3308 Given n integers. You have two operations: U A B: replace the Ath number by B. (inde ...

  9. HDU 3308 LCIS (线段树区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...

随机推荐

  1. CF888G Xor-MST 解题报告

    CF888G Xor-MST 题意翻译 给定一个\(n\)个节点的完全图,每个节点有个编号\(a_i\),节点\(i\)和节点\(j\)之间边的权值为\(a_i\ xor\ a_j\),求该图的最小生 ...

  2. loj6253/luogu4062-Yazid的新生舞会

    先考虑部分分(只有01/只有0~7)做法:枚举每个数,把和他相同的设为1,不同的设为-1,然后这个数作为众数贡献的个数就是区间和>0的个数 推着做,树状数组记前缀和<=x的区间的数量就可以 ...

  3. 解题:NOI 2018 归程

    题面 清新友好的题目 跑一个最短路,然后对海拔建Kruskal重构树,从最后接上去的边(最低的一个)开始DFS一下处理子树里路程的最小值. 询问是每次在重构树上倍增找到深度最浅的海拔高于当天水位线的节 ...

  4. JDK自带线程池介绍及使用环境

    1.newFixedThreadPool创建一个指定工作线程数量的线程池.每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中. 2.newCach ...

  5. Kafka 温故(五):Kafka的消费编程模型

    Kafka的消费模型分为两种: 1.分区消费模型 2.分组消费模型 一.分区消费模型 二.分组消费模型 Producer : package cn.outofmemory.kafka; import ...

  6. DDLog设置方法

          CHENYILONG Blog DDLog设置方法 本文永久地址为http://www.cnblogs.com/ChenYilong/p/3984246.html,转载请注明出处. 201 ...

  7. D. Dasha and Chess(交互题)

    题目链接:http://codeforces.com/contest/1100/problem/D 题目大意:给你一个999*999的图,然后有666个黑色旗子,一个白色棋子,每一次白色棋子只能在它附 ...

  8. Paint Fence

    There is a fence with n posts, each post can be painted with one of the k colors.You have to paint a ...

  9. Python 优雅获取本机 IP 方法

    原文 见过很多获取服务器本地IP的代码,个人觉得都不是很好,例如以下这些 不推荐:靠猜测去获取本地IP方法 #!/usr/bin/env python # -*- coding: utf-8 -*- ...

  10. 如何计算 App 的启动时间

    应用启动场景 事实上 Android 中一个 App 的启动时间可以准确计算的.但是要分场景.也就是说要分开游戏和应用. 大家都知道,在Android中,游戏开发和应用开发是两码事.所以我们需要分开来 ...