CF1899 G. Unusual Entertainment [二维数点/二维偏序]

传送门:CF

[前题提要]:没什么好说的,区域赛爆炸之后发愤加训思维题.秒了div3 A~F的脑筋急转弯,然后被G卡了,树剖dfs序的想法已经想到了,题目也已经化简为两个线段是否存在一个合法位置了.但是MD不会二维数点,用一个树剖+扫描线搞来搞去最后还是Tle.果然如下图所说:科技还是十分重要的.

在这里插入图片描述


首先读完题意.不难想到本题应该是一道数据结构题.因为对于 x x x的儿子节点我们是可以直接使用 d f s dfs dfs序或者树链剖分直接维护出来编号的.所以对于我们的每一个询问,相当于求出区间 [ l , r ] [l,r] [l,r]是否存在一个点,它的 d f s dfs dfs序在x的子孙节点中.

设我们维护出来的 x x x的子孙节点(包括他自己)区间为 [ L x , R x ] [L_x,R_x] [Lx,Rx](这里需要提一句的是对于一个节点的所有儿子来说,它的 d f s dfs dfs序一定是连续的,具体证明此处略).设一个点 u u u d f s dfs dfs,为 d f n ( u ) dfn(u) dfn(u).那么现在这道题就是问是否存在一个点在序列中的位置为 k ∈ [ l , r ] k\in[l,r] k[l,r],然后 d f n ( k ) ∈ [ L x , R x ] dfn(k)\in[L_x,R_x] dfn(k)[Lx,Rx].

额.当时我就卡在了这个维护上.但其实这是一个很模板的二维偏序(二维数点)问题.模板题指路
我们将 x ∈ [ l , r ] x\in[l,r] x[l,r]看成横坐标,将所有 d f n ( x ) dfn(x) dfn(x)看成纵坐标.那么就是问你是否存在一个点 ( x , d f n ( x ) ) (x,dfn(x)) (x,dfn(x))在一个矩形区域内.这是一个很典型的二维数点问题.考虑将所有的询问矩形区域使用二维前缀和的思想进行化解,然后离线下来一个一个枚举,在枚举的过程中,将所有的点逐个加入到我们的树状数组中.只要保证所有点的横坐标小于当前询问区域,我们就可以将二维询问问题转化为一维询问,只要用树状数组维护一下就行了.


下面是具体的代码部分:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define root 1,n,1
#define ls rt<<1
#define rs rt<<1|1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {ll x=0,w=1;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x*w;
}
inline void print(__int128 x){if(x<0) {putchar('-');x=-x;}if(x>9) print(x/10);putchar(x%10+'0');
}
#define maxn 200010
const double eps=1e-8;
#define	int_INF 0x3f3f3f3f
#define ll_INF 0x3f3f3f3f3f3f3f3f
inline int lowbit(int x) {return x&(~x+1);
}
int tree[maxn];int n,q;
void Add(int pos,int val) {while(pos<=n) {tree[pos]+=val;pos+=lowbit(pos);}
}
int Query(int pos) {int ans=0;while(pos) {ans+=tree[pos];pos-=lowbit(pos);}return ans;
}
vector<int>edge[maxn];
int in[maxn],out[maxn];int tot=0;
void dfs(int u,int per_u) {in[u]=++tot;for(auto v:edge[u]) {if(v==per_u) continue;dfs(v,u);}out[u]=tot;
}
int Ans[maxn];int p[maxn];
int main() {int T=read();while(T--) {n=read();q=read();for(int i=1;i<n;i++) {int u=read();int v=read();edge[u].push_back(v);edge[v].push_back(u);}dfs(1,0);for(int i=1;i<=n;i++) {p[i]=read();p[i]=in[p[i]];}vector<tuple<int,int,int,int> >Q;for(int i=1;i<=q;i++) {int l=read();int r=read();int x=read();Q.push_back({l-1,in[x]-1,i,1});Q.push_back({l-1,out[x],i,-1});Q.push_back({r,in[x]-1,i,-1});Q.push_back({r,out[x],i,1});}sort(Q.begin(),Q.end());int cur=0;for(auto [a,b,id,val]:Q) {while(cur+1<=a) {cur++;Add(p[cur],1);}Ans[id]+=val*Query(b);}for(int i=1;i<=q;i++) {cout<<(Ans[i]>0?"YES":"NO")<<endl;}tot=0;for(int i=1;i<=n;i++) {tree[i]=0;edge[i].clear();in[i]=out[i]=0;}for(int i=1;i<=q;i++) {Ans[i]=0;}}return 0;
}

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

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

相关文章

详谈动态规划问题并解最大子数组和

今天刷力扣又学会了一种算法----动态规划&#xff0c;经过我查阅不少资料后&#xff0c;这些我总结的分享给大家 动态规划是什么&#xff1f; 动态规划&#xff08;Dynamic Programming&#xff09;是一种求解最优化问题的数学方法&#xff0c;它通常用于解决具有重叠子问题和…

学习模拟简明教程【Learning to simulate】

深度神经网络是一项令人惊叹的技术。 有了足够的标记数据&#xff0c;他们可以学习为图像和声音等高维输入生成非常准确的分类器。 近年来&#xff0c;机器学习社区已经能够成功解决诸如对象分类、图像中对象检测和图像分割等问题。 上述声明中的加黑字体警告是有足够的标记数…

【高并发内存池】第一篇 项目简介及定长内存池

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

二十三种设计模式全面解析-当你的对象需要知道其他对象的状态变化时,观察者模式是你的救星!

在软件设计的世界中&#xff0c;有一种设计模式以其简洁而强大的特性闪耀着光芒&#xff0c;它就是——观察者模式&#xff08;Observer Pattern&#xff09;。这个模式它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象&#xff0c;为我们创造…

035、目标检测-物体和数据集

之——物体检测和数据集 目录 之——物体检测和数据集 杂谈 正文 1.目标检测 2.目标检测数据集 3.目标检测和边界框 4.目标检测数据集示例 杂谈 目标检测是计算机视觉中应用最为广泛的&#xff0c;之前所研究的图片分类等都需要基于目标检测完成。 在图像分类任务中&am…

OpenGL_Learn13(材质)

1. 材质 cube.vs #version 330 core layout (location 0) in vec3 aPos; layout (location 0 ) in vec3 aNormal;out vec3 FragPos; out vec3 Normal;uniform mat4 model; uniform mat4 view; uniform mat4 projection;void main() {FragPosvec3(model*vec4(aPos,1.0));Norma…

【Java程序员面试专栏 专业技能篇】Java SE核心面试指引

关于Java SE部分的核心知识进行一网打尽&#xff0c;包括四部分&#xff1a;基础知识考察、面向对象思想、核心机制策略、Java新特性&#xff0c;通过一篇文章串联面试重点&#xff0c;并且帮助加强日常基础知识的理解&#xff0c;全局思维导图如下所示&#xff1a;

STM32-基本定时器

一、基本定时器的作用 定时触发输出直接驱动DAC。 二、基本定时器的框图 以STM32F103系列为例&#xff0c;具体开发板请查看开发手册。 类别定时器总线位数计数方向预分频系数是否可以产生DMA捕获/比较通道互补输出基本定时器TIM6 / TIM7APB116位向上1~65536可以0无通用定时…

Yolov5安装运行过程中出现的问题

Yolov5安装运行过程中出现的问题合集 安装问题pip 安装 requirements.txtcmd下如何退出python&#xff1f;升级numpy protobuf版本过高AttributeError: Can’t get attribute ‘SPPF’ on <module ‘models.common’ from 地址找不到图片NameError: name warnings is not de…

Spring Cloud学习(九)【Elasticsearch 分布式搜索引擎01】

文章目录 初识 elasticsearch了解 ES倒排索引ES 的一些概念安装es、kibana安装elasticsearch部署kibana 分词器安装IK分词器ik分词器-拓展词库 索引库操作mapping 映射属性索引库的 CRUD 文档操作添加文档查看、删除文档修改文档Dynamic Mapping RestClient 操作索引库什么是Re…

后端老项目迁移方法

老项目迁移方法 需求&#xff1a; 因某个模块MySQL表结构、表关系 错乱复杂&#xff0c;而且其他模块的代码也在操作这个模块的数据库 耦合严重 导致Web工程代码紊乱、不易理解、性能低下&#xff0c; 故在 系统由A JavaWeb工程迁移至B工程 时&#xff0c;重构MySQL表结构、表…

计算机毕业设计选题推荐-个人健康微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…