LightOJ-1399-线段树求区间相同颜色连续的最大长度
来源:互联网 发布:48口网络交换机报价 编辑:程序博客网 时间:2024/05/21 06:21
题目大意:区间相同颜色连续的最大长度
题目解析:线段树节点保存左右端点颜色,从左右开始的最大长度和答案,pushup和query的时候考虑左儿子右端点和右儿左端点的颜色是否一样需要特判;
AC代码:
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#define lson rt<<1#define rson rt<<1|1using namespace std;const int maxn = 1e5+10;struct node{int l,r;int ma;int lc,rc;int ls,rs;}tree[maxn<<2];void pushup(int rt){tree[rt].ls=tree[lson].ls;tree[rt].rs=tree[rson].rs;tree[rt].l=tree[lson].l;tree[rt].r=tree[rson].r;tree[rt].lc=tree[lson].lc;tree[rt].rc=tree[rson].rc;tree[rt].ma=max(tree[lson].ma,tree[rson].ma);if(tree[lson].rc==tree[rson].lc){if(tree[lson].ls==tree[lson].r-tree[lson].l+1)tree[rt].ls=tree[lson].ls+tree[rson].ls;if(tree[rson].rs==tree[rson].r-tree[rson].l+1)tree[rt].rs=tree[rson].rs+tree[lson].rs;int sum = tree[lson].rs+tree[rson].ls;tree[rt].ma=max(tree[rt].ma,sum);}}void build(int l,int r,int rt){if(l==r){int c;scanf("%d",&c);tree[rt].lc=tree[rt].rc=c;tree[rt].ls=tree[rt].rs=1;tree[rt].l=l;tree[rt].r=r;tree[rt].ma=1;return ;}int mid =(l+r)>>1;build(l,mid,lson);build(mid+1,r,rson);pushup(rt);}int query(int l,int r,int rt){//cout<<l<<" "<<r<<endl;if(l==tree[rt].l&&r==tree[rt].r){return tree[rt].ma;}int mid = (tree[rt].l+tree[rt].r)>>1;if(l>mid)return query(l,r,rson);else if(r<=mid)return query(l,r,lson);else {int ret = max(query(l,mid,lson),query(mid+1,r,rson));if(tree[lson].rc==tree[rson].lc){int ll = min(tree[lson].rs,tree[lson].r-l+1);int rr = min(tree[rson].ls,r-tree[rson].l+1);ret = max(ret,ll+rr);}return ret;}}int main(){int cas,kcas=0;scanf("%d",&cas);while(cas--){int n,c,q;scanf("%d%d%d",&n,&c,&q);build(1,n,1);printf("Case %d:\n",++kcas);while(q--){int l,r;scanf("%d%d",&l,&r);int ans = query(l,r,1);printf("%d\n",ans);}}return 0;}
阅读全文
0 0
- LightOJ-1399-线段树求区间相同颜色连续的最大长度
- POJ 3667 Hotel (线段树区间最大连续长度)
- hdu 1540 线段树 点所在的区间最大连续长度
- POJ 题目2892 Tunnel Warfare(线段树单点更新查询,求单点所在最大连续区间长度)
- PKU2892(Tunnel Warfare)线段树求最大连续区间
- LA3938 线段树 动态求区间最大连续和
- hdu1540(线段树求连续区间最大和)
- poj 2892 hdu1540 线段树 求过某点的最大连续区间。
- 求区间连续不超过K段的最大和--线段树+大量代码
- poj 1750Potted Flower(线段树 区间合并 动态规划 区间求最大连续和)
- POJ3667【线段树、最大连续区间】
- uva1400 区间最大连续和 线段树
- hdu-1540(线段树+最大连续区间)
- 邮票面值,求最大的连续区间
- 求一个序列的最大连续长度
- CDOJ1061-秋实大哥与战争 线段树区间合并问题(求最长连续区间长度)
- 线段树+DP 求区间连续最大子段和 hoj Candy
- HDU-1540-Tunnel Warfare(线段树求最大连续子区间)
- /usr/bin/env: node: No such file or directory
- 使用ST-Link Utility去除STM32芯片读写保护
- jmeter登录压力测试之登录
- PAT (Basic Level) Practise (中文)1067. 试密码(20)
- Python运算符
- LightOJ-1399-线段树求区间相同颜色连续的最大长度
- 分享一波好网站(不定时更新)
- Hibernate(十)多表联查之双向多对多
- MySQL、Oracle分页查询语句
- Python入门<1>爬楼梯
- OKHttp框架
- C语言学习1
- ubuntu is not in the sudoers file
- BZOJ1067 [SCOI2007]降雨量 模拟/线段树/map经验书