您的位置:首页 > 其它

vijos p1881 线段树

2015-05-19 00:42 375 查看
题意:点我

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

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=199999+9;
int sum[MAXN<<2],lsum[MAXN<<2],rsum[MAXN<<2],lc[MAXN<<2],rc[MAXN<<2];
int n,m,t;
void pushup(int rt,int m)
{
lc[rt]=lc[rt<<1];
rc[rt]=rc[rt<<1|1];
lsum[rt]=lsum[rt<<1];
rsum[rt]=rsum[rt<<1|1];
sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
if(rc[rt<<1]!=lc[rt<<1|1])
{
sum[rt]=max(sum[rt],rsum[rt<<1]+lsum[rt<<1|1]);

if(sum[rt<<1]==(m-(m>>1)))
{
lsum[rt]=sum[rt<<1]+lsum[rt<<1|1];
}
if(sum[rt<<1|1]==(m>>1))
{
rsum[rt]=sum[rt<<1|1]+rsum[rt<<1];
}
}
}
void build(int l,int r,int rt)
{
sum[rt]=lsum[rt]=rsum[rt]=lc[rt]=rc[rt]=1;
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]^=1;
return;
}
if(pos<=mid)  update(pos,lson);
if(pos>mid)  update(pos,rson);
pushup(rt,(r-l+1));
}
int main()
{
int i,j,k,q;
scanf("%d%d",&n,&m);
build(root);
int pos;
for(i=0;i<m;i++)
{
scanf("%d",&pos);
update(pos,root);
printf("%d\n",sum[1]);
}
return 0;
}


题解代码

#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=199999+9;
int N,Q;
struct Node
{
int lc,rc;  //左右两端颜色
int ln,rn;  //左右两边长度
int val;    //长度
}T[Rn<<2];
void pushup(int rt,int l,int r)
{
Node &x1=T[rt],x2=T[rt<<1],x3=T[rt<<1 | 1];
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+1){
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=1;
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^1;
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(1,1,N);
for(int i=0;i<Q;i++)
{
scanf("%d",&x);
update(1,1,N,x);
printf("%d\n",T[1].val);
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: