2019.03.21【ZJOI2007】【BZOJ1095】【洛谷P2056】Hide 捉迷藏(DFS序)(线段树)
BZOJ传送门
洛谷传送门
解析:
其实就是QTREE4的弱化版,可以直接用QTREE4的解法来做。
但是这道题有优秀的O(nlogn)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序)(线段树)相关推荐
- 洛谷 - P1886 滑动窗口(单调队列/线段树)
题目链接:点击查看 题目大意:给出一个由n个数构成的序列,再给出一个长度为k的窗口,这个窗口从第一个下标开始一直向后移动,每次移动一个单位,每次移动询问一次该窗口中的最大值和最小值,最后输出答案 题目 ...
- 【题解】洛谷P4145 花神游历各国(线段树)
洛谷P4145:https://www.luogu.org/problemnew/show/P4145 思路 这道题的重点在于sqrt(1)=1 一个限制条件 与正常线段树不同的是区间修改为开方 那么 ...
- 洛谷P3960 列队(动态开节点线段树)
题意 题目链接 Sol 看不懂splay..,看不懂树状数组... 只会暴力动态开节点线段树 观察之后不难发现,我们对于行和列需要支持的操作都是相同的:找到第\(k\)大的元素并删除,在末尾插入一个元 ...
- 洛谷 P4246 [SHOI2008]堵塞的交通 线段树
题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个222行 C'>CCC列的矩形网格,网格上的每个点代表一个城市,相邻的城市 ...
- LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset
题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...
- 洛谷P4839 P哥的桶 线段树+线性基
传送门 题意:N个操作,第K个桶放一个X,查询L到R区间的桶任意数的异或最大值. P哥时不时地会找新女朋友,并把新找的女朋友丢进某个桶里面.我们用 1 k x 来表示P哥找了一个颜值为x的女朋友,并且 ...
- 洛谷P4837 养殖呆河马(线段树)
题目描述 作为养殖场的大佬,阳阳引进了养殖呆河马的技术,而且她有一个团队来研究呆河马的养殖技巧来制定养殖规划,并在今年购入了 1 只呆河马.她们制定了从今年(即第 0 年)到第 n−1年的养殖呆河马的 ...
- 洛谷 P1433 吃奶酪 dfs剪枝
洛谷 P1433 吃奶酪 dfs剪枝 题解: dfs+剪枝,不过现在好像被卡时间了,第10个点过不了.. 代码如下: #include<iostream> #include<algo ...
- ⌈洛谷1505⌋⌈BZOJ2157⌋⌈国家集训队⌋旅游【树链剖分】
题目链接 [洛谷] [BZOJ] 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T ...
最新文章
- 微软职位内部推荐-Senior Software Engineer_Azure
- Httpwatch 工具介绍
- java 日期处理 口诀_java时间处理常用方法工具类
- weblogic修改控制台ip_「Weblogic学习」Weblogic知识要点之JNDI/JTA编程开发
- 内存泄露Lowmemorykiller分析
- redistemplate使用_spring-boot-starter-data-redis源码解析与使用实战
- angularjs--resource
- 《微观动机与宏观行为》精髓:个人的微观动机,是如何影响宏观行为结果的?
- 使用网云穿「内网穿透」实现外网访问内网瑞友天翼等软件
- 监控摄像头网页直播解决方案
- 51单片机之定时器/计数器0中断程序
- 解决teamviewer达到设备数量上限
- php whois查询,php whois查询API制作方法
- 服务器系统2016开始菜单,大法将致:将Windows Server 2016打造成个人办公系统,WIN2016打造成超级WIN10,WIN2016优化设...
- C语言之动态内存管理
- 优化店铺标题的好处在哪?如何写标题,什么样的标题能带来流量?
- 设计/前端 关于AE动画/特效web实现的四种方法
- TextSeek使用教程 (高级篇) - 文件搜索软件
- 【sdx62】WCN6856加载wlan.ko系统崩溃问题解决方案
- VREP(Coppeliarobotics)仿真介绍
热门文章
- 《关于UDEC7.0学习阶段心得|CSDN创作打卡》
- java 策略模式例子_java策略模式实例解析
- 树莓派远程4G遥控车教程(三)-摄像头安装及实现局域网实时监控
- (28) 基于手机信令数据的动态出行OD以及出行需求估计
- SSL证书转换如何操作?
- win10网上邻居无法访问0x80004005
- Matlab转Python问题之二维数组单索引寻值
- 程序学3DMax之自动展UV
- 将MNIST手写数字数据集导入NumPy数组(《深度学习入门:基于Python的理论与实现》实践笔记)
- 联想拯救者R7000(自带windows)安装ubuntu20.04,解决GTX1650驱动问题