题意: 有两种操作  一种是单点改为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. Winform Treeview 的按需加载

    最近项目里用到treeview,原先设计的是一开始就把所有数据都加载到treeview里,后来发现客户的数据量实在太大,加载所有数据要2分钟,这个是客户没法接受的.后来就考虑到用户也不是一开始就要看所 ...

  2. WEB入门之十二 jquery简介

    学习内容 jQuery简介 搭建jQuery开发环境 jQuery基本选择器 能力目标 熟悉jQuery开发环境 能编写简单的jQuery代码 本章简介 在前面两章,我们学习了JavaScript面向 ...

  3. RabbitMQ的生产者和消费者

    低级错误:启动程序的时候报错:socket close: 原因在配置文件中写的端口是:15672,应该是5672: client端通信口5672管理口15672server间内部通信口25672erl ...

  4. jedisClient操作redis实现增删改查功能

    这个集群环境下和单机环境下: package com.taotao.sso.dao.impl; import org.springframework.beans.factory.annotation. ...

  5. 特别翔实的adaboost分类算法讲解 转的

    转https://www.cnblogs.com/litthorse/p/9332370.html 作为(曾)被认为两大最好的监督分类算法之一的adaboost元算法(另一个为前几节介绍过的SVM算法 ...

  6. *p++、(*p)++、*++p、++*p 的区别

    int a[5]={1,2,3,4,5};int *p = a; *p++ 先取指针p指向的值(数组第一个元素1),再将指针p自增1: cout << *p++; // 结果为 1 cou ...

  7. SQL记录-PLSQL过程

    PL/SQL过程   子程序是一个程序单元/模块执行特定的任务.这些子程序被组合以形成更大的程序.这基本上是被称为“模块化设计”.子程序可以调用由另一个子程序或程序被称为调用程序. 子程序可以创建: ...

  8. node.js+express,实现RESTful API

    node代码如下(exptest.js): var express = require('express'); var bodyParser = require('body-parser'); var ...

  9. ZCMU 1894: Power Eggs

    http://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1894 题意: 有M个鹰蛋,N层楼,鹰蛋的硬度是E,也就是说在1~E层楼扔下去不会碎,E+1层楼扔 ...

  10. bzoj千题计划197:bzoj4247: 挂饰

    http://www.lydsy.com/JudgeOnline/problem.php?id=4247 先把挂饰按挂钩数量从大到小排序 dp[i][j]前i个挂饰,剩下j个挂钩的最大喜悦值 分挂和不 ...