[HZOI 2016]tree—增强版
[HZOI 2016]tree—增强版
注意事项
为了体现增强版,题目限制和数据范围有所增强:
时间限制:1.5s
内存限制:128MB
对于15% 的数据,1<=N,Q<=1000.
对于35% 的数据,1<=N,Q<=10000.
对于50% 的数据,1<=N,Q<=100000,且数据均为官方数据.
对于100% 的数据,1<=N,Q<=1000000.
请注意常数因子对于程序运行的影响。
解题报告
原题数据水到不行= =
直接找父节点都能上榜= =
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
inline int read(){
int sum();
char ch(getchar());
for(;ch<''||ch>'';ch=getchar());
for(;ch>=''&&ch<='';sum=sum*+(ch^),ch=getchar());
return sum;
}
struct edge{
int e;
edge *n;
edge():e(),n(NULL){}
}a[],*pre[];
int tot;
inline void insert(int s,int e){
a[++tot].e=e;
a[tot].n=pre[s];
pre[s]=&a[tot];
}
int n,q;
char op[];
bool bj[];
int fa[];
inline void dfs(int u){
for(edge *i=pre[u];i;i=i->n){
int e(i->e);
if(e!=fa[u]){
fa[e]=u;
dfs(e);
}
}
}
inline int query(int u){
while(!bj[u])
u=fa[u];
return u;
}
inline int gg(){
freopen("heoi2016_tree.in","r",stdin);
freopen("heoi2016_tree.out","w",stdout);
memset(pre,NULL,sizeof(pre));
n=read(),q=read();
bj[]=;
for(int i=;i<n;++i){
int x(read()),y(read());
insert(x,y),insert(y,x);
}
dfs();
while(q--){
scanf("%s",op);
int x(read());
if(op[]=='Q')
printf("%d\n",query(x));
else
bj[x]=;
}
return ;
}
int K(gg());
int main(){;}
然而加强版数据真的不是闹着玩的= =
首先我们看,它是一个不断往上爬,直到爬到第一个有标记的点或者是根节点时才停止的过程,那么我们很容易想到树剖,从当前节点往上爬就好了
同时我们注意到,题目要求找离当前节点最近的被标记的祖先,所以我们只要去找深度最深的被标记的祖先即可,而由树链剖分中$dfs$序的性质可知,在同一条链上越深的节点,它的时间戳就越大,那么我们显然可以维护一颗最大值的线段树,假如该点被标记,就把它的时间戳加入线段树
剩下的就很好实现了
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std;
inline int read(){
int sum=;
char ch=getchar();
for(;ch<''||ch>'';ch=getchar());
for(;ch>=''&&ch<='';sum=sum*+(ch^),ch=getchar());
return sum;
}
struct edge{
int e,n;
}a[];
int pre[];
int tot;
inline void insert(int s,int e){
a[++tot].e=e;
a[tot].n=pre[s];
pre[s]=tot;
}
int dep[],fa[],son[],size[];
inline void dfs1(int u){
size[u]=,son[u]=;
for(int i=pre[u];i!=-;i=a[i].n){
int e=a[i].e;
if(e!=fa[u]){
fa[e]=u;
dep[e]=dep[u]+;
dfs1(e);
size[u]+=size[e];
if(size[e]>size[son[u]])
son[u]=e;
}
}
}
int cnt;
int top[],id[],pos[];
inline void dfs2(int u,int rt){
top[u]=rt;
id[u]=++cnt;
pos[cnt]=u;
if(son[u])
dfs2(son[u],rt);
else
return;
for(int i=pre[u];i!=-;i=a[i].n){
int e=a[i].e;
if(e!=fa[u]&&e!=son[u])
dfs2(e,e);
}
}
int mx[];
inline void pushup(int i){
mx[i]=max(mx[i<<],mx[i<<|]);
}
inline void update(int pos,int l,int r,int i){
if(l==r){
mx[i]=pos;
return;
}
int mid=l+r>>;
if(pos<=mid)
update(pos,l,mid,i<<);
else
update(pos,mid+,r,i<<|);
pushup(i);
}
inline int query(int ll,int rr,int l,int r,int i){
if(ll<=l&&r<=rr)
return mx[i];
int mid=l+r>>,ret=;
if(ll<=mid)
ret=max(query(ll,rr,l,mid,i<<),ret);
if(mid<rr)
ret=max(query(ll,rr,mid+,r,i<<|),ret);
return ret;
}
int n,q;
char op[];
inline int ask(int x){
int ret();
while(x){
int tmp=query(id[top[x]],id[x],,n,);
if(tmp)
ret=dep[ret]>dep[pos[tmp]]?ret:pos[tmp];
x=fa[top[x]];
}
return ret;
}
int main(){
int __size__ = << ;
char *__p__ = (char*)malloc(__size__) + __size__;
__asm__("movl %0, %%esp\n" :: "r"(__p__));
freopen("tree++.in","r",stdin);
freopen("tree++.out","w",stdout);
memset(pre,-,sizeof(pre));
n=read(),q=read();
for(int i=;i<n;++i){
int x=read(),y=read();
insert(x,y);
}
dfs1();
dfs2(,);
int x;
update(id[],,n,);
for(int i=;i<q;++i){
scanf("%s",op);
x=read();
if(op[]=='Q')
printf("%d\n",ask(x));
else
update(id[x],,n,);
}
return ;
}
[HZOI 2016]tree—增强版的更多相关文章
- office 2016 专业增强版 和 visio 2016 专业版 下载安装(附带激活工
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://babyshen.blog.51cto.com/8405584/1697910 o ...
- [系统相关]WPS Office 2016 专业增强版 10.8.0.6470 免序列号无限制
WPS Office (10.8.0.6470) 新增功能列表 ============================================= 改进功能列表 ------------ W ...
- 【办公】Microsoft Office 2016 专业增强版下载及永久激活-亲测分享
Win7 x64,安装 Office 2016. 1. 下载 Office 2016,用迅雷网上下载飞快.(这里分享我的下载链接,2.39G用迅雷分分钟就下好了) 2. 按 此博客 ,安装激活工具. ...
- 微软发布 Windows Server 2016 预览版第三版,开发者要重点关注Nano Server
微软已经发布 Windows Server 2016 和 System Center 2016 第三个技术预览版,已经提供下载.Windows Server 2016 技术预览版第三版也是首个包括了容 ...
- 最新GHOST XP系统下载旗舰增强版 V2016年
系统来自:系统妈:http://www.xitongma.com 深度技术GHOST xp系统旗舰增强版 V2016年3月 系统概述 深度技术ghost xp系统旗舰增强版集合微软JAVA虚拟机IE插 ...
- 最新深度技术GHOST XP系统旗舰增强版 V2016年
来自系统妈:http://www.xitongma.com 深度技术GHOST xp系统旗舰增强版 V2016年 系统概述 深度技术ghost xp系统旗舰增强版集合微软JAVA虚拟机IE插件,增强浏 ...
- WinNTSetup v3.8.7 正式版绿色增强版
最强系统安装利器:WinNTSetup 现已更新至 v3.8.7 正式版!这次更新修复调整了诸多问题,新版非常好用接近完美!WinNTSetup 现在已经自带BCDBoot 选项,并且完全支持Wind ...
- 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版
<zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...
- zw版_zw中文增强版Halcon官方Delphi例程
[<zw版·delphi与halcon系列原创教程>zw版_zw中文增强版Halcon官方Delphi例程 源码下载:http://files.cnblogs.com/files/ziwa ...
随机推荐
- Linux进程状态解析
引言 Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态. 在下文将对进程的R.S.D.T.Z.X 六种状态做个说明. PROCE ...
- PCB 使用第3方网站做为外链图片资源
计划将Web版SI9000阻抗计算工具放外网了,由于个人网站带宽太小原因, 准备将静态的图片资源放在第三方网站,今天找了好几个图床网站,把阻抗模型图上传到图床网站,这样一来就能解决带宽的问题了,今天折 ...
- 关于swoole 和golang 的压力测试结果
一.环境介绍 linux centos7 php7.1.18 go1.12.1 2核4G内存 二.代码 swoole代码 <?php $http = new swoole_http_server ...
- ORA-01012:not logged on的解决办法
conn / as sysdba 报错ORA-01012: not logged on 发生原因:关闭数据库是shutdown 后面没有接关闭参数中的任何一个. nomal ————- —-所有连接都 ...
- [转]mysql视图学习总结
转自:http://www.cnblogs.com/wangtao_20/archive/2011/02/24/1964276.html 一.使用视图的理由是什么?1.安全性.一般是这样做的:创建一个 ...
- Recyclerview点击事件,更新item的UI+更新Recyclerview外的控件
项目中用到了Recyclerview,在第一行代码中学到了一种相对来说简单的点击事件方法,可是这种点击事件是在adapter中写的,没有教怎么更新item的ui和更新Recyclerview之外的控件 ...
- servlet的多线程并发问题
package gz.itcast.e_thread; import java.io.IOException; import javax.servlet.ServletException; impor ...
- WCF开发的流程-服务端和客户端之间的通讯(内含demo讲解)
讲解技术之前,恳请博友让我说几句废话.今天是我第一在博客园发布属于自己原创的博文(如有雷同,那是绝对不可能的事,嘿嘿).之前一直是拜读各位博友的大作,受益匪浅的我在这对博友们说声谢谢,谢谢你们的共享! ...
- HashMap中capacity、loadFactor、threshold、size等概念的解释
约定 约定前面的数组结构的每一个格格称为桶 约定桶后面存放的每一个数据称为bin bin这个术语来自于JDK 1.8的HashMap注释. size size表示HashMap中存放KV的数量(为链表 ...
- Replacing Threads with Dispatch Queues
Replacing Threads with Dispatch Queues To understand how you might replace threads with dispatch que ...


