首页 > TAG信息列表 > GZOI2019

【题解】P5304 [GXOI/GZOI2019]旅行者(dijkstra,图论,最短路)

【题解】P5304 [GXOI/GZOI2019]旅行者 一道利用 dijkstra 的很妙的图论题! 加深了我对于 dijkstra 的理解。 (于是在做完这道题两天后的模拟赛中遇到了和它套路几乎一样的,我却甚至没有想到用最短路……) 所以写个题解记录一下吧。 题目链接 [GXOI/GZOI2019]旅行者 - 洛谷 题意概述

[GXOI/GZOI2019]与或和

[GXOI/GZOI2019]与或和 很显然在2进制每一位做出的贡献是可以分别计算的,那么我们考虑单独计算这31位 与运算和或运算的计算过程显然是一模一样的,与运算就是找右多少个全都是1的矩阵 而或运算就是所有的矩阵减去全部都是0的矩阵,所以操作起来是一模一样的 我们看如何实现,首先,我们预

[GXOI/GZOI2019]旧词

\(\text{Solution}\) 第一部分参考 \(\text{LNOI2014 LCA}\) 在 \(k=1\) 时完全可行 因为对于每个 \(i\), 根到 \(y\) 的路径之和恰好是 \(dep[lca]\) 但当 \(k>1\) 呢? 此时我们要想办法弄出一个加数的方式,使根到 \(y\) 的路径之和为 \(dep[lca]^k\) 考虑每个点 \(x\) 加上的权值为

【题解】[GXOI/GZOI2019]宝牌一大堆

[GXOI/GZOI2019]宝牌一大堆 \(\text{Solution:}\) 从 \(8kb\) 代码改到 \(11kb\) 最后封装到 \(5kb\) ……封装 yyds dwt yyds 学到最大的除了 \(dp\) 应该是调试技巧和封装的重要性了…… 方程可能写的有点奇怪)看看能不能帮到和我一样设计状态的同学) 后面附带了一些注意事项。欢

P5305-[GXOI/GZOI2019]旧词【树链剖分,线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P5305 题目大意 给一棵有根树和\(k\),\(Q\)次询问给出\(x,y\)求 \[\sum_{i=1}^{x}dep_{LCA(i,y)}^k \]\(1\leq n,Q\leq 5\times 10^5,1\leq k\leq 10^9\) 解题思路 和之前\(LCA\)那题一样的思路,如果\(k\)等于\(1\)的话。加入一

[GXOI/GZOI2019]与或和

嘟嘟嘟 在GX大佬cyh的提议下,我就开了这道题。 看到位运算,就想到每一位单独考虑。 那么对于\(AND\)操作,我们只要找全是1的子矩阵个数。 对于\(OR\)操作,用子矩阵总数-全0子矩阵个数即可。 这样就有一个\(O(n ^ 4 logN)\)(\(N\)是值域)的做法了,可以拿到50分。 然后我就没想出来。 现在

Luogu P5304 [GXOI/GZOI2019]旅行者

题链 [P5304 GXOI/GZOI2019]旅行者 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 分析 首先显然求出所有的被标记的点出发的最短路 再建反图求出所有被标记的点出发的最短路 显然每个被标记的点都有自己的管辖范围(在管辖范围中的点距离该点最近) 假设最后答案是\((u,v)\),则显然

Luogu P5304 [GXOI/GZOI2019]旅行者

Link 二进制分组。每次选定一个二进制位,把特殊点按编号在这一位上的状态分为两半,跑两遍dij求出这两半之间的最短路。 #include<queue> #include<cstdio> #include<vector> #include<cstring> #include<algorithm> #include<functional> using i64=long long; using pi=std::pair<i

【GZOI2019】旧词

题目链接:https://www.luogu.com.cn/problem/P5305 题目大意:给定一棵有根树,已知常数 \(k\), 对于 \(Q\) 个询问 \(x, y\) 求 \(\sum\limits_{i \leq x} {depth(Lca(i, z))^k}\) solution 当 \(k = 1\) 时, 显然就是原题【LN2014】LCA 若 \(k \ne 1\) , 则可以进一步推广上一题的

LG5300 「GZOI2019/GXOI2019」与或和 二进制+单调栈

问题描述 Freda 学习了位运算和矩阵以后,决定对这种简洁而优美的运算,以及蕴含深邃空间的结构进行更加深入的研究。 对于一个由非负整数构成的矩阵,她定义矩阵的 \(\texttt{AND}\) 值为矩阵中所有数二进制 \(\texttt{AND(&)}\) 的运算结果;定义矩阵的 \(\texttt{OR}\) 值为矩阵中所有

题解:[GXOI/GZOI2019]旧词

这个题目其实早就做了,只是突然发现还没发,那就凑一下GZOI 题意:给定$x,y$求 $$\sum_{i\leq x}dep(lca(i,y))^k$$ 首先我们先来看这个题目的简化版  https://www.luogu.org/problem/P4211 求  $$\sum_{i\leq x}dep(lca(i,y))$$ 我们来看$dep$的实际意义——从 i 点到根有多少个点(包

题解:[GXOI/GZOI2019]旅行者

调这个题调了两个月,被自己蠢哭 题意:    给一个有向图,一组关键点,求关键点之间的最短的距离 Solution:   这个题目有两种做法,分别是 $nlogn$ 和 $nlog^2n$ 的   首先说 $nlogn$ 的官方做法,我们考虑多源迪杰斯特拉 正图上从 k 个关键点出发跑 $dijkstra$ ,记某个点离最近的关

GXOI/GZOI2019 旅行者

题目链接:戳我 这是同学出的题,真心神仙qwq 我们进行二进制分组,因为如果答案是\(k_i\)和\(k_j\)之间的距离的话,他们的编号必定在某一位上不一样。 所以这样子做是对的。跑dij的次数降低到2*log次。 不过最好还是不要像我一样懒,分组之后重新加边,不加O2会慢死的........ #include<iostr

【LOJ】#3087. 「GXOI / GZOI2019」旅行者

LOJ#3087. 「GXOI / GZOI2019」旅行者 正着求一遍dij,反着求一遍,然后枚举每条边,从u到v,如果到u最近的点和v能到的最近的点不同,那么可以更新答案 没了 #include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_

Luogu P5304 [GXOI/GZOI2019]旅行者

有趣的题目,又好想又好码,可谓是省选题中的一股清流 考虑如果我们枚举一个点作为起点,然后暴力求出到其它点的最短路,那么可以暴力解决问题 但是我们稍微转化一下问题,同时把一些点的集合作为起点,跑出到其它剩下所有点的最短路,取出其中最小的一条,就相当于同时做了多次猜测 具体实现也非

[GXOI/GZOI2019]旧词

相关链接(雾:[LNOI2014]LCA 实际上这题就是加了一个幂。。原题爆破比赛 原题:当$k=1$时 暴力:求LCA再求深度。。然后观察一下求LCA的方法。。最暴力的方法就是把根节点到节点$i$的路径上的点都打上标记,然后由节点$y$往上,直到一个有标记的点为止。。 然而这题并不需要求LCA的序号,只需要

[GXOI/GZOI2019]与或和(位运算,单调栈)

题目链接懒得放了。 题目大意懒得写了。 省选原题哪有找不到的…… 说实话,其实这题是个大水题,被我十秒钟内口胡出来了。 首先位运算除了拆位还能干啥?以下以与为例,或是差不多的。 我们考虑有多少个子矩阵会对这一位答案产生贡献,其实就是全 $1$ 的子矩阵。 问题转化为计算全 $1$ 子

[GXOI/GZOI2019]旅行者

就我感觉这道题很神仙吗/kel 仔细想想应该也是一种适用范围挺广的做法。 考虑我们可以通过dijkstra在O(nlogn)求出一个点集到另外一个点集的最短路。 那么我们可以通过一些划分点集的方式使得每一对点都被计算一次。 考虑按照二进制划分。 两个不同的数至少有一个二进制位不同。 按

题解 P5301 【[GXOI/GZOI2019]宝牌一大堆】

这道题除了非常恶心以外也没有什么非常让人恶心的地方 当然一定要说有的话还是有的,就是这题和咱 ZJOI 的 mahjong 真的是好像的说~ 于是就想说这道题出题人应该被 锕 掉 noteskey 整体的思路就是特判国士无双和七对子,然后 dp 搞普通的胡牌 dp 状态设计和楼上大佬说的一样,就是用一个

[GXOI|GZOI2019]旧词

题解 首先当\(k=1\)的时候肥肠简单 就是按照\(x\)从小到大排序 每处理到一个\(x\),就把\(1\to x\)的路径上的点都+1 然后查询\(y\)的时候就查询\(1\to y\)的点权和 那么\(k>1\)的时候也一样 对于深度为\(i\)的节点,给ta加上\(i^k-(i-1)^k\)即可 最后查询的时候查询点u的贡献就

LOJ#3088. 「GXOI / GZOI2019」旧词(树剖+线段树)

题面 传送门 题解 先考虑\(k=1\)的情况,我们可以离线处理,从小到大对于每一个\(i\),令\(1\)到\(i\)的路径上每个节点权值增加\(1\),然后对于所有\(x=i\)的询问查一下\(y\)到根节点的路径和就是了 那么\(k\neq 1\)的情况该怎么办呢?我们来考虑一下令\(1\)到\(i\)的路径上每个节点权值加\(

LOJ#3087. 「GXOI / GZOI2019」旅行者(最短路)

题面 传送门 题解 以所有的感兴趣的城市为起点,我们正着和反着各跑一边多源最短路。记\(c_{0/1,i}\)分别表示正图/反图中离\(i\)最近的起点,那么对于每条边\((u,v,w)\),如果\(c_{0,u}\neq c_{1,v}\),那么我们就用\(d_{0,u}+d_{1,v}+w\)更新答案 //minamoto #include<bits/stdc++.h> #de

【BZOJ5505】[GXOI/GZOI2019]逼死强迫症(矩阵快速幂)

【BZOJ5505】[GXOI/GZOI2019]逼死强迫症(矩阵快速幂) 题面 BZOJ 洛谷 题解 如果没有那两个\(1*1\)的东西,答案就是斐波那契数,可以简单的用\(dp\)得到。 大概是设\(f[i]\)表示当前除了到第\(i\)列的方案数,转移是考虑用\(2*1\)竖着覆盖一列还是\(2\)个\(1*2\)横着覆盖两列,得到转移\(f[i]

P5305 [GXOI/GZOI2019]旧词

题目地址:P5305 [GXOI/GZOI2019]旧词 这里是官方题解 \[\sum_{i \leq x}^{}\ depth(lca(i,y))^k\] \(k = 1\) 求的是 \(\sum_{i \leq x}^{}\ depth(lca(i,y))\) ,一堆点然后每个点和 \(y\) 求 \(lca\) 然后深度求和。 总体思路是把 \(lca\) 的值摊派到这个点到根的路径上 (这个东西也