【BZOJ 1095】 [ZJOI2007]Hide 捉迷藏 括号序列
来源:互联网 发布:跳转页面js 编辑:程序博客网 时间:2024/05/16 11:49
太神了!!!!
这种方法看来不适合我这种蒟蒻!!
下午还是老老实实用分治把!!
#include <cstdio>#include <iostream>#include <algorithm>#define INF 1000000000using namespace std;struct H{ int ans; int C2,C5; int L25,R25; int L5,R2;}seg_num[1000000*4+1];int init[1000000+1];int n,m;int tot,g[1000000+1],num[1000000+1],nnext[1000000+1];int pos[1000000+1];bool is_black[1000000+1];int v[1000000*3+1],cnt;void Add(int x,int y){ tot++; nnext[tot]=g[x]; g[x]=tot; num[tot]=y;}void dfs (int x){ v[++cnt]=-5; v[++cnt]=x;pos[x]=cnt; for(int i=g[x];i;i=nnext[i]) if(!is_black[num[i]]) is_black[num[i]]=true,dfs(num[i]); v[++cnt]=-2;}void Up(int now){ int L=now*2,R=now*2+1; if(seg_num[L].C5>seg_num[R].C2) { seg_num[now].C2=seg_num[L].C2; seg_num[now].C5=seg_num[L].C5-seg_num[R].C2+seg_num[R].C5; } else { seg_num[now].C2=seg_num[L].C2+seg_num[R].C2-seg_num[L].C5; seg_num[now].C5=seg_num[R].C5; } seg_num[now].ans=max(max(seg_num[L].ans,seg_num[R].ans),max(seg_num[L].R25+seg_num[R].L5,seg_num[R].L25+seg_num[L].R2)); seg_num[now].L25=max(seg_num[L].L25,max(seg_num[L].C5+seg_num[L].C2+seg_num[R].L5,seg_num[L].C2-seg_num[L].C5+seg_num[R].L25)); seg_num[now].R25=max(seg_num[R].R25,max(seg_num[L].R2+seg_num[R].C2+seg_num[R].C5,seg_num[L].R25+seg_num[R].C5-seg_num[R].C2)); seg_num[now].L5=max(seg_num[L].L5,seg_num[R].L5+seg_num[L].C5-seg_num[L].C2); seg_num[now].R2=max(seg_num[R].R2,seg_num[L].R2+seg_num[R].C2-seg_num[R].C5);}void Build(int now,int L,int R){ if(L==R) { if(v[L]<0) { seg_num[now].L25=seg_num[now].R25=seg_num[now].R2=seg_num[now].L5=-INF; if(v[L]==-2) seg_num[now].C2=1; else seg_num[now].C5=1; } return ; } int mid=(L+R)/2; Build(now*2,L,mid); Build(now*2+1,mid+1,R); Up(now);}void Change(int now,int L,int R,int loc){ if(L==R) { if(is_black[v[L]]==1) seg_num[now]=(H){0,0,0,0,0,0,0}; else seg_num[now]=(H){0,0,0,-INF,-INF,-INF,-INF}; return ; } int mid=(L+R)/2; if(loc<=mid) Change(now*2,L,mid,loc); else Change(now*2+1,mid+1,R,loc); Up(now);}int main(){ cin>>n; for(int i=1;i<n;i++) { int x,y; scanf("%d %d",&x,&y); Add(x,y); Add(y,x); } is_black[1]=true; dfs(1); n*=3; Build(1,1,n); cin>>m; char c;int x; int nn=n/3; while(m--) { getchar(); c=getchar(); if(c=='G') { if(nn==0) printf("-1\n"); else if(nn==1) printf("0\n"); else printf("%d\n",seg_num[1].ans); } else { scanf("%d",&x); if(is_black[x]==true) nn--; else nn++; is_black[x]=!is_black[x]; Change(1,1,n,pos[x]); } } return 0;}
0 0
- 【BZOJ 1095】 [ZJOI2007]Hide 捉迷藏 括号序列
- 【BZOJ 1095】 [ZJOI2007]Hide 捉迷藏
- 【BZOJ 1095】 [ZJOI2007]Hide 捉迷藏
- BZOJ 1095【ZJOI2007】Hide捉迷藏
- BZOJ 1095 [ZJOI2007]Hide 捉迷藏
- BZOJ 1095: [ZJOI2007]Hide 捉迷藏
- BZOJ 1095 [ZJOI2007]Hide 捉迷藏
- 【线段树】【括号序列】【ZJOI2007】捉迷藏 Hide
- 括号序列 || 动态树分治 bzoj1095【ZJOI2007】Hide 捉迷藏
- 1095: [ZJOI2007]Hide 捉迷藏
- 1095: [ZJOI2007]Hide 捉迷藏
- 1095: [ZJOI2007]Hide 捉迷藏
- 1095: [ZJOI2007]Hide 捉迷藏
- 1095 [ZJOI2007]Hide 捉迷藏
- BZOJ 1095 ZJOI2007 Hide 捉迷藏 动态树分治+堆
- 【BZOJ 1095】[ZJOI2007]Hide 捉迷藏 动态树分治
- bzoj 1095: [ZJOI2007]Hide 捉迷藏 动态树分治+堆
- bzoj 1095: [ZJOI2007]Hide 捉迷藏 (动态点分治)
- 接下来的事
- 【BZOJ 3196】 Tyvj 1730 二逼平衡树
- 【BZOJ 2038】 [2009国家集训队]小Z的袜子(hose)
- 就拿胖子说事
- 【BZOJ 3196】 Tyvj 1730 二逼平衡树 分块
- 【BZOJ 1095】 [ZJOI2007]Hide 捉迷藏 括号序列
- shell if语句中的参数
- kafka0.9 topic level参数
- 【BZOJ 2152】 聪聪可可
- 【BZOJ 4016】[FJOI2014]最短路径树问题
- 【BZOJ 1095】 [ZJOI2007]Hide 捉迷藏
- 【BZOJ 3144】 [Hnoi2013]切糕
- 【UOJ 34】多项式乘法
- java数据结构 深搜+栈