博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LCIS(线段树区间合并)
阅读量:5888 次
发布时间:2019-06-19

本文共 2313 字,大约阅读时间需要 7 分钟。

LCIS

Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5912    Accepted Submission(s): 2563

Problem Description
Given n integers. You have two operations: U A B: replace the Ath number by B. (index counting from 0) Q A B: output the length of the longest consecutive increasing subsequence (LCIS) in [a, b].
 

 

Input
T in the first line, indicating the case number. Each case starts with two integers n , m(0<n,m<=10
5). The next line has n integers(0<=val<=10
5). The next m lines each has an operation: U A B(0<=A,n , 0<=B=10
5) OR Q A B(0<=A<=B< n).
 

 

Output
For each Q, output the answer.
 

 

Sample Input
1 10 10 7 7 3 3 5 9 9 8 1 8 Q 6 6 U 3 4 Q 0 1 Q 0 5 Q 4 7 Q 3 5 Q 0 2 Q 4 6 U 6 10 Q 0 9
 

 

Sample Output
1 1 4 2 3 1 2 5
 
 
题解:

给你n个数组成的序列(序列中编号从0到n-1),有q次操作。

操作1——Q a  b,让你输出区间[a, b]里面最长的连续递增序列的长度;

操作2——U a  b,修改序列第a个数为b。

出了点小问题错了半天;

刚开始理解错了,是单调上升序列;1 3 5 7也算;

区间合并

代码:

#include
#include
#include
#include
#include
#include
using namespace std;const int INF=0x3f3f3f3f;#define mem(x,y) memset(x,y,sizeof(x))#define SI(x) scanf("%d",&x)#define PI(x) printf("%d",x)#define SD(x,y) scanf("%lf%lf",&x,&y)#define P_ printf(" ")#define ll root<<1#define rr root<<1|1#define lson ll,l,mid#define rson rr,mid+1,rtypedef long long LL;const int MAXN=100010;struct Node{ int len,lv,rv,lsum,rsum,sum; Node init(int l,int r){ scanf("%d",&lv);rv=lv; lsum=sum=rsum=1; }};Node tree[MAXN<<2];/*void print(int root,int l,int r){ int mid=(l+r)>>1; if(l==r){ printf("%d %d\n",tree[root].lv,tree[root].rv);return; } print(lson);print(rson);}*/void pushup(int root){ tree[root].lsum=tree[ll].lsum; tree[root].rsum=tree[rr].rsum; tree[root].lv=tree[ll].lv; tree[root].rv=tree[rr].rv; tree[root].sum=max(tree[ll].sum,tree[rr].sum); if(tree[ll].rv
>1; build(lson); build(rson); pushup(root);}void update(int root,int l,int r,int A,int B){ int mid=(l+r)>>1; if(l==A&&r==A){ tree[root].lv=tree[root].rv=B; return; } if(mid>=A)update(lson,A,B); else update(rson,A,B); pushup(root);}int query(int root,int l,int r,int A,int B){ if(l>=A&&r<=B)return tree[root].sum; int mid=(l+r)>>1; int ans=0; if(mid>=A)ans=max(ans,query(lson,A,B));//多加了return错了半天;;;; if(mid

  

转载地址:http://khrix.baihongyu.com/

你可能感兴趣的文章
OpenSSL使用2(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12概念说明)(转)
查看>>
【前端】:HTML
查看>>
SSM框架——使用MyBatis Generator自动创建代码
查看>>
java数据库操作:JDBC的操作
查看>>
基于OpenCV的形态学开源库 V0.2
查看>>
在ubuntu下安装和配置vsftpd
查看>>
c#中结构体和类的比较
查看>>
Linux磁盘配额
查看>>
JQuery UI的拖拽功能
查看>>
数据驱动销售——个性化推荐引擎
查看>>
C语言标准库函数qsort那点小事
查看>>
HL7 CDA高级培训
查看>>
Android 调用照相机拍照
查看>>
linux的C获取shell执行返回的结果
查看>>
关于spring mybateis 定义resultType="java.util.HashMap"
查看>>
程序员怎么留住健康?
查看>>
(转)C# 把我所积累的类库全部分享给博友(附件已经上传)
查看>>
Silverlight5 无法切换输入法,无法输入中文的原因及解决初探
查看>>
游戏开发基础:方向键的组合,八方向实现
查看>>
黑书-DP-方块消除 ****
查看>>