51nod-猴猴的比赛【莫队,线段树】

正题

题目链接:https://www.51nod.com/Contest/Problem.html#contestProblemId=1150


题目大意

给出两颗nnn个点的树,求有多少个点(i,j)(i,j)(i,j)对使得在两棵树中iii都是jjj的祖先。


解题思路

dfsdfsdfs序中一个节点的孩子是在一个连续的区间中的。所以对于第一棵树的每个节点的区间都作为询问,用莫队进行排序。

之后区间每次加入一个节点我们就在线段树中给另一棵树该节点对应的dfsdfsdfs序位置+1+1+1,然后询问即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
const int N=110000;
struct edge_node{int to,next;
}e1[N*2],e2[N*2];
struct tree_node{int l,r,w,lazy,num;
};
struct ques_node{int l,r,id,pos;
}q[N];
bool cmp(ques_node x,ques_node y){return x.pos<y.pos||(x.pos==y.pos&&x.r<y.r);
}
int n,tot1,tot2,cnt,w,t,ans;
int dfn1[N],rfn1[N],ed1[N],ls1[N];
int dfn2[N],rfn2[N],ed2[N],ls2[N];
struct LineTree{tree_node t[N*4];void Build(int x,int l,int r){t[x].l=l;t[x].r=r;if(l==r)return;int mid=(l+r)/2;Build(x*2,l,mid);Build(x*2+1,mid+1,r);}int Ask(int x,int l,int r){if(t[x].l==l&&t[x].r==r)return t[x].w;int mid=(t[x].l+t[x].r)/2;if(r<=mid) return Ask(x*2,l,r);if(l>mid) return Ask(x*2+1,l,r);return Ask(x*2,l,mid)+Ask(x*2+1,mid+1,r); }void Change(int x,int pos,int num){if(t[x].l==t[x].r){t[x].w+=num;return;}if(pos<=t[x*2].r) Change(x*2,pos,num);else Change(x*2+1,pos,num);t[x].w=t[x*2].w+t[x*2+1].w;}
}Tree;
void add1(int x,int y)
{e1[++tot1].to=y;e1[tot1].next=ls1[x];ls1[x]=tot1;
}
void add2(int x,int y)
{e2[++tot2].to=y;e2[tot2].next=ls2[x];ls2[x]=tot2;
}
void dp1(int x,int fa)
{rfn1[x]=++cnt;dfn1[cnt]=x;for(int i=ls1[x];i;i=e1[i].next){int y=e1[i].to;if(y==fa) continue;dp1(y,x);}ed1[x]=cnt;
}
void dp2(int x,int fa)
{rfn2[x]=++cnt;dfn2[cnt]=x;for(int i=ls2[x];i;i=e2[i].next){int y=e2[i].to;if(y==fa) continue;dp2(y,x);}ed2[x]=cnt;
}
int main()
{scanf("%d",&n);t=sqrt(n);for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);add1(x,y);add1(y,x);}for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);add2(x,y);add2(y,x);}dp1(1,1);cnt=0;dp2(1,1);Tree.Build(1,1,n);for(int i=1;i<=n;i++)q[i].l=rfn1[i],q[i].r=ed1[i],q[i].id=i,q[i].pos=(q[i].l-1)/t+1;sort(q+1,q+1+n,cmp);int l=1,r=0;for(int i=1;i<=n;i++){while(l>q[i].l) Tree.Change(1,rfn2[dfn1[--l]],1);while(r<q[i].r) Tree.Change(1,rfn2[dfn1[++r]],1);while(l<q[i].l) Tree.Change(1,rfn2[dfn1[l++]],-1);while(r>q[i].r) Tree.Change(1,rfn2[dfn1[r--]],-1);ans+=Tree.Ask(1,rfn2[q[i].id],ed2[q[i].id])-1;}printf("%d",ans);
}

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

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

相关文章

北方大学 ACM 多校训练赛 第十五场 买花

显然是一个比较简单的离线查询问题。 本质上是对区间求集合的问题&#xff0c;按照区间右端点从小到大对区间进行排序&#xff0c;然后用一个指针curr表示当前正在考虑区间的最右侧位置&#xff0c;针对排好序区间[tarl,tarr]&#xff0c;先查看curr是否到达tarr&#xff0c;如…

使用CoreRT将.NET Core发布为Native应用程序

在上一篇文章《使用.NET Core快速开发一个较正规的命令行应用程序》中我们看到了使用自包含方式发布的.NET Core应用中包含了216个文件。我就写一个cat命令用得着这么动真格。。。这写出来的命令行还有人用吗&#xff1f;今天我们就来介绍一下MS的另一个开源项目CoreRT。用来解…

P4343-[SHOI2015]自动刷题机【二分答案】

正题 题目链接:https://www.luogu.org/problem/P4343 题目大意 nnn个操作每个操作加几行代码或减几行代码&#xff0c;若代码积累到xxx行就自动删除所有代码并切掉一道题。 已知道切掉了kkk题&#xff0c;求最大和最小的xxx 解题思路 因为xxx和切题的数量单调&#xff0c;所…

北方大学 ACM 多校训练赛 第十五场 欢度6.18

把式子变成a[i]1 p(a[i-1]1)q[a[i-2]1]&#xff0c;矩阵快速幂搞定。复杂度o(logn) #include <iostream> #include <cstdio> using namespace std; #define int long long int x,y,p,q,n; const int MOD 1000000007;int fast_mod(int n) // 求 (t^n)%MOD {i…

.NET Core 2.1预览版首次引入Global Tools

Global Tools是.NET Core 2.1预览版中其中一个初次出现的特性。Global Tools提供了一种方法&#xff0c;让开发人员编写的.NET Core应用可以打包成NuGet包交付。如果.NET Core运行在目标平台上&#xff0c;那么一个恰当打包的Global Tool就可以在那上面运行。JavaScript开发人员…

P5253-丢番图【数论】

正题 题目链接:https://www.luogu.org/problem/P5253 题目大意 给一个nnn&#xff0c;求有多少对x,y(x≤y)x,y(x\leq y)x,y(x≤y)使得 1x1y1n\frac{1}{x}\frac{1}{y}\frac{1}{n}x1​y1​n1​ 解题思路 xyxy1n\frac{xy}{xy}\frac{1}{n}xyxy​n1​ n(xy)xyn(xy)xyn(xy)xy xy−n…

最小费用购物问题

西安交大 软件53 蔡少斐 题号&#xff1a;3_14 题目叙述&#xff1a; 某商店中每种商品都有一个价格。例如&#xff0c;一朵花的价格是2 ICU(ICU 是信息学竞赛的货币的单位&#xff09;;一个花瓶的价格是5 ICU。为了吸引更多的顾客&#xff0c;商店提供了特殊优惠价。 特殊优…

开源服务容错处理库Polly使用文档

在进入SOA之后&#xff0c;我们的代码从本地方法调用变成了跨机器的通信。任何一个新技术的引入都会为我们解决特定的问题&#xff0c;都会带来一些新的问题。比如网络故障、依赖服务崩溃、超时、服务器内存与CPU等其它问题。正是因为这些问题无法避免&#xff0c;所以我们在进…

P2638-安全系统【数论,组合数学】

正题 题目链接:https://www.luogu.org/problem/P2638 题目大意 aaa个不同的000&#xff0c;bbb个不同的111。nnn个位置每个可以放0,10,10,1可以都放也可以不放也可以只放一个。然后求方案数。 解题思路 答案就是(∑i0aCni∗Cai)∗(∑i0bCni∗Cbi)(\sum_{i0}^a C_{n}^{i}*C_{a…

宝石排列问题

西安交大 软件53 蔡少斐 题号&#xff1a;5_10 题目叙述&#xff1a; 现有n种不同形状的宝石&#xff0c;每种n颗&#xff0c;共n*n颗。同一形状的n颗宝石分别具有n种不同的颜色c1,c2,…,cn中的一种颜色。欲将这n*n颗宝石排列成n行n列的一个方阵&#xff0c;使方阵中每一行…

大部分Intel hardware intrinsic 将在 .NET Core 2.1 中启用

编者注&#xff1a;SIMD via C# 引入了一套全新的机制&#xff0c;使得C# 以后可以像C/C 一样直接使用intrinsic functions 来直接操作Intel CPU 的大多数SIMD 指令了&#xff08;从SSE 到AVX2&#xff09;随着 .NET Core 2.1 发布的临近&#xff0c;上周CoreCLR 已经停止向mas…

运动员最佳配对问题

西安交大 软件53 蔡少斐 题号&#xff1a;6_5 题目叙述&#xff1a; 羽毛球队有男女运动员各n人。 给定2个nn矩阵P和Q。P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势&#xff1b;Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势。 由于技术配合…

P2217-[HAOI2007]分割矩阵【dfs,记忆化搜索】

正题 题目链接:https://www.luogu.org/problem/P2217 题目大意 a∗ba*ba∗b的矩阵&#xff0c;分成nnn个矩阵&#xff0c;求每个矩阵均方差最小&#xff0c;求答案。 解题思路 切n−1n-1n−1刀 设fk,x1,y1,x2,y2f_{k,x1,y1,x2,y2}fk,x1,y1,x2,y2​表示矩阵(x1,y1,x2,y2)(x1,y…

play框架入门操作

Play的基本特性&#xff1a;1、Play框架使用REST的开发风格&#xff0c;不用严格按照复杂的J2EE规范&#xff0c;是Java敏捷开发的首选。2、Play框架提供多种支持&#xff1a;NIO&#xff0c;JPA&#xff0c;Groovy以及各种工具类。3、Play框架会自动编译Java源文件&#xff0c…

动态规划练习1 [导弹拦截]

【问题描述】 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷&#xff1a;虽然 它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。某天&#xff0c;雷达捕捉到 敌国的导弹来袭。由于该…

TensorflowSharp 简单使用与KNN识别MNIST流程

机器学习是时下非常流行的话题&#xff0c;而Tensorflow是机器学习中最有名的工具包。TensorflowSharp是Tensorflow的C#语言表述。本文会对TensorflowSharp的使用进行一个简单的介绍。本文会先介绍Tensorflow的一些基本概念&#xff0c;然后实现一些基本操作例如数字相加等运算…

1、jquery事件绑定和委托的实现

jQuery的事件绑定和委托可以使用 on()、one()、bind()、live()、delegate()等方法实现。 1、on() &#xff1a; 语法&#xff1a;$(selector).on(event,childSelector,data,function) 作用&#xff1a;可以在被选元素及子元素上添加一个或多个事件处理程序&#xff0c;并且…

刷题bingo挑战赛1

前言 为了提高做题效率&#xff0c;最近发现了个玩bingo的好网站 https://bingosync.com 然后就有了这场bingobingobingo赛。 正题 生成代码 [ {"name":"P2638"},{"name":"P4265"},{"name":"P2331"},{"n…

动态规划练习2 [合唱队形]

N 位同学站成一排&#xff0c;音乐老师要请其中的 (N-K) 位同学出列&#xff0c;使得剩下的 K 位同学排成合唱队形。 合唱队形是指这样的一种队形&#xff1a;设 K 位同学从左到右依次编号为 1 &#xff0c; 2 …&#xff0c; K &#xff0c;他们的身高分别为 T1 &#x…

ASP.NET Core Web 支付功能接入 微信-扫码支付篇

这篇文章将介绍ASP.NET Core中使用 开源项目 Payment&#xff0c;实现接入微信-扫码支付及异步通知功能。开发环境&#xff1a;Win 10 x64、VS2017 15.6.4、.NET Core SDK 2.1.101、.NET Core Runtime 2.0.61.新建"ASP.NET Core Web 应用程序"项目&#xff0c;我将它…