uestc 1425——Another LCIS

2024-01-17 21:32
文章标签 another uestc 1425 lcis

本文主要是介绍uestc 1425——Another LCIS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

线段树

跟上次做的0 1 反转基本相同

http://acm.uestc.edu.cn/problem.php?pid=1425

注意:sample输出是没输出case数,害我wa了好多次。。。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid ((t[rt].l+t[rt].r)>>1)
#define maxn 100100
int n,m;
struct tree
{
int l,r;
int lval,rval;
int lmax,rmax,max;
int len,lazy;
tree(){}
tree(int a,int b,int c,int d):l(a),r(b),len(c),lazy(d){}
}t[maxn<<2];
void pushup(int rt)
{
t[rt].lval=t[ls].lval;
t[rt].rval=t[rs].rval;
if(t[ls].rval<t[rs].lval)
{
t[rt].lmax=(t[ls].len==t[ls].lmax?t[ls].lmax+t[rs].lmax:t[ls].lmax);
t[rt].rmax=(t[rs].len==t[rs].rmax?t[rs].rmax+t[ls].rmax:t[rs].rmax);
t[rt].max=max(max(t[ls].max,t[rs].max),t[ls].rmax+t[rs].lmax);
}
else
{
t[rt].lmax=t[ls].lmax;
t[rt].rmax=t[rs].rmax;
t[rt].max=max(t[ls].max,t[rs].max);
} 
}
void pushdown(int rt)
{
if(t[rt].lazy!=0)
{
int k=t[rt].lazy;
t[ls].rval+=k;t[ls].lval+=k;
t[rs].lval+=k;t[rs].rval+=k;
t[ls].lazy+=k;t[rs].lazy+=k;
t[rt].lazy=0;
}
}
void build(int rt,int l,int r)
{
t[rt]=tree(l,r,r-l+1,0);
if(l==r)
{
scanf("%d",&t[rt].lval);
t[rt].rval=t[rt].lval;
t[rt].lmax=t[rt].rmax=t[rt].max=1;
return;
}
build(ls,l,mid);
build(rs,mid+1,r);
pushup(rt);
}
int query(int rt,int l,int r)
{
if(l==t[rt].l&&r==t[rt].r)
return t[rt].max;
pushdown(rt);
if(r<=mid)
return query(ls,l,r);
else if(l>mid)
return query(rs,l,r);
else
{
int a=query(ls,l,mid);
int b=query(rs,mid+1,r);
int ans=max(a,b);
int k=0;
if(t[ls].rval<t[rs].lval)
k=min(mid-l+1,t[ls].rmax)+min(r-mid,t[rs].lmax);
return max(ans,k);
}
}
void add(int rt,int l,int r,int k)
{
if(t[rt].l==l&&t[rt].r==r)
{
t[rt].rval+=k;
t[rt].lval+=k;
t[rt].lazy+=k;
return;
}
pushdown(rt);
if(r<=mid)
add(ls,l,r,k);
else if(l>mid)
add(rs,l,r,k);
else
{
add(ls,l,mid,k);
add(rs,mid+1,r,k);
}
pushup(rt);
}
int main()
{
int t;
int cnt=0;
scanf("%d",&t);
while(t--)
{
printf("Case #%d:\n",++cnt);
scanf("%d%d",&n,&m);
build(1,1,n);
char s[10];
int l,r,val;
while(m--)
{
scanf("%s",s);
if(s[0]=='q')
{
scanf("%d%d",&l,&r);
int ans=query(1,l,r);
printf("%d\n",ans);
}
else
{
scanf("%d%d%d",&l,&r,&val);
add(1,l,r,val);
}
}
}
return 0;
}


 

这篇关于uestc 1425——Another LCIS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/617279

相关文章

【HDU】4960 Another OCD Patient 【DP】

传送门:【HDU】4960 Another OCD Patient 题目分析:比赛的时候写的太乱了,本来不需要合并的地方也合并了,现在重新改了改倒是清爽多了,顺便贴一下。 由于题目需要我们将原数组变成回文串,所以我们可以一开始就将原数组中必须合并的先合并了。那么什么是必须合并的呢?注意到左右对称,所以我们可以将左端的数相加正好等于右端的左右两个块分别合并(一定这样得到的是极小块),怎么相

最长公共上升子序列(LCIS)ZOJ 2432

立方算法: #include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#define M 505using namespace std;typedef long long LL;LL a[M],b[M];int dp[M][M];int main(){//freopen("in.txt","

【UESTC】【windy数】

windy数 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  Status windy定义了一种windy数。 不含前导零且相邻两个数字之差至少为 2 的正整数被称为windy数。 windy想知道,在 A 和 B 之间,包括 A 和

android NDK开发中,用Cygwin调试本地代码时报错“Another debug session running,Use --force to kill it”原因及解决办法

在使用ndk-gdb调试的时候,执行$NDK/ndk-gdb --verbose报错“Another debug session running,Use --force to kill it”。      我查了NDK官方文档,是这样说的:        --force: By default, ndk-gdb aborts if it finds that another nati

ubuntu进行apt-get时候出现Package libpcre3-dev is not available, but is referred to by another package 错误

Package libpcre3-dev is not available, but is referred to by another package 这个问题的原因是ubuntu的/etc/apt/source.list中的源比较旧了,需要更新一下,更新方法: $ sudo apt-get -y update 更新完毕之后,在使用apt-get就没有问题了。

【矩阵快速幂】UVA 10698 G - Yet another Number Sequence

【题目链接】click here~~ 【题目大意】 Let's define another number sequence, given by the following function: f(0) = a f(1) = b f(n) = f(n-1) + f(n-2), n > 1 When a = 0 and b = 1, this sequence gives the

UESTC 1712 Easy Problem With Numbers 除法对和数取模,分解,线段树

附上神牛原版思路: 如果这个题只有乘法,那么你肯定会做吧?线段树更新区间查找区间。 那么有除法呢?当一个数x和m互质的时候,除以x可以改为乘以x的逆元。(至于互质的数求逆元用扩展欧几里德,这个网上可以随便找到) 但是这题并不能保证除的数与m互质吧?什么时候x与m不互质呢?就是x与m含有公因子吧? 那么我们一开始就把m分解,分解出来m有p1,p2,p3,p4...pn等一

LCIS --线段树区间合并

所谓线段树区间合并就是在查询的时候对线段树的孩子进行合并,合并成一段区间进行操作的合并 Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3785    Accepted Submission(s): 1712 Problem

Another app is currently holding the yum lock; waiting for it to exit...

Linux安装Redis依赖遇到的问题 Another app is currently holding the yum lock; waiting for it to exit… 解决办法 sudo rm -f /var/run/yum.pid sudo: 以超级用户(root)的权限执行后续命令。某些操作需要管理员权限才能执行,因此需要使用 sudo。rm: Linux/Unix

FZU1753 Another Easy Problem【组合数】

题目链接: http://acm.fzu.edu.cn/problem.php?pid=1753 题目大意: 给你 T 个组合数 C(N,K),求这 T 个组合数的最大公约数。 解题思路: 将组合数用 素因子分解的形式来表示。然后求出每个素因子在公约数中最小的阶, 相乘得到答案。 AC代码: #include<iostream>#include<algor