题意:点我

我就想问,现在换代码风格还来得及吗?

2015-05-19:线段树进一步加强,看来不用换风格了

维护左右节点左右端颜色和长度即可

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root 1,n,1
#define mid ((l+r)>>1)
#define ll long long
#define cl(a) memset(a,0,sizeof(a))
#define ts printf("*****\n");
using namespace std;
const int MAXN=+;
int sum[MAXN<<],lsum[MAXN<<],rsum[MAXN<<],lc[MAXN<<],rc[MAXN<<];
int n,m,t;
void pushup(int rt,int m)
{
lc[rt]=lc[rt<<];
rc[rt]=rc[rt<<|];
lsum[rt]=lsum[rt<<];
rsum[rt]=rsum[rt<<|];
sum[rt]=max(sum[rt<<],sum[rt<<|]);
if(rc[rt<<]!=lc[rt<<|])
{
sum[rt]=max(sum[rt],rsum[rt<<]+lsum[rt<<|]); if(sum[rt<<]==(m-(m>>)))
{
lsum[rt]=sum[rt<<]+lsum[rt<<|];
}
if(sum[rt<<|]==(m>>))
{
rsum[rt]=sum[rt<<|]+rsum[rt<<];
}
}
}
void build(int l,int r,int rt)
{
sum[rt]=lsum[rt]=rsum[rt]=lc[rt]=rc[rt]=;
if(l==r) return;
build(lson);
build(rson);
}
void update(int pos,int l,int r,int rt)
{
if(l==r)
{
lc[rt]=rc[rt]^=;
return;
}
if(pos<=mid) update(pos,lson);
if(pos>mid) update(pos,rson);
pushup(rt,(r-l+));
}
int main()
{
int i,j,k,q;
scanf("%d%d",&n,&m);
build(root);
int pos;
for(i=;i<m;i++)
{
scanf("%d",&pos);
update(pos,root);
printf("%d\n",sum[]);
}
return ;
}

题解代码

 #include<cstdio>
#include <cstring>
#include <algorithm>
#define mid (l+r)/2
#define ls rt<<1,l,mid
#define rs rt<<1|1,mid+1,r
using namespace std;
const int Rn=+;
int N,Q;
struct Node
{
int lc,rc; //左右两端颜色
int ln,rn; //左右两边长度
int val; //长度
}T[Rn<<];
void pushup(int rt,int l,int r)
{
Node &x1=T[rt],x2=T[rt<<],x3=T[rt<< | ];
x1.lc=x2.lc;
x1.rc=x3.rc;
x1.ln=x2.ln;
x1.rn=x3.rn;
x1.val=max(x2.val,x3.val);
if(x2.rc!=x3.lc)
{
x1.val=max(x1.val,x2.rn+x3.ln);
if(x2.val==mid-l+){
x1.ln=x2.val+x3.ln;
}
if(x3.val==r-mid){
x1.rn=x3.val+x2.rn;
}
} }
void build(int rt,int l,int r)
{
Node &S=T[rt];
S.lc=S.rc=S.ln=S.rn=S.val=;
if(l==r)
{
return;
}
build(ls);
build(rs);
} void update(int rt,int l,int r,int x)
{
if(l==r)
{
T[rt].lc=T[rt].rc=T[rt].lc^;
return;
}
if(x<=mid)
{
update(ls,x);
}
if(x>mid)
{
update(rs,x);
}
pushup(rt,l,r);
} int main()
{
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
int x;
scanf("%d%d",&N,&Q);
build(,,N);
for(int i=;i<Q;i++)
{
scanf("%d",&x);
update(,,N,x);
printf("%d\n",T[].val);
}
return ; }

vijos p1881 线段树的更多相关文章

  1. Vijos P1103 校门外的树【线段树,模拟】

    校门外的树 描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……, ...

  2. Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】

    弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了 ...

  3. Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】

    校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K= ...

  4. Vijos 1404 遭遇战 - 动态规划 - 线段树 - 最短路 - 堆

    背景 你知道吗,SQ Class的人都很喜欢打CS.(不知道CS是什么的人不用参加这次比赛). 描述 今天,他们在打一张叫DUSTII的地图,万恶的恐怖分子要炸掉藏在A区的SQC论坛服务器!我们SQC ...

  5. vijos 1659 河蟹王国 线段树区间加、区间查询最大值

    河蟹王国 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 https://vijos.org/p/1659 Description 河蟹王国有一位河蟹国王,他 ...

  6. 【vijos】1750 建房子(线段树套线段树+前缀和)

    https://vijos.org/p/1750 是不是我想复杂了.... 自己yy了个二维线段树,然后愉快的敲打. 但是wa了两法.......sad 原因是在处理第二维的更新出现了个小问题,sad ...

  7. 【vijos】1881 闪烁的繁星(线段树+特殊的技巧)

    https://vijos.org/p/1881 这场比赛太难了sad.所以我都没做.. 这题一开始我竟然不会sad(本来就不会),然后我继续yy..yy了好久,竟然yy了个什么可拆分的并查集?(sa ...

  8. [vijos]1066弱弱的战壕<线段树>

    题目链接:https://www.vijos.org/p/1066 这道题没什么难度,只是要一个排序然后就是线段树的基本套路模版了 但是我还是讲一讲思路吧: 给出的是坐标x,y,当一个点的x,y都小于 ...

  9. Vijos 1083 小白逛公园(线段树)

    线段树,每个结点维护区间内的最大值M,和sum,最大前缀和lm,最大后缀和rm. 若要求区间为[a,b],则答案max(此区间M,左儿子M,右儿子M,左儿子rm+右儿子lm). ----------- ...

随机推荐

  1. 子查询优化--explain与profiling分析语句

    今天想的利用explain与progiling分析下语句然后进行优化.本文重点是如何通过explain与profiling分析SQL执行过程与性能.进而明白索引的重要性. 表的关系如下所示: 原始的查 ...

  2. 触发器Demo

    --mysql 触发器简单实例 --创建表1 )) ; --创建表2 )); --创建触发器,表一增加数据时,表二自动增加数据 create trigger t_afterinsert_on_tab1 ...

  3. 【codeforces】【比赛题解】#872 CF Round #440 (Div.2)

    链接. [A]寻找漂亮数字 题意: 给定了两列非零数字.我们说一个数是漂亮的,当它的十进制表达中有至少一个数从数列一中取出,至少有一个数从数列二中取出.最小的漂亮数字是多少? 输入: 第一行两个数\( ...

  4. Tslib的移植【转】

    转自:http://www.cnblogs.com/uvsjoh/archive/2011/08/25/2152947.html移植Tslib 1 下载源码tslib-x.x.tar.gz 2 解压, ...

  5. SDN核心技术剖析和实战指南---读书笔记

    第一章 SDN定义如下: SDN是一种新兴的基于软件的网络架构及技术,其最大的特点在于具有松耦合的控制平面与数据平面.支持集中化的网络状态控制.实现底层网络设施对上层应用的透明. SDN和NFV: O ...

  6. Java不为人知的小秘密

    Java中的main方法必须有一个外壳类,而且必须是静态的! Java中的所有函数都属于某个类的方法,所以main方法也不例外,必须放在一个类中才能编译运行. 例如: public class tex ...

  7. vue总结 03过滤器

    过滤器 Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化.过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持).过滤器应该被添加在 JavaS ...

  8. python3实现socket通信

    目的:实现两台机器之间的通信.也就是说一个作为服务端(时刻监听接收数据),另一个作为客户端(发送数据). Python实现的过程个人理解: 1.服务端开始监听. 2.客户端发起连接请求. 3.服务端收 ...

  9. 安装node版本管理工具之NVM

    nvm是个啥?nvm是一个可以让你在同一台机器上安装和切换不同版本node的工具. 你可能会问,为什么会有这个工具?有时候在开发的时候,对node版本有强制要求,有的要求用最新版本,有的要求用稳定版本 ...

  10. Jenkins 集成 Sonar

    Jenkins 与 Sonar 集成:Sonar 是 Jenkins 之外独立运行的一个服务.Jenkins 中安装插件 SonarQube(并配置其 Sonar Server 的 URL / Acc ...