题意:点我

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

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 ; }

最新文章

  1. linuxmint 17没有vim
  2. 00 EPLAN安装问题
  3. js数据类型
  4. sqlmap的学习以及使用
  5. 关于JavaScript lastIndexOf() 方法 w3school.com.cn写的不一定全对
  6. Mongodb Manual阅读笔记:CH9 Sharding
  7. java中Thread的 interrupt异常处理
  8. json \u unicode字符串转化 c++
  9. POJ 1455
  10. bzoj1567: [JSOI2008]Blue Mary的战役地图
  11. 修改Sublime Text 3 的侧边栏字体大小
  12. 凸包(hd1392)
  13. Android学习笔记:利用httpclient和AsyncTask 发起网络http post操作
  14. 第3章 Java语言基础----声明成员变量,对变量进行赋值
  15. ECharts插件的使用
  16. Linux 初始环境配置 以及避坑 (详细)
  17. 【HDFS API编程】查看目标文件夹下的所有文件、递归查看目标文件夹下的所有文件
  18. 3.静态AOP实现-代理模式
  19. 一个有界任务队列的thradpoolexcutor, 直接捕获错误日志
  20. Visual studio 2019 preview & C# 8 initial experience

热门文章

  1. Spring4笔记5--基于注解的DI(依赖注入)
  2. Redis—数据结构之list
  3. ip_local_deliver &amp;&amp; ip_local_deliver_finish
  4. Codeforces Round #505
  5. day06作业
  6. linux定时任务-cron
  7. P1183 多边形的面积
  8. COLLATE CHINESE_PRC_CI_AS_WS 的含义
  9. Python 让两个print()函数的输出打印在一行内
  10. Struts 2 - Environment Setup