nowcoder172C 保护 (倍增lca+dfs序+主席树)

https://www.nowcoder.com/acm/contest/172/C

(sbw大佬太强啦 orz)

先把每一个路径(x,y)分成(x,lca),(y,lca)两个路径,然后就能发现,对于某两个(直上直下的)路径a,b,b的下端点在a的下端点子树中,且b的上端点深度<=a的上端点深度,那么b是覆盖a的。

这样的话,我们做一个dfs序,那么能覆盖某个路径的个数就是(下端点在dfs序对应的那个区间中的、上端点深度小于要覆盖的那个路径)的路径的个数。

而且比较容易发现,我们要求的其实就是dfs序那个区间里的深度第k小的路径。

这样的话,就可以搞一个主席树,以深度为权值,每条路径下端点的dfs序为时间往里加值,每次只要询问对应区间的第k小就可以。

不过要注意的是,我找出来的那个点深度大于我在做的这个点的深度的话,是不合法的,要判掉。

  1 #include<bits/stdc++.h>
  2 #define pa pair<int,int>
  3 #define ll long long
  4 using namespace std;
  5 const int maxn=200020,logn=22;
  6 
  7 ll rd(){
  8     ll x=0;char c=getchar();int neg=1;
  9     while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();}
 10     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
 11     return x*neg;
 12 }
 13 
 14 int N,M,L,Q;
 15 int lg[maxn],dep[maxn],fa[maxn][logn];
 16 int egh[maxn],eg[maxn*2][2],ect;
 17 int pth[maxn],pt[maxn*2][2],pct;
 18 int id[maxn],dfn[maxn][2],tot,lst[maxn];
 19 int ch[maxn*logn*8][2],sum[maxn*logn*8],root[maxn*2],rct;
 20 
 21 inline void adeg(int a,int b){
 22     eg[++ect][0]=b;eg[ect][1]=egh[a];egh[a]=ect;
 23 }
 24 inline void adpt(int a,int d){
 25     pt[++pct][0]=d;pt[pct][1]=pth[a];pth[a]=pct;
 26 }
 27 
 28 void dfs(int x){
 29     dfn[x][0]=++tot;id[tot]=x;
 30     for(int i=1;fa[x][i-1]&&fa[fa[x][i-1]][i-1];i++){
 31         fa[x][i]=fa[fa[x][i-1]][i-1];
 32     }
 33     for(int i=egh[x];i!=-1;i=eg[i][1]){
 34         if(dfn[eg[i][0]][0]) continue;
 35         dep[eg[i][0]]=dep[x]+1;fa[eg[i][0]][0]=x;
 36         L=max(L,dep[x]+1);dfs(eg[i][0]);
 37     }dfn[x][1]=tot;
 38 }
 39 
 40 inline int lca(int x,int y){
 41     if(dep[x]<dep[y]) swap(x,y);
 42     while(dep[x]>dep[y]){
 43         x=fa[x][lg[dep[x]-dep[y]]];
 44     }if(x==y) return x;
 45     for(int i=lg[dep[x]-1];i>=0;i--){
 46         if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
 47     }return fa[x][0];
 48 }
 49 
 50 void add(int &rn,int ro,int l,int r,int x){
 51     rn=++rct;sum[rn]=sum[ro]+1;
 52     if(l<r){int m=l+r>>1;
 53         if(x<=m){
 54             add(ch[rn][0],ch[ro][0],l,m,x);ch[rn][1]=ch[ro][1];
 55         }else{
 56             add(ch[rn][1],ch[ro][1],m+1,r,x);ch[rn][0]=ch[ro][0];
 57         }
 58     }
 59 }
 60 int query(int rn,int ro,int l,int r,int k){
 61     //printf("%d %d %d %d %d %d\n",l,r,rn,ro,sum[rn],sum[ro]);
 62     if(k>sum[rn]-sum[ro]) return -1;
 63     if(l==r) return l;
 64     else{
 65         int m=l+r>>1,w=sum[ch[rn][0]]-sum[ch[ro][0]];
 66         if(w>=k) return query(ch[rn][0],ch[ro][0],l,m,k);
 67         else return query(ch[rn][1],ch[ro][1],m+1,r,k-w);
 68     }
 69 }
 70 
 71 inline int solve(int x,int k){
 72     if(!k) return dep[x]-1;
 73     int y=query(root[lst[dfn[x][1]]],root[lst[dfn[x][0]-1]],1,L,k);
 74     if(y==-1||dep[x]<y) return 0;
 75     else return dep[x]-y;
 76 }
 77 
 78 int main(){
 79     //freopen("protect.in","r",stdin);
 80     int i,j,k;
 81     N=rd(),M=rd();memset(egh,-1,sizeof(egh));
 82     for(i=1,j=0,k=2;i<=N+10;i++){
 83         if(i>=k) j++,k<<=1;lg[i]=j;
 84     }
 85     for(i=1;i<N;i++){
 86         int a=rd(),b=rd();
 87         adeg(a,b);adeg(b,a);
 88     }dep[1]=1;dfs(1);memset(pth,-1,sizeof(pth));
 89     for(i=1;i<=M;i++){
 90         int a=rd(),b=rd();
 91         int x=lca(a,b);
 92         adpt(a,dep[x]);adpt(b,dep[x]);
 93     }
 94     for(i=1,k=0;i<=N;i++){
 95         for(j=pth[id[i]];j!=-1;j=pt[j][1]){
 96             ++k;add(root[k],root[k-1],1,L,pt[j][0]);
 97         }lst[i]=k;
 98     }
 99     Q=rd();
100     for(i=1;i<=Q;i++){
101         int a=rd(),b=rd();
102         printf("%d\n",solve(a,b));
103     }
104     return 0;
105 }

 

转载于:https://www.cnblogs.com/Ressed/p/9628631.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

添用户报错:useradd:警告:此主目录已经存在

转载自&#xff1a;http://blog.csdn.net/lele892207980/article/details/17239347 建立mysql用户、组 groupadd mysql useradd -g mysql mysql 然后删除 userdel mysql 再添用户和组加时&#xff0c;提示&#xff1a; useradd&#xff1a;警告&#xff1a;此主目录已经存在。…

专业本的C语言,以解决本专业问题为导向的C语言程序设计课程教学探索

以解决本专业问题为导向的C语言程序设计课程教学探索发布时间:2019-08-07 来源: 摘 要 针对C语言程序设计课程在计算机及其相关专业中存在的“狭义工具论”的教学现状&#xff0c;本着“以应用能力培养为目标、以计算思维为手段”的原则进行知识选取和教学内容、教学案例、教学…

HotSpot增量Java垃圾收集器

在我最近的博客文章“ 确定活动的HotSpot垃圾收集器”中 &#xff0c;我描述了可用于确定HotSpot JVM &#xff08;Java进程&#xff09;正在使用的垃圾收集器&#xff08;当从命令行参数&#xff08;标志&#xff09; 中看不出来&#xff09;时可以使用的不同方法。传递给Java…

修改已存在用户的所属组(usermod用法)

转载自&#xff1a;http://blog.163.com/zhzh_lin/blog/static/40538715200771503221224/ 修改使用者帐号 名称 usermod - 修 改 使 用 者 帐 号 语法 usermod [-c comment] [-d home_dir [ -m]] [-e expire_date] [-f inactive_time] [-g initial_group] [-G group[,.…

c语言如何查找空指针,c语言中的空指针

#include#include#define SAFE_MALLOC(n) safe_malloc(n)#define SAFE_FREE(p)safe_free((int**)(&(p)))//将变量指针赋值为空指针//若变量本身为空&#xff0c;则提示出现野指针void safe_free(int **p){if(*p){free(*p);*p NULL;printf("这不是野指针!!!,好开心. _…

eclipse pmd使用_使用您自己的规则在Eclipse中自定义PMD

eclipse pmd使用PMD是非常好的Java代码扫描程序&#xff0c;可帮助您避免潜在的编程问题。 它可以轻松扩展以满足您的需求&#xff0c;并且本文将为您带来与JPA的Enumerated注释用法相关的自定义PMD规则的简单示例。 在继续阅读之前&#xff0c;您应该检查我以前的文章之一-JPA…

linux bash source 0,linux中BASH_SOURCE[0](转)

在C/C中&#xff0c;__FUNCTION__常量记录当前函数的名称。有时候&#xff0c;在日志输出的时候包含这些信息是非常有用的。而在Bash中&#xff0c;同样有这样一个常量FUNCNAME&#xff0c;但是有一点区别是&#xff0c;它是一个数组而非字符串&#xff0c;其中数组的第一个元素…

如何将自定义数据源集成到Apache Spark中

如今&#xff0c;流数据是一个热门话题&#xff0c;而Apache Spark是出色的流框架。 在此博客文章中&#xff0c;我将向您展示如何将自定义数据源集成到Spark中。 Spark Streaming使我们能够从各种来源进行流传输&#xff0c;同时使用相同的简洁API访问数据流&#xff0c;执行…

linux用户管理练习题

转载自&#xff1a;http://blog.sina.com.cn/s/blog_6a8d2f120100qiyj.html 1)新建一个组group1,新建一个系统组group2 参考答案: groupadd group1 groupadd -r group2 cat /etc/group /etc/gshadow|grep group[1-2] 2)更改组group2的GID为103,更改组名为grouptest 参考答案:…

闪念-许久未来一切没变

好久好久没来逛社区了&#xff0c;前几天有空登录进来看看&#xff0c;好多以前的老朋友都还在&#xff0c;甚是欣慰。有种亲切的感觉&#xff0c;时间真的很快&#xff0c;差不多有3-4年没来玩社区了。经历了两家互联网行业级Top3的公司一度没有时间逛社区&#xff0c;玩社区交…

C语言麻将递归,C++数据结构与算法——麻将胡牌算法(二:完全胡牌算法)

虽然单花色胡牌算法面试时写出来了&#xff0c;但是完整的胡牌算法却没有写&#xff0c;既然遇到了&#xff0c;秉着不抛弃不放弃的精神&#xff0c;当然不能原谅懒惰的自己了。下面这篇为一个完整的胡牌算法。胡牌规则除了以下几点&#xff0c;其余与单花色胡牌规则一致&#…

第一行代码-第一章

模拟器和真机切换 点击app选择Configuration&#xff0c;Target选择USB设备或模拟器 真机不能获取debug日志 以360手机为例 1.拨号界面输入“*20121220#”&#xff0c;进入工程模式&#xff0c;点击日志输出等级。 2.修改以下选项 Log print enable 选 enable Java log level 选…

啊哈c语言推箱子小游戏,啊哈C入门版学完了,现发推箱子源代码~

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼该推箱子拥有对成绩的记录功能&#xff0c;因此,请挑战自己的最少步数吧&#xff01;源代码如下&#xff1a;#include #include int main(){system("color 0a");char a[9][11]{" ###### "," # ###",…

AIDA64制作机箱副屏/性能监控屏, 刷新慢问题

AIDA64制作机箱副屏/性能监控屏, 刷新慢问题 手上有闲置的手机/平板, 非闲置也行, 毕竟也没人边刷手机边打游戏吧AIDA64可以监控大多数参数, 放到一些酷炫的LCD模板上, 通过手机/平板等的浏览器就可访问这个页面, 实现无线监控 在网上找一个AIDA64, 安装文件-设置-LCD找到Rem…

javaone_JavaOne 2012:Java策略主题演讲和IBM主题演讲

javaone与 JavaOne 2010 相似&#xff0c;我对JavaOne 2012有了一个粗略的起点。由于“计算机和打印机技术上的困难”&#xff0c;办理登机手续的人花了70分钟为我提供JavaOne徽章。 尽管我不是世界上最有耐心的人&#xff0c;但比等待更令人失望的是&#xff0c;我错过了参加“…

常用正则表达式(?i)忽略字母的大小写!

转载自&#xff1a;http://blog.csdn.net/iwanttoknow7/article/details/5773285 1。^/d$  //匹配非负整数&#xff08;正整数 0&#xff09; 2 。 ^ [ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * $   // 匹配正整数 3 。 ^ (( - /d) | ( 0))$   // 匹配非正整数&#xff08;负…

内存刷新机制

red log buffer、data buffer、binlog cache。在O和M中&#xff0c;讲究日志先行策略&#xff0c;就是一条DML语句进入数据库之后&#xff0c;都会先写日志&#xff0c;再写数据文件。 1.red log&#xff0c; 重做日志文件&#xff0c;用于记录事务操作的变化&#xff0c;记录的…

android 字符串对齐,android – 使用Spanable String对齐ImageSpan

我知道有很多相同类型的问题可供使用,我尝试了很多解决方案,但所有这些问题都达不到我的要求.我的问题是我必须在包含Spanable字符串和Imagespan的文本之间添加动态行间距,但是当我添加行间距时,文本和图像的对齐会变形.我已经尝试了Stackoverflow上几乎所有可用的解决方案,如t…

如何将JBoss HR员工奖励项目放入云端

我们一直在讨论为什么应用程序开发人员在App Dev Cloud Stack系列中不能再忽略其堆栈了。 我们从头到尾讨论了各个层&#xff0c;但尚未为您提供除Red Hat Container Development Kit&#xff08;CDK&#xff09;之外的任何应用程序开发工具。 到目前为止&#xff0c;您所拥有…

用JIRA管理你的项目

https://blog.csdn.net/gaowenhui2008/article/details/70241657 (一) JIRA环境搭建 转载于:https://www.cnblogs.com/eustoma/p/9637509.html