loj#2718. 「NOI2018」归程
题目链接
题解
按照高度做克鲁斯卡尔重构树
那么对于询问倍增找到当前点能到达的高度最小可行点,该点的子树就是能到达的联通快,维护子树中到1节点的最短距离
spfa她死了...同步赛没写的说...
似乎前两题比去年简单些....连蒟蒻我都可做前两题的说
代码
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
inline int read() {
int x = 0,f = 1;
char c = getchar();
while(c < '0' || c > '9')c = getchar();
while(c <= '9' && c >= '0')x = x * 10 + c - '0',c = getchar();
return x * f;
}
#define mp std::make_pair
#define pr std::pair<int,int>
int n,m;
const int maxn = 1000007;
struct node {
int u,v,a,l,next;
bool operator < (const node & A)const {
return a > A.a;
}
} edge[maxn << 1],e[maxn];
int num = 0,head[maxn],dis[maxn << 1];
inline void add_edge(int u,int v,int w) { edge[++ num].v = v;edge[num].l = w;edge[num].next = head[u];head[u] = num; }
std::priority_queue<pr> q;
void dijkstar() {
static bool vis[maxn];
memset(dis,0x3f,sizeof dis); memset(vis,0,sizeof vis);
dis[1] = 0;q.push(pr(0,1));
while(!q.empty()) {
int u = q.top().second;q.pop();
if(vis[u]) continue;
vis[u] = 1;
for(int i = head[u];i;i = edge[i].next) {
int v = edge[i].v;
if(dis[v] > dis[u] + edge[i].l) dis[v] = dis[u] + edge[i].l,q.push(mp(-dis[v],v));
}
}
}
int fa[maxn];
int find(int x) { if(fa[x] != x) fa[x] = find(fa[x]); return fa[x]; }
int tot = 0,dad[maxn << 1][20],mn[maxn << 1];
int lastans = 0;
int query(int x,int p) {
for(int i = 18;i >= 0;-- i) {
if(mn[dad[x][i]] > p) x = dad[x][i];
}
return dis[x];
}
void solve() {
int Q = read(),k = read(),S = read(),v,p;
if(k) while(Q --) {
v = (read() + k * lastans - 1) % n + 1;
p = (read() + k * lastans ) % (S + 1);
printf("%d\n",lastans = query(v,p));
} else while(Q --) {
v = read(),p = read();
printf("%d\n",query(v,p));
}
}
void init() {
n = read(),m = read();
//int cnt = 0;
for(int u,v,a,l,i = 1;i <= m;++ i) {
u = read(),v = read(),l = read(),a = read();
e[i].u = u,e[i].v = v,e[i].a = a;
add_edge(u,v,l); add_edge(v,u,l);
}
dijkstar();
for(int i = 1;i <= n;++ i) fa[i] = i;
tot = n;
std::sort(e + 1,e + m + 1);
int k = 1;
for(int fx,fy,i = 1;i <= m;++ i) {
int x = e[i].u,y = e[i].v,h = e[i].a;
if((fx = find(x)) == (fy = find(y))) continue;
fa[fx] = fa[fy] = dad[fx][0] = dad[fy][0] = ++ tot; fa[tot] = dad[tot][0] = tot;
mn[tot] = e[i].a; dis[tot] = std::min(dis[fx],dis[fy]);
if(++ k == n)break;
}
/*for(int i = 1;i <= tot;++ i)
for(int j = 0;dad[i][j];++ j)
dad[i][j + 1] = dad[dad[i][j]][j],mn[i][j + 1] = std::min(mn[i][j],mn[dad[i][j]][j]);
*/
for(int i = 1;i <= 18;++ i)
for(int x = 1;x <= tot;++ x)dad[x][i] = dad[dad[x][i - 1]][i - 1];
solve();
}
int main() {
freopen("return.in","r",stdin); freopen("return.out","w",stdout);
int t = read();
while(t --) {
memset(head,0,sizeof head),num = 0; lastans = 0;
init();
}
return 0;
}
loj#2718. 「NOI2018」归程的更多相关文章
- LOJ #2718. 「NOI2018」归程 Dijkstra+可持久化并查集
把 $Noi2018$ day1t1 想出来还是挺开心的,虽然是一道水题~ 预处理出来 1 号点到其它点的最短路,然后预处理边权从大到小排序后加入前 $i$ 个边的并查集. 这个并查集用可持久化线段树 ...
- LOJ #2718. 「NOI2018」归程(Dijkstra + Kruskal重构树 + 倍增)
题意 给你一个无向图,其中每条边有两个值 \(l, a\) 代表一条边的长度和海拔. 其中有 \(q\) 次询问(强制在线),每次询问给你两个参数 \(v, p\) ,表示在 \(v\) 出发,能开车 ...
- 洛谷 4768 LOJ 2718「NOI2018」归程
[题解] 本题有多种做法,例如可持久化并查集.kruskal重构树等. kruskal重构树的做法是这样的:先把边按照海拔h从大到小的顺序排序,然后跑kruskal建立海拔的最大生成树,顺便建krus ...
- #2718. 「NOI2018」归程 kruskal重构树
链接 https://loj.ac/problem/2718 思路 我们希望x所在的连通块尽量的大,而且尽量走高处 离线的话可以询问排序,kruskal过程中更新答案 在线就要用kruskal重构树 ...
- 「NOI2018」归程
「NOI2018」归程 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 >\(1\) 个节点. \(m\) 条边的无向连通图(节点的编号从 \( ...
- LOJ #2721. 「NOI2018」屠龙勇士(set + exgcd)
题意 LOJ #2721. 「NOI2018」屠龙勇士 题解 首先假设每条龙都可以打死,每次拿到的剑攻击力为 \(ATK\) . 这个需要支持每次插入一个数,查找比一个 \(\le\) 数最大的数(或 ...
- loj#2721. 「NOI2018」屠龙勇士
题目链接 loj#2721. 「NOI2018」屠龙勇士 题解 首先可以列出线性方程组 方程组转化为在模p意义下的同余方程 因为不保证pp 互素,考虑扩展中国剩余定理合并 方程组是带系数的,我们要做的 ...
- Loj #2719. 「NOI2018」冒泡排序
Loj #2719. 「NOI2018」冒泡排序 题目描述 最近,小 S 对冒泡排序产生了浓厚的兴趣.为了问题简单,小 S 只研究对 *\(1\) 到 \(n\) 的排列*的冒泡排序. 下面是对冒泡排 ...
- loj#2720. 「NOI2018」你的名字
链接大合集: loj uoj luogu bzoj 单纯地纪念一下写的第一份5K代码.../躺尸 因为ZJOI都不会所以只好写NOI的题了... 总之字符串题肯定一上来就拼个大字符串跑后缀数组啦! ( ...
随机推荐
- JS设计模式——9.组合模式
组合模式概述 组合模式是一种专为创建Web上的动态用户界面量身定制的模式.使用这种模式可以用一条命令在多个对象上激发复杂的递归的行为. 它可以用来把一批子对象组织成树形结构,并且使整棵树都可被遍历.所 ...
- C++ Primer 5th 第17章 标准库特殊设施
C++新标准库提供了很多新功能,它们更加强大和易用. tuple类型 tuple是一种类似pair的模板,pair可以用来保存一对逻辑上有关联的元素对.但与pair不同的是,pair只能存储两个成员, ...
- Java与JS生成二维码
1.二维码概念 二维码/二维条码是用某种特定的集合图形按一定规律在平面上(二维方向上)分布的黑白相间的图形记录数据符号信息的图片. 黑线是二进制的1,空白的地方是二进制的0,通过1.0这种数据组合用于 ...
- _csv.Error: line contains NULL byte
原因是表格保存时扩展名为 xls,而我们将其改为csv文件通常是重命名: 解决方法只需把它另存为 csv 文件.
- 85.YCbCr与YUV的区别
yuv色彩模型来源于rgb模型,该模型的特点是将亮度和色度分离开,从而适合于图像处理领域. YCbCr模型来源于yuv模型,应用于数字视频,ITU-R BT.601 recommendation 通过 ...
- 超简单的qps统计方法(推荐)【转】
统计最近N秒内的QPS值(包括每秒select,insert等值) mysql> select variable_name,sum(per_sec) as qps from (select st ...
- python3中内建函数map()与reduce()的使用方法
map()的使用 map()的使用方法形如map(f(x),Itera).对,它有两个参数,第一个参数为某个函数,第二个为可迭代对象.如果不懂什么是函数,不懂什么是可迭代对象没关系,记住下面的例 ...
- 大数据系列之数据仓库Hive原理
Hive系列博文,持续更新~~~ 大数据系列之数据仓库Hive原理 大数据系列之数据仓库Hive安装 大数据系列之数据仓库Hive中分区Partition如何使用 大数据系列之数据仓库Hive命令使用 ...
- php CI框架
CodeIgniter 是一个小巧但功能强大的 PHP 框架,作为一个简单而“优雅”的工具包,它可以为 PHP 程序员建立功能完善的 Web 应用程序.如果你是一个使用共享主机,并且为客户所要求的期限 ...
- hibernate的枚举注解@Enumerated
@Enumerated(value=EnumType.ORDINAL)采用枚举类型的序号值与数据库进行交互, 此时数据库的数据类型需要是数值类型,例如在实际操作中 CatTest ct = new C ...