hdu 3308 线段树 区间合并+单点更新+区间查询
2024-08-29 14:07:04
LCIS
Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6592 Accepted Submission(s): 2866
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].
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<=105).
The next line has n integers(0<=val<=105).
The next m lines each has an operation:
U A B(0<=A,n , 0<=B=105)
OR
Q A B(0<=A<=B< n).
Each case starts with two integers n , m(0<n,m<=105).
The next line has n integers(0<=val<=105).
The next m lines each has an operation:
U A B(0<=A,n , 0<=B=105)
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
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
1
4
2
3
1
2
5
Author
shǎ崽
Source
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pi (4*atan(1.0))
const int N=1e5+,M=4e6+,inf=1e9+;
struct is
{
int l,r;
int lm,mm,rm;
}tree[N<<];
int val[N];
void buildtree(int l,int r,int pos)
{
tree[pos].l=l;
tree[pos].r=r;
if(l==r)
{
tree[pos].lm=tree[pos].rm=tree[pos].mm=;
return;
}
int mid=(l+r)>>;
buildtree(l,mid,pos<<);
buildtree(mid+,r,pos<<|);
tree[pos].lm=tree[pos<<].lm;
tree[pos].rm=tree[pos<<|].rm;
if(val[tree[pos<<].r]<val[tree[pos<<|].l])
tree[pos].mm=max(tree[pos<<].mm,max(tree[pos<<|].mm,tree[pos<<].rm+tree[pos<<|].lm));
else
tree[pos].mm=max(tree[pos<<].mm,tree[pos<<|].mm);
if(val[tree[pos<<].r]<val[tree[pos<<|].l]&&tree[pos<<].lm==tree[pos<<].r-tree[pos<<].l+)
tree[pos].lm+=tree[pos<<|].lm;
if(val[tree[pos<<].r]<val[tree[pos<<|].l]&&tree[pos<<|].rm==tree[pos<<|].r-tree[pos<<|].l+)
tree[pos].rm+=tree[pos<<].rm;
}
void update(int point,int pos)
{
if(tree[pos].l==tree[pos].r)
return;
int mid=(tree[pos].r+tree[pos].l)>>;
if(point>mid)
update(point,pos<<|);
else
update(point,pos<<);
tree[pos].lm=tree[pos<<].lm;
tree[pos].rm=tree[pos<<|].rm;
if(val[tree[pos<<].r]<val[tree[pos<<|].l])
tree[pos].mm=max(tree[pos<<].mm,max(tree[pos<<|].mm,tree[pos<<].rm+tree[pos<<|].lm));
else
tree[pos].mm=max(tree[pos<<].mm,tree[pos<<|].mm);
if(val[tree[pos<<].r]<val[tree[pos<<|].l]&&tree[pos<<].lm==tree[pos<<].r-tree[pos<<].l+)
tree[pos].lm+=tree[pos<<|].lm;
if(val[tree[pos<<].r]<val[tree[pos<<|].l]&&tree[pos<<|].rm==tree[pos<<|].r-tree[pos<<|].l+)
tree[pos].rm+=tree[pos<<].rm;
}
is query(int L,int R,int pos)
{
if(tree[pos].l==L&&tree[pos].r==R)
return tree[pos];
int mid=(tree[pos].l+tree[pos].r)>>;
if(mid<L)
return query(L,R,pos<<|);
else if(mid>=R)
return query(L,R,pos<<);
else
{
is a=query(L,mid,pos<<);
is b=query(mid+,R,pos<<|);
is ans;
ans.l=a.l,ans.r=b.r;
ans.lm=a.lm;
ans.rm=b.rm;
if(val[a.r]<val[b.l])
ans.mm=max(a.mm,max(b.mm,a.rm+b.lm));
else
ans.mm=max(a.mm,b.mm);
if(val[a.r]<val[b.l]&&a.lm==a.r-a.l+)
ans.lm+=b.lm;
if(val[a.r]<val[b.l]&&b.rm==b.r-b.l+)
ans.rm+=a.rm;
return ans;
}
}
char a[];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&val[i]);
buildtree(,n,);
while(m--)
{
int l,r;
scanf("%s%d%d",a,&l,&r);
l++;
if(a[]=='U')
val[l]=r,update(l,);
else
r++,printf("%d\n",query(l,r,).mm);
}
}
return ;
}
最新文章
- SQL 存储过程 传入数组参数
- Fetch:下一代 Ajax 技术
- ceph与openstack对接
- Tips2:无需Gizmo函数 和 附加Render 实现空物体(GameObject)的可视化
- eclipse+maven 无法编译
- topcoder 643 DIV2
- Java安装程序制作
- ios开发——实战Swift篇&;简单项目的实现
- Android(java)学习笔记222:开发一个多界面的应用程序之不同界面间互相传递数据(短信助手案例的优化:请求码和结果码)
- 提升PHP速度的53个建议
- hdu5672 尺取法
- java学习:AWT组件和事件处理的笔记(1)--Frame
- SQL Server 使用ROW_NUMBER实现的高效分页排序
- 量化投资与Python之pandas
- eclipse 界面开发--windowbuilder
- Python完全新手教程
- 100-days: ten
- 【模板】第 K 大数
- NOIP2015神奇的幻方
- 移动端-webkit-user-select:none导致input/textarea输入框无法输入