博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
A Simple Tree Problem
阅读量:5026 次
发布时间:2019-06-12

本文共 1345 字,大约阅读时间需要 4 分钟。

询问次数那么多,本能想到线段树。对区间重标号,区间询问, 更新。

View Code
int N,M,K, len;int ll[MM<<2], rr[MM<<2];int ff[MM<<2];int sum[MM<<2];vector
edge[MM];void dfs(int u) { int i,j,k,v; ll[u]=len++; for(i=0;i
>1; ff[lson]^=1; ff[rson]^=1; ff[rt]=0; sum[lson]=(mid-l+1)-sum[lson]; sum[rson]=(r-mid)-sum[rson]; }}void push_up(int rt) { sum[rt]=sum[lson]+sum[rson];}void update(int L,int R,int l,int r,int rt) { if(L<=l && r<=R) { sum[rt]=(r-l+1)-sum[rt]; ff[rt]^=1; return; } int mid=(l+r)>>1; push_down(l,r,rt); if(L<=mid) update(L,R,l,mid,lson); if(R>mid) update(L,R,mid+1,r,rson); push_up(rt);}int query(int L,int R,int l,int r,int rt) { if(L<=l && r<=R) { return sum[rt]; } push_down(l,r,rt); int mid=(l+r)>>1, ret=0; if(L<=mid) ret+=query(L,R,l,mid,lson); if(R>mid) ret+=query(L,R,mid+1,r,rson); push_up(rt); return ret;}void solve() { int i,j,k,a,l,r; char op; for(i=0;i<(MM<<2);i++) ff[i]=sum[i]=0; while(M--) { getchar(); scanf("%c%d",&op,&a); if(op=='o') { update(ll[a],rr[a],1,len-1,1); } else { printf("%d\n",query(ll[a],rr[a],1,len-1,1)); } } printf("\n"); }

 

转载于:https://www.cnblogs.com/zhang1107/archive/2013/04/13/3018782.html

你可能感兴趣的文章
BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]
查看>>
IDEA使用笔记(四)——工具栏的显示隐藏切换
查看>>
python中强大的list
查看>>
LeetCode Remove Invalid Parentheses
查看>>
thinkphp常用标签总结
查看>>
.net Core
查看>>
Mac 下安装wxpython踩过的坑
查看>>
05004_Linux的其他命令和权限命令
查看>>
00083_判断集合元素唯一的原理
查看>>
卷挂载/卸载工作流程
查看>>
.NET 配置项扩展
查看>>
Mac网络抓包 - Wireshark
查看>>
iOS开发拓展篇—CoreLocation简单介绍
查看>>
配置maven-ssm
查看>>
【codecombat】 试玩全攻略 第二章 边远地区的森林
查看>>
catch on用法
查看>>
CreateUserWizard控件的详细使用说明(3)
查看>>
jquery mobile AJAX特性的陷阱
查看>>
linu、C语言、计算机基础教程
查看>>
SCRUM 12.19
查看>>