CF1479D Odd Mineral Resource

CF1479D Odd Mineral Resource

题意:

给定一棵树,每个点有颜色 cic_ici,多次查询,每次给定 u,v,l,r,你需要给出一个颜色 x,使得 x 满足:
x∈[l,r]x\in [l,r]x[l,r]
x在u到v的路径上出现了奇数次。x 在 u 到 v 的路径上出现了奇数次。xuv
你需要对于每组查询给出 x,如果一组查询不存在合法的 x,则输出 -1。
n,m≤3×105n,m\le 3\times 10^5n,m3×105

题解:

如果有做过这个题P4396 [AHOI2013]作业,那么本题的大体思路就直接出了
对于x∈[l,r]x\in[l,r]x[l,r]部分我们可以用莫队来做,对于x在u到v路径上出现了奇数次,我们可以用分块来做
题目给的是一个数,所以是树上莫队,先用dfs序转化成链,可以用树剖来写,一边求dfs序还求了lca(求lca是树上莫队要用的)
复杂度O(nsqrt(n))
好想不好写,还是我代码能力太差了
树上莫队
树剖求lca

代码:

#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
void read(){};
template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar)
{x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...);
}
template <typename T> inline void write(T x)
{if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0');
}
void rd_test()
{
#ifdef ONLINE_JUDGE
#elsestartTime = clock ();freopen("data.in", "r", stdin);
#endif
}
void Time_test()
{
#ifdef ONLINE_JUDGE
#elseendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int MAXN= 3e5 + 5;
int n, m,cnt_n, Eular[MAXN << 1];
int a[MAXN], Block, Num_Block;
int dep[MAXN], ys[MAXN << 1], val[MAXN], sum[MAXN], in[MAXN];
int out[MAXN], ans[MAXN], book[MAXN];
struct Query
{int x, y, l, r, id, lca;
} q[MAXN];
bool cmp(const Query& in, const Query& sec)
{return (ys[in.x] ^ ys[sec.x]) ? (in.x < sec.x) : ((ys[in.x] & 1) ? (in.y < sec.y) : (in.y > sec.y));
}
//--树剖部分
vector<int>vec[MAXN];
int siz[MAXN];
int dfn[MAXN];
int f[MAXN];
int son[MAXN];
int top[MAXN];
void dfs_getson(int u,int fa){siz[u]=1;Eular[++cnt_n]=u;in[u]=cnt_n;for(auto v:vec[u]){if(v==fa)continue;dep[v]=dep[u]+1;f[v]=u;dfs_getson(v,u);siz[u]+=siz[v];if(siz[v]>siz[son[u]])son[u]=v;}Eular[++cnt_n]=u;out[u]=cnt_n;
}
void dfs_dfn(int u,int fa){top[u]=fa;if(son[u]){dfs_dfn(son[u],fa);}for(auto v:vec [u]){if(v==f[u])continue;if(v!=son[u])dfs_dfn(v,v);}
} 
int LCA(int x,int y){while(top[x]!=top[y]){if(dep[top[x]]>dep[top[y]])swap(x,y);y=f[top[y]];}if(dep[x]>dep[y])swap(x,y);return x;
}
//--
void Add(int x)
{++val[a[x]];if (val[a[x]] & 1)++sum[(a[x] - 1) / Num_Block + 1];else--sum[(a[x] - 1) / Num_Block + 1];
}void Del(int x)
{--val[a[x]];if (val[a[x]] & 1)++sum[(a[x] - 1) / Num_Block + 1];else--sum[(a[x] - 1) / Num_Block + 1];
}void Work(int x)
{book[x] ? Del(x) : Add(x);book[x]^= 1;
}int Ask(int l, int r)
{int yl= (l - 1) / Num_Block + 1, yr= (r - 1) / Num_Block + 1;if (yl == yr) {for (int i= l; i <= r; ++i)if (val[i] & 1)return i;return -1;}int el= yl * Num_Block, br= (yr - 1) * Num_Block + 1;for (int i= l; i <= el; ++i)if (val[i] & 1)return i;for (int i= br; i <= r; ++i)if (val[i] & 1)return i;for (int i= yl + 1; i <= yr - 1; ++i) {if (sum[i]) {l= (i - 1) * Num_Block + 1, r= i * Num_Block;for (int j= l; j <= r; ++j)if (val[j] & 1)return j;}}return -1;
}int main()
{rd_test();read(n,m);for (int i= 1; i <= n; ++i)read(a[i]);for (int i= 1; i < n; ++i) {int x,y;read(x,y);vec[x].push_back(y);vec[y].push_back(x);}dfs_getson(1,1);dfs_dfn(1,1);Block= cnt_n / sqrt(m);Num_Block= sqrt(n);for (int i= 1; i <= cnt_n; ++i)ys[i]= (i - 1) / Block + 1;for (int i= 1; i <= m; ++i) {read(q[i].x,q[i].y,q[i].l,q[i].r);q[i].id= i;q[i].lca= LCA(q[i].x, q[i].y);
//        cout<<"lca="<<q[i].lca<<endl;if (in[q[i].x] > in[q[i].y])swap(q[i].x, q[i].y);if (q[i].x == q[i].lca) {q[i].x= in[q[i].x];q[i].y= in[q[i].y];q[i].lca= 0;}else {q[i].x= out[q[i].x];q[i].y= in[q[i].y];}}sort(q + 1, q + m + 1, cmp);int l= 1, r= 0;for (int i= 1; i <= m; ++i) {while (l > q[i].x)Work(Eular[--l]);while (r < q[i].y)Work(Eular[++r]);while (l < q[i].x)Work(Eular[l++]);while (r > q[i].y)Work(Eular[r--]);if (q[i].lca)Work(q[i].lca);ans[q[i].id]= Ask(q[i].l, q[i].r);if (q[i].lca)Work(q[i].lca);}for (int i= 1; i <= m; ++i)printf("%d\n", ans[i]);return 0;
}

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

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

相关文章

从壹开始 [ Ids4实战 ] 之三║ 详解授权持久化 用户数据迁移

哈喽大家周三好&#xff0c;今天终于又重新开启 IdentityServer4 的落地教程了&#xff0c;不多说&#xff0c;既然开始了&#xff0c;就要努力做好?。书接上文&#xff0c;在很久之前的上篇文章《二║ 基础知识集合 & 项目搭建一》中&#xff0c;我们简单的说了说 Identi…

Codeforces Round #516 (Div. 2Div.1)

Codeforces Round #516 (Div. 2&&Div.1) (Div.1) 题号题目知识点AMake a triangle!贪心题BEquations of Mathematical Magic推公式COh Those Palindromes推导题(猜结论)DLabyrinthbfs剪枝EDwarves, Hats and Extrasensory Abilities思维构造FCandies for ChildrenGLas…

微软XAML Studio - WPF, UWP, Xamarin等技术开发者的福音

最近在继续倒腾WPF的项目&#xff0c;继续使用Caliburn.Micro和Xceed来堆代码。每次调试xaml上的binding&#xff0c;都有种要疯的赶脚。今天路过 https://channel9.msdn.com/ 浏览 WPF相关的学习视频时&#xff0c;遇到微软推荐的相关视频 - XAML sutdio简介https://channel9.…

CF1063A Oh Those Palindromes

CF1063A Oh Those Palindromes 题意&#xff1a; 一个非空字符串叫做回文串。如果它从左到右&#xff0c;从右到左读相同&#xff0c;那么它就是回文串。 例如&#xff0c;“ABCBA”,“A”和“ABBA”都是回文串&#xff0c;而“ABAB”和“XY”则不是。 如果可以通过从字符串…

AddMvc 和 AddMvcCore 的区别

目录本文出自《从零开始学 ASP.NET CORE MVC》目录 视频课程效果更佳&#xff1a;从零开始学 Asp.Net Core MVC ASP.NET Core 为什么有 AddMvc 和 AddMvcCore 他们是什么关系&#xff1f;在本视频中&#xff0c;我们将讨论 AddMvc()和 AddMvcCore()方法之间的区别。要在 ASP.NE…

CF1063B Labyrinth

CF1063B Labyrinth 题意&#xff1a; 你正在玩一款电脑游戏。在其中一关&#xff0c;你位于一个 n 行 m 列的迷宫。每个格子要么是可以通过的空地&#xff0c;要么是障碍。迷宫的起点位于第 r 行第 c 列。你每一步可以向上、下、左、右中的一个方向移动一格&#xff0c;前提是…

浅谈容量规划

俗话说&#xff0c;”人无远虑&#xff0c;必有近忧”&#xff0c;容量规划就是”远虑”。所谓容量规划&#xff0c;是一个产品满足用户目标需求而决定生产能力的过程。当产品发展到一个较为稳定成熟的阶段&#xff0c;产品的整体处理能力的把控自然是不可或缺&#xff0c;尽管…

CF1063C Dwarves, Hats and Extrasensory Abilities

CF1063C Dwarves, Hats and Extrasensory Abilities 题意&#xff1a; 首先题目会给出 n &#xff0c;表示要输入多少点。 然后你输出n 个点的坐标&#xff0c;每输出一个点会告诉你这个点的颜色是黑色或者白色。 最后你需要输出两个点的坐标代表一条直线&#xff0c;这条直线…

Blazor——Asp.net core的新前端框架

Blazor是微软在Asp.net core 3.0中推出的一个前端MVVM模型&#xff0c;它可以利用Razor页面引擎和C#作为脚本语言来构建WEB页面&#xff0c;如下代码简单演示了它的基本功能&#xff1a;和Angular JS和VUE的模型非常类似&#xff0c;Blazor 支持大多数应用所需的核心方案&#…

CF1149B Three Religions

CF1149B Three Religions 题意&#xff1a; 给定长度为 n 的母串和三个子串s1,s2,s3s_1,s_2,s_3s1​,s2​,s3​ 。初始时子串均为空。有 q 次询问。你需要支持两种操作&#xff1a;向某个子串末尾添加一个字母&#xff0c;或者删去某个子串末尾的字母。在每次操作后&#xff…

【译文】领域模型的五个特征

我在这篇博客文章中&#xff0c;我试图给领域模型下一个非常合适的定义&#xff0c;我发现我的这些定义都不太妥当&#xff0c;不过&#xff0c;我们还是可以先来看一下wiki百科对领域驱动模型下的定义&#xff1a;问题解决和软件工程中的领域模型可以被认为是感兴趣的领域&…

Codeforces Round #556 (Div. 1Div. 2)

Codeforces Round #556 (Div. 1&&Div. 2) 题号题目知识点AStock Arbitraging贪心BTiling Challenge贪心CPrefix Sum Primes构造DThree Religions线性dpETree Generator™FAbandoning RoadsGElection Promises

使用ASP.NET Core 实现Docker的HealthCheck指令

写在前面HealthCheck 不仅是对应用程序内运行情况、数据流通情况进行检查&#xff0c; 还包括应用程序对外部服务或依赖资源的健康检查。健康检查通常是以暴露应用程序的HTTP端点的形式 实施&#xff0c;可用于配置健康探测的的场景有 &#xff1a;容器或负载均衡器 探测应用状…

VS Code 中有哪些好用的 Azure 插件?

在之前的文章中&#xff0c;我们提到了 Amazon、Google、IBM、Red Hat、Salesforce、Pivotal 等大厂都在 VS Code 中有提供相应的开发工具&#xff1a;亚马逊上了 VS Code 的船&#xff0c;还有哪些大厂也上了船&#xff1f;微软必定更是把 VS Code 作为其最重要的开发者平台了…

CF1592E Bored Bakry

CF1592E Bored Bakry 题意&#xff1a; 给你长度为n的数组a&#xff0c;现在定义一段区间[l,r]为good&#xff0c;如果al&al1&...&ar>al⊕al1⊕...⊕ara_{l}\& a_{l1}\&...\&a_{r}>a_{l}⊕a_{l1}⊕...⊕a_{r}al​&al1​&...&ar​&…

邀请 | 关于微软容器服务,你需要知道的二三事

容器是近年来特别火的话题&#xff0c;那么&#xff0c;什么是容器&#xff1f;为什么我们需要容器服务&#xff1f;微软容器服务特点是什么&#xff1f;今天我们用一种特殊的方式为大家介绍这三大话题。什么是容器这个部分&#xff0c;我们用一个故事进行开场。很久以前&#…

Codeforces Round #746 (Div. 2)

Codeforces Round #746 (Div. 2) 题号题目难度AGamer HemoseBHemose ShoppingCBakry and PartitioningDHemose in ICPC ?EBored Bakry二进制思想F1Alice and Recoloring 1F2Alice and Recoloring 2

CF1592D Hemose in ICPC ?

CF1592D Hemose in ICPC ? 题意&#xff1a; 给你一棵n个节点的树&#xff0c;定义dis(a,b)a,b两点之间路径的gcd的最大值 最多可以询问12次&#xff0c;每次询问给出一个点集合&#xff0c;系统返回当前点集的所有点对中的最大Dist&#xff0c;最终需要输出a&#xff0c;b两…

UWP 推荐 | 限时免费的RSS阅读器《RSS 追踪》登录 Windows 10

前不久&#xff0c;本公号作者 Bravo Yeung 写了一篇不错的关于 RSS 的文章 .Net开发者必知的技术类RSS订阅指南。RSS 现在用的人很少了&#xff0c;而且就算是我&#xff0c;也不过是在一周前才开始正视 RSS 。只因为接触到了一个很好很强大的社区 RSS Hub &#xff0c;当时看…

King Gym - 102471H

King Gym - 102471H 题意&#xff1a; 给你一个数组b&#xff0c;让你找到一个最长的最长的king子序列&#xff0c;如果长度大于等于n/2&#xff0c;输出长度值&#xff0c;否则输出-1 一个序列(a1,a2,...,an)(a_{1},a_{2},...,a_{n})(a1​,a2​,...,an​)是king序列当且仅当…