洛谷 红魔馆OI 妖梦斩木棒
2017-07-08 21:03
363 查看
题目传送门
一眼看出线段树,记录区间方案数,左/右非x木棒数就可以了。
tips:不知道分块可否?
一眼看出线段树,记录区间方案数,左/右非x木棒数就可以了。
tips:不知道分块可否?
#include<cstdio> #include<cstring> #include<algorithm> #include<cctype> #define ll long long #define INF 1000000000 #define clr(x) memset(x,0,sizeof(x)) using namespace std; inline int read() { register int ret=0,c=getchar(); while(!isdigit(c))c=getchar(); while(isdigit(c))ret=ret*10+c-'0',c=getchar(); return ret; } #define M 200005 struct tree2 { tree2 *lson,*rson; int ln,rn,n; }dizhi[15+M<<1],*t=&dizhi[0],*T,*root=++t; int n,m; void pushup(tree2 *tree,tree2 *lson,tree2 *rson) { int mer=min(lson->rn,rson->ln); tree->n=lson->n+rson->n+(mer>0); if(!mer&&!lson->n)tree->ln=max(lson->ln,rson->ln); else tree->ln=lson->ln; if(!mer&&!rson->n)tree->rn=max(lson->rn,rson->rn); else tree->rn=rson->rn; } void bulid(tree2 *tree,int l,int r) { if(l==r) { if(l==1)tree->rn=1; else if(l==n)tree->ln=1; return ; } int mid=(l+r)>>1; tree->lson=++t; tree->rson=++t; bulid(tree->lson,l,mid); bulid(tree->rson,mid+1,r); pushup(tree,tree->lson,tree->rson); } void change(tree2 *tree,int l,int r,int x,int num) { if(l==r) { tree->ln=tree->rn=0; if(num==2)tree->ln=1;//')' if(num==3)tree->rn=1;//'(' return ; } int mid=(l+r)>>1; if(x<=mid)change(tree->lson,l,mid,x,num); else change(tree->rson,mid+1,r,x,num); pushup(tree,tree->lson,tree->rson); } tree2 *query(tree2 *tree,int l,int r,int x,int y) { if(x<=l&&y>=r)return tree; int mid=(l+r)>>1; tree2 *t1=NULL,*t2=NULL; if(x<=mid)t1=query(tree->lson,l,mid,x,y); if(y>mid)t2=query(tree->rson,mid+1,r,x,y); if(t1==NULL)return t2; if(t2==NULL)return t1; tree2 *ret=++t; pushup(ret,t1,t2); return ret; } inline int get_num(char c) { if(c=='X')return 1; if(c==')')return 2; if(c=='(')return 3; } int main() { n=read(),m=read(); bulid(root,1,n); T=t; for(int i=1;i<=m;i++) { t=T+1; int x=read(); if(x==1) { int a=read(),b=get_num(getchar()); change(root,1,n,a,b); } if(x==2) { int a=read(),b=read(); printf("%d\n",query(root,1,n,a,b)->n); } } return 0; }
相关文章推荐
- 洛谷 红魔馆OI 妖梦拼木棒 [组合数学]
- 洛谷P3797 妖梦斩木棒
- 洛谷P3799 妖梦拼木棒
- AC日记——妖梦斩木棒 洛谷 P3797
- 洛谷 P3797 妖梦斩木棒
- 洛谷P3799 妖梦拼木棒
- AC日记——妖梦拼木棒 洛谷 P3799
- 洛谷 P3797 妖梦斩木棒
- luogu P3799 妖梦拼木棒
- 洛谷 红魔馆OI 红色的幻想乡 [线段树]
- 洛谷——P2383 狗哥玩木棒
- 洛谷P1120小木棒 爆搜+剪枝
- 洛谷 P2383 狗哥玩木棒
- luogu P3797 妖梦斩木棒
- 妖梦拼木棒(组合数学)
- 洛谷P3799 妖梦拼木棒
- 妖梦斩木棒
- 洛谷P3799 妖梦拼木棒
- Luogu P3797 妖梦斩木棒
- 洛谷P3799 妖梦拼木棒