vijos p1881 线段树
2015-05-19 00:42
375 查看
题意:点我
我就想问,现在换代码风格还来得及吗?
2015-05-19:线段树进一步加强,看来不用换风格了
维护左右节点左右端颜色和长度即可
题解代码
我就想问,现在换代码风格还来得及吗?
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; }
相关文章推荐
- 1881闪烁的繁星——线段树vijos
- Vijos1881闪烁的繁星 [线段树]
- Bzoj 1756: Vijos1083 小白逛公园 线段树
- VIJOS 1083 小白逛公园 线段树
- vijos 1083 小白的公园 线段树
- Vijos 1901 学姐的钱包(线段树优化dp)
- 二分查找or线段树(借教室洛谷1083vijos1782NOIP 2012 提高组 第二天 第二题)
- Vijos P1881 闪烁的星星 (加强自己多一点。。)
- vijos 1659 河蟹王国 线段树区间加、区间查询最大值
- 【线段树】小白逛公园 Vijos1083
- 【BZOJ】【P1756】【Vijos1083 小白逛公园】【题解】【线段树】
- Vijos 1448校门外的树(线段树)
- 【vijos1066】弱弱的战壕 线段树
- 【vijos】1750 建房子(线段树套线段树+前缀和)
- Vijos 1083 小白逛公园(线段树)
- [线段树] [树状数组] [Vijos P1512] SuperBrother打鼹鼠 (mole)
- 小白逛公园 - Vijos(线段树+一点dp)
- Vijos1881 闪烁的繁星
- Vijos P1103 校门外的树【线段树,模拟】
- vijos 1471 教主的游乐场 - 线段树优化dp