一棵KrusKal重构树,然而我数组开小了,忘记清空一个标记

洛谷传送门

BZOJ传送门 ......好像成权限题了Orz

  回顾我们用KrusKal做生成树的时候,我们将边排序后连通各个连通块,那么边一定是单调的。

所以我们考虑维护一颗最大生成树,然后查询时倍增就好了,复杂度 n * log n

  RE代码,把注释的删了就好了,数组没开够

#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cctype>
using namespace std;
, M = 1e6 + , inf = 0x7fffffff;
int v[M], to[M], head[N], pos[M], p;
void build(int a, int b, int c) { v[++ p] = b; to[p] = head[a]; head[a] = p; pos[p] = c; }
void link(int a, int b, int c) { build(a, b, c); build(b, a, c); }
int pre[N], far[N], n;
int find(int x) { return pre[x] == x ? x : pre[x] = find(pre[x]); }
struct point {
    int d, f;
    point (int d, int f) : d(d), f(f) {}
    point () {}
    bool operator < (const point &a) const {
        return f > a.f;
    }
};
priority_queue<point> tp;
void dijkstra() {
    ; i <= n; ++ i) far[i] = inf; tp.push(point(, ));
    while( !tp.empty()) {
        int u = tp.top().d; tp.pop();
        for ( int i = head[u]; i; i = to[i]) if( far[v[i]] > far[u] + pos[i]) {
            far[v[i]] = far[u] + pos[i]; tp.push(point(v[i], far[v[i]]));
        }
    }
}
], cnt;
int query(int a, int P) {
    ; i >= ; -- i) if( POS[T[a][i]] > P)
        a = T[a][i];
    return far[a];
}
struct node {
    int u, v, val;
    node ( int u, int v, int val) : u(u), v(v), val(val) {}
    node () {}
    bool operator < (const node &a) const {
        return val > a.val;
    }
}tc[M];
int lastans, Case, m, q, K, s;
inline void G(int &x) {
    x = ; ; ;
    ) + (x << ) + (o & ); x *= f;
}
];
int main() {
    freopen("return1.in", "r", stdin);
    freopen("return.out", "w", stdout);
    G(Case);
    while( Case -- ) {
        G(n), G(m);
        ; i <= n; ++ i) head[i] = ; // p = 0; // 当时好像是因为没加这个RE了.......
        , a, b, c, d; i <= m; ++ i)
            G(a), G(b), G(c), G(d), tc[i] = node(a, b, d), link(a, b, c);
        sort(tc+, tc++m); dijkstra();
        ; i <= n; ++ i) pre[i] = i, POS[i] = inf;
        cnt = n;
        ; i <= m; ++ i) {
            if( find(tc[i].u) == find(tc[i].v)) continue;
            int A = find(tc[i].u), B = find(tc[i].v);
            ++ cnt; POS[cnt] = tc[i].val; far[cnt] = min(far[A], far[B]);
            T[A][] = T[B][] = cnt;
            pre[cnt] = pre[A] = pre[B] = cnt;
        }
        T[cnt][] = T[cnt][] = cnt;
        ; i <= ; ++ i)
            ; k <= cnt; ++ k) T[k][i] = T[T[k][i-]][i-];
        G(q); G(K); G(s);
        cnt = lastans = ;
        , v0, p0; i <= q; ++ i) {
            G(v0); G(p0);
            ) % n + , p0 = (p0 + K * lastans) % (s + );
            lastans = query(v0, p0); int t = lastans;
            , t /= ; while( t);
            '+TP[cnt]); puts("");
        }
    }
    ;
}

woc, 差点忘了这个

[BZOJ 5415] 归程的更多相关文章

  1. [LOJ 2718][UOJ 393][BZOJ 5415][NOI 2018]归程

    [LOJ 2718][UOJ 393][BZOJ 5415][NOI 2018]归程 题意 给定一张无向图, 每条边有一个距离和一个高度. 再给定 \(q\) 组可能在线的询问, 每组询问给定一个点 ...

  2. 【刷题】BZOJ 5415 [Noi2018]归程

    www.lydsy.com/JudgeOnline/upload/noi2018day1.pdf Solution 考试的时候打的可持久化并查集,没调出来QAQ 后面知道了kruskal重构树这个东西 ...

  3. [BZOJ] 5415: [Noi2018]归程

    在做Kruskal求最小生成树时,假设要通过边权\(w\)的边合并子树\(x\)和\(y\),我们新建一个方点,把两个子树接到这个方点上,并将方点的点权赋为\(w\),最终形成的二叉树就是\(Krus ...

  4. BZOJ 5415: [Noi2018]归程(kruskal重构树)

    解题思路 \(NOI2018\)的\(Day1\) \(T1\),当时打网络赛的时候不会做.学了一下\(kruskal\)重构树后发现问题迎刃而解了.根据\(kruskal\)的性质,如果要找从\(u ...

  5. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  6. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  7. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  8. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  9. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

随机推荐

  1. mfs监控

    web gui 监控 gui_info.jpg (143.72 KB, 下载次数: 83) gui_most.jpg (209.36 KB, 下载次数: 82) gui_master_info.jpg ...

  2. vector向量容器

    vector向量容器不但可以像数组一样对元素进行随机访问,还能在尾部插入元素,是一种简单高效的容器,可以代替数组. vector具有内存自动管理的功能,对于元素的插入和删除,可以动态的调整所占内存. ...

  3. 2-javascript::笔记

    0.位置: HTML 中的脚本必须位于 <script> 与 </script> 标签之间. 脚本可被放置在 HTML 页面的 <body> 和 <head& ...

  4. Fedora 16下安装ruby on rails

    Fedora 16下安装ruby on rails 最近在windows下写了些rails小程序,问题一个接一个,到最后终于坚信了那句话“windows不适合用于ruby on rails开发”.于是 ...

  5. CF407B Long Path

    好玩的题. 首先我们(看一下题解之后)发现当你第一次走到了一个点的时候,那么它之前的所有点一定都访问过了偶数次. 假设我们第一次走到了一个点$i$,那么$i - 1$一定访问了偶数次,那么第一次走$i ...

  6. Django cache

    Django中使用redis 方式一: utils文件夹下,建立redis_pool.py import redis POOL = redis.ConnectionPool(host='127.0.0 ...

  7. Python 之 文件处理

    文件操作: 文件路径:d:\文件名.txt 编码方式:utf-8.gbk 操作方式:只读.只写.追加.读写.写读... 只读:r    或     rb #相对路径 f=open("文件名& ...

  8. 半平面交 (poj 1279(第一道半平面NlogN)完整注释 )

    半平面交的O(nlogn)算法(转载) 求n个半平面的交有三种做法: 第一种就是用每个平面去切割已有的凸多边形,复杂度O(n^2). 第二种就是传说中的分治算法.将n个半平面分成两个部分,分别求完交之 ...

  9. oracle数据库查询全系整理

    oracle数据库方面的知识到今天已经整理了12篇.当然,这不是终点,这只是一个开始,希望我写的文章可以帮助更多初学数据库的童鞋快速上手,如果你觉得文章对你有帮助,那么恭喜你已经入门了,数据库里面的知 ...

  10. Linux 查看是64位还是32位

    [root@VM_7_88_centos ~]# uname -a Linux VM_7_88_centos 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36: ...