首页 > 其他分享 >[BalticOI 2017] Toll

[BalticOI 2017] Toll

时间:2024-03-10 16:45:53浏览次数:21  
标签:int res d% rc BalticOI query 2017 Toll define

做法很多,本人使用线段树。

原图可以看作分层 DAG,每层结点有 \(k\) 个,而 \(k\le 5\)。

假设每层的点编号 \(0\sim k-1\)。从 \(l\) 到 \(r\) 层的路径,在线段树上用区间 \([l,r-1]\) 表示。线段树上每个结点都存储表示最段路的矩阵,合并时使用 Floyd。

另外,需要特判询问中是否两个点在同一层里,这样一定不连通。

// Title:  Toll
// Source: P6573
// Author: Jerrywang
#include <bits/stdc++.h>
#define F first
#define S second
#define pii pair<int, int>
#define ll long long
#define rep(i, s, t) for(int i=s; i<=t; ++i)
#define debug(x) cout<<#x<<":"<<x<<endl;
const int N=50010, M=5;
using namespace std;

int k, n, m, T; vector<pii> g[N][M];
struct node
{
    int l, r, d[M][M];
    void clr() {memset(d, 0x3f, sizeof d);}
} t[N<<2];
#define lc p<<1
#define rc p<<1|1
void up(node &a, node l, node r)
{
    a.clr();
    rep(w, 0, k-1) rep(u, 0, k-1) rep(v, 0, k-1)
        a.d[u][v]=min(a.d[u][v], l.d[u][w]+r.d[w][v]);
}
void build(int p, int l, int r)
{
    t[p]={l, r};
    if(l==r)
    {
        t[p].clr();
        rep(u, 0, k-1) for(auto [v,w]:g[l][u])
            t[p].d[u][v]=w;
        return;
    }
    int m=l+r>>1;
    build(lc, l, m), build(rc, m+1, r);
    up(t[p], t[lc], t[rc]);
}
node query(int p, int l, int r)
{
    if(l<=t[p].l && t[p].r<=r) return t[p];
    int m=t[p].l+t[p].r>>1; node res;
    if(r<=m) return query(lc, l, r);
    if(l>m)  return query(rc, l, r);
    up(res, query(lc, l, r), query(rc, l, r));
    return res;
}

int main()
{
    #ifdef Jerrywang
    freopen("E:/OI/in.txt", "r", stdin);
    #endif
    scanf("%d%d%d%d", &k, &n, &m, &T);
    rep(i, 1, m)
    {
        int u, v, w; scanf("%d%d%d", &u, &v, &w);
        g[u/k][u%k].push_back({v%k, w});
    }
    build(1, 0, n);
    while(T--)
    {
        int u, v; scanf("%d%d", &u, &v);
        int lu=u/k, lv=v/k;
        if(lu==lv) {puts("-1"); continue;}
        node t=query(1, lu, lv-1);
        int res=t.d[u%k][v%k];
        printf("%d\n", res==0x3f3f3f3f?-1:res);
    }

    return 0;
}

标签:int,res,d%,rc,BalticOI,query,2017,Toll,define
From: https://www.cnblogs.com/jerrywang2009/p/18064346

相关文章

  • [NOIP2017 提高组] 小凯的疑惑 / [蓝桥杯 2013 省] 买不到的数目
    这肯定是学证明了,看这篇文章补充一下细节首先,\(m\)的范围应该是\([0,b-1]\)然后,当\(m\)取不同值的时候,\(ma\)%\(b\)一定为不同值(这个性质确实有点奇特,可以记下来)反证,如果\(m_1a\equivm_2a\:(mod\:b)\)且\(0≤m_1<m_2≤b-1\),那么就有\(b|(m_2-m_1)a\),题目给出了\(a,b\)互质,......
  • P4958 [COCI2017-2018#6] Mate 题解
    分析考虑DP。先考虑\(A\)的答案。定义状态函数\(f_{i,j}\)表示在子串\(S_{1\dotsi}\)中选\(j\)个,且第\(S_i\)必选的方案数。则有:\(f_{i,j}=C_{i-1}^{j-1}\)。再考虑\(B\)的答案。枚举每一个位置\(x\)。令\(sum_x=\sum\limits_{i=1}^{x-1}f_{i,n-1}[S_i=A]\)。......
  • P3957 [NOIP2017 普及组] 跳房子
    原题链接题解二分加动态维护区间最大值注意设立变量的含义,改变变量值的规则code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;llsum[500005]={0};structunit{llx,v;booloperator<(constunit&b)const{returnb.v>v;}//}room[5000......
  • [AH2017HNOI2017] 礼物(fft)
    [AH2017/HNOI2017]礼物(fft)题目描述我的室友最近喜欢上了一个可爱的小女生。马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她。每个手环上各有\(n\)个装饰物,并且每个装饰物都有一定的亮度。但是在她生日的前一天,我的室友突然发现他好像拿错了一个手环,而且......
  • P8647 [蓝桥杯 2017 省 AB] 分巧克力
    题目链接:小巧克力的边长一定在\(1\sim10^5\)之间。答案为在\(1\sim10^5\)之间找一个最大的数,使得所有\(h[i]/a*w[i]/a\)的和\(\geqslantk\)即可。#include<cstdio>#include<algorithm>constintN=1e5+10;intn,k,h[N],w[N];boolcheck(inta)......
  • CVE-2017-1000353分析
    影响版本Jenkins主版本<=2.56版本)JenkinsLTS<=2.46.1版本)漏洞分析漏洞发生在jenkinscli采用http方式进行通信的时候,处理url为http://127.0.0.1:8080/cli,其处理逻辑在hudson.cli.CLIAction中jenkins采用的是Stapler框架,CLIAction实现了两个接口,分别是UnprotectedRootActio......
  • [THUSCH2017] 大魔法师
    THUSCH2017]大魔法师题目描述大魔法师小L制作了$n$个魔力水晶球,每个水晶球有水、火、土三个属性的能量值。小L把这$n$个水晶球在地上从前向后排成一行,然后开始今天的魔法表演。我们用$A_i,B_i,C_i$分别表示从前向后第$i$个水晶球(下标从$1$开始)的水、火、土的能......
  • P3706 「SDOI2017」硬币游戏 解题报告
    oj:https://gxyzoj.com/d/hzoj/p/P451概率与期望+hash+高斯消元声明一些东西,pre(S,l)表示串S的长度为l的前缀,lst(S,l)表示串S的长度为l的后缀一.对于所有串建立字典树,像「HNOI2013」游走一样高斯消元,时间复杂度\(O(n^3m^3)\),预计50/70pts二.正解:显然,n项中,出现一个长度......
  • P4666 [BalticOI 2011 Day1] Growing Trees题解(平衡树思想)
    自己第一道不看题解写出来的紫题,庆祝一下(没初始化种子导致调了30min)这是一个fhq-treap的题解思路来源:首先看题目,因为是序列上的问题,不难想到是一道数据结构题。首先看到操作C:对于这种操作,我们可以用平衡树解决,具体方法是,将树split成\(<min,min\lex\lemax,>max\)这......
  • #分块,二分#洛谷 5356 [Ynoi2017] 由乃打扑克
    题目支持区间加和区间查询第\(k\)小分析分块之后给每个整块排序,这样修改的时候整块打标记,散块直接分开把需要加的部分暴力加之后归并,就是\(O(\sqrt{n})\)的查询的话,如果只有散块直接归并出结果,否则二分答案,加上小块合并成的整块,相当于是整体二分,就是\(O(\sqrt{n}\log{a_......