BZOJ传送门

洛谷传送门


解析:

其实就是QTREE4的弱化版,可以直接用QTREE4的解法来做。

但是这道题有优秀的O(nlog⁡n)O(n\log n)O(nlogn)做法。

我们考虑利用DFS出的括号序列来处理距离。

将点的编号塞到括号序列里面,那么两个点的距离就是它们中间的括号序列的非匹配括号数。

证明因为极度弱智不想写了。

现在考虑用线段树来维护这个括号序列。

考虑如何得到横跨两个区间分界点的所有白色点对的距离最大值。

考虑区间lll的某个后缀(a1,b1)(a1,b1)(a1,b1),表示这个区间有a1a1a1个无法匹配的右括号和b1b1b1个无法匹配的左括号

同理考虑区间rrr的某个前缀(a2,b2)(a2,b2)(a2,b2)。

显然这样两个前后缀拼起来表示的距离就是a1+abs(b1−a2)+b2a1+abs(b1-a2)+b2a1+abs(b1−a2)+b2,显然我们需要的就是max⁡(a1+abs(b1−a2)+b2)\max(a1+abs(b1-a2)+b2)max(a1+abs(b1−a2)+b2)把里面的式子稍微转化一下得到:a1+max⁡(a2−b1,b1−a2)+b2=max⁡(a1−b1+a2+b2,a1+b1−a2+b2)a1+\max(a2-b1,b1-a2)+b2=\max(a1-b1+a2+b2,a1+b1-a2+b2)a1+max(a2−b1,b1−a2)+b2=max(a1−b1+a2+b2,a1+b1−a2+b2)

所以我们需要维护前缀的−a+b,a+b-a+b,a+b−a+b,a+b的最大值,后缀a−b,a+ba-b,a+ba−b,a+b的最大值。

线段树上随便做啊。

对于黑点白点只需要在线段树叶子节点处理一下这四个值就行了。


代码:

#include<bits/stdc++.h>
#define ll long long
#define re register
#define gc get_char
#define cs constnamespace IO{inline char get_char(){static cs int Rlen=1<<20|1;static char buf[Rlen],*p1,*p2;return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,Rlen,stdin),p1==p2)?EOF:*p1++;}inline int getint(){re char c;while(!isdigit(c=gc()));re int num=c^48;while(isdigit(c=gc()))num=(num+(num<<2)<<1)+(c^48);return num;}inline char getalpha(){re char c;while(!isalpha(c=gc()));return c;}
}
using namespace IO;using std::cout;
cs int N=1e5+5;
int n,q;
int last[N],to[N<<1],nxt[N<<1],ecnt;
inline void addedge(int u,int v){nxt[++ecnt]=last[u],last[u]=ecnt,to[ecnt]=v;nxt[++ecnt]=last[v],last[v]=ecnt,to[ecnt]=u;
}int in[N*3],tot,pos[N];
void dfs(int u,int fa){in[++tot]=-1;in[++tot]=u;pos[u]=tot;for(int re e=last[u],v=to[e];e;v=to[e=nxt[e]])if(v!=fa)dfs(v,u);in[++tot]=-2;
}cs int M=N*3<<2;
int a[M],b[M],l1[M],l2[M],r1[M],r2[M],dis[M];
bool col[N];inline void init(int k,int id){dis[k]=-1;a[k]=b[k]=0;l1[k]=l2[k]=r1[k]=r2[k]=-1e9;switch(in[id]){case -1:b[k]=1;break;case -2:a[k]=1;break;default:if(!col[in[id]])l1[k]=l2[k]=r1[k]=r2[k]=dis[k]=0;break;}
}inline void pushup(int k){int lc=k<<1,rc=k<<1|1;if(b[lc]>a[rc])a[k]=a[lc],b[k]=b[lc]-a[rc]+b[rc];else b[k]=b[rc],a[k]=a[lc]+a[rc]-b[lc];l1[k]=std::max(l1[lc],std::max(l1[rc]+a[lc]-b[lc],l2[rc]+a[lc]+b[lc]));l2[k]=std::max(l2[lc],l2[rc]-a[lc]+b[lc]);r1[k]=std::max(r1[rc],std::max(r1[lc]-a[rc]+b[rc],r2[lc]+a[rc]+b[rc]));r2[k]=std::max(r2[rc],r2[lc]+a[rc]-b[rc]);dis[k]=std::max(std::max(dis[lc],dis[rc]),std::max(r1[lc]+l2[rc],r2[lc]+l1[rc]));
}inline void build(int k,int l,int r){if(l==r)return init(k,l);int mid=(l+r)>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);pushup(k);
}inline void modify(int k,int l,int r,cs int &pos){if(l==r){col[in[pos]]^=1;init(k,pos);return ;}int mid=(l+r)>>1;if(pos<=mid)modify(k<<1,l,mid,pos);else modify(k<<1|1,mid+1,r,pos);pushup(k);
}signed main(){n=getint();for(int re i=1;i<n;++i)addedge(getint(),getint());dfs(1,0);build(1,1,tot);q=getint();while(q--)switch(getalpha()){case 'G':cout<<dis[1]<<"\n";break;case 'C':modify(1,1,tot,pos[getint()]);break;}return 0;
}

2019.03.21【ZJOI2007】【BZOJ1095】【洛谷P2056】Hide 捉迷藏(DFS序)(线段树)相关推荐

  1. 洛谷 - P1886 滑动窗口(单调队列/线段树)

    题目链接:点击查看 题目大意:给出一个由n个数构成的序列,再给出一个长度为k的窗口,这个窗口从第一个下标开始一直向后移动,每次移动一个单位,每次移动询问一次该窗口中的最大值和最小值,最后输出答案 题目 ...

  2. 【题解】洛谷P4145 花神游历各国(线段树)

    洛谷P4145:https://www.luogu.org/problemnew/show/P4145 思路 这道题的重点在于sqrt(1)=1 一个限制条件 与正常线段树不同的是区间修改为开方 那么 ...

  3. 洛谷P3960 列队(动态开节点线段树)

    题意 题目链接 Sol 看不懂splay..,看不懂树状数组... 只会暴力动态开节点线段树 观察之后不难发现,我们对于行和列需要支持的操作都是相同的:找到第\(k\)大的元素并删除,在末尾插入一个元 ...

  4. 洛谷 P4246 [SHOI2008]堵塞的交通 线段树

    题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个222行 C'>CCC列的矩形网格,网格上的每个点代表一个城市,相邻的城市 ...

  5. LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset

    题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...

  6. 洛谷P4839 P哥的桶 线段树+线性基

    传送门 题意:N个操作,第K个桶放一个X,查询L到R区间的桶任意数的异或最大值. P哥时不时地会找新女朋友,并把新找的女朋友丢进某个桶里面.我们用 1 k x 来表示P哥找了一个颜值为x的女朋友,并且 ...

  7. 洛谷P4837 养殖呆河马(线段树)

    题目描述 作为养殖场的大佬,阳阳引进了养殖呆河马的技术,而且她有一个团队来研究呆河马的养殖技巧来制定养殖规划,并在今年购入了 1 只呆河马.她们制定了从今年(即第 0 年)到第 n−1年的养殖呆河马的 ...

  8. 洛谷 P1433 吃奶酪 dfs剪枝

    洛谷 P1433 吃奶酪 dfs剪枝 题解: dfs+剪枝,不过现在好像被卡时间了,第10个点过不了.. 代码如下: #include<iostream> #include<algo ...

  9. ⌈洛谷1505⌋⌈BZOJ2157⌋⌈国家集训队⌋旅游【树链剖分】

    题目链接 [洛谷] [BZOJ] 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T ...

最新文章

  1. 微软职位内部推荐-Senior Software Engineer_Azure
  2. Httpwatch 工具介绍
  3. java 日期处理 口诀_java时间处理常用方法工具类
  4. weblogic修改控制台ip_「Weblogic学习」Weblogic知识要点之JNDI/JTA编程开发
  5. 内存泄露Lowmemorykiller分析
  6. redistemplate使用_spring-boot-starter-data-redis源码解析与使用实战
  7. angularjs--resource
  8. 《微观动机与宏观行为》精髓:个人的微观动机,是如何影响宏观行为结果的?
  9. 使用网云穿「内网穿透」实现外网访问内网瑞友天翼等软件
  10. 监控摄像头网页直播解决方案
  11. 51单片机之定时器/计数器0中断程序
  12. 解决teamviewer达到设备数量上限
  13. php whois查询,php whois查询API制作方法
  14. 服务器系统2016开始菜单,大法将致:将Windows Server 2016打造成个人办公系统,WIN2016打造成超级WIN10,WIN2016优化设...
  15. C语言之动态内存管理
  16. 优化店铺标题的好处在哪?如何写标题,什么样的标题能带来流量?
  17. 设计/前端 关于AE动画/特效web实现的四种方法
  18. TextSeek使用教程 (高级篇) - 文件搜索软件
  19. 【sdx62】WCN6856加载wlan.ko系统崩溃问题解决方案
  20. VREP(Coppeliarobotics)仿真介绍

热门文章

  1. 《关于UDEC7.0学习阶段心得|CSDN创作打卡》
  2. java 策略模式例子_java策略模式实例解析
  3. 树莓派远程4G遥控车教程(三)-摄像头安装及实现局域网实时监控
  4. (28) 基于手机信令数据的动态出行OD以及出行需求估计
  5. SSL证书转换如何操作?
  6. win10网上邻居无法访问0x80004005
  7. Matlab转Python问题之二维数组单索引寻值
  8. 程序学3DMax之自动展UV
  9. 将MNIST手写数字数据集导入NumPy数组(《深度学习入门:基于Python的理论与实现》实践笔记)
  10. 联想拯救者R7000(自带windows)安装ubuntu20.04,解决GTX1650驱动问题