首页 > 其他分享 >[NOI2018] 归程 解题报告

[NOI2018] 归程 解题报告

时间:2023-05-13 15:15:39浏览次数:48  
标签:10 int void dsu write 解题 归程 NOI2018 define

题面

步行的最小距离很容易求,dij随便求一下每个点的最短路,然后找到与 \(v\) 能相互坐车到达的点,对这些点的最短路都有可能是答案,取个 \(\min\) 即可。

所以本题最大的问题是怎么找到在水位线为 \(p\) 时,与 \(v\) 能相互坐车到达的点。可以想到只保留海拔大于 \(p\) 的边,因为只要考虑连通性且对于所有的 \(p\) 都需要考虑,想到 Kruskal 重构树。
Kruskal 重构树上用倍增找到深度最浅的海拔大于 \(p\) 的边,这个边对应的点的子树内的点的距离最小值即为答案。

点击查看代码
#include<bits/stdc++.h>
#define ull unsigned long long
#define ll long long
#define pdi pair<double,int>
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define eps 1e-9
using namespace std;
namespace IO{
    template<typename T>
    inline void read(T &x){
        x=0;
        int f=1;
        char ch=getchar();
        while(ch>'9'||ch<'0'){
            if(ch=='-'){
                f=-1;
            }
            ch=getchar();
        }
        while(ch>='0'&&ch<='9'){
            x=x*10+(ch-'0');
            ch=getchar();
        }
        x=(f==1?x:-x);
    }
    template<typename T>
    inline void write(T x){
        if(x<0){
            putchar('-');
            x=-x;
        }
        if(x>=10){
            write(x/10);
        }
        putchar(x%10+'0');
    }
    template<typename T>
    inline void write_endl(T x){
        write(x);
        putchar('\n');
    }
    template<typename T>
    inline void write_space(T x){
        write(x);
        putchar(' ');
    }
}
using namespace IO;
const int N=4e5+10,M=4e5+10,inf=2.1e9,Lg=20;
int n,m,cnt,h[N<<1],dsu[N<<1];
int fa[N][Lg+5],dep[N];
vector<int>G[N<<1];
vector<pii>E[N];
struct edge{
    int u,v,w,h;
}e[M];
bool cmp(edge x,edge y){
    return x.h>y.h;
}
int getfa(int u){
    if(dsu[u]!=u){
        dsu[u]=getfa(dsu[u]);
    }
    return dsu[u];
}
void clear(){
    for(int i=1;i<=cnt;i++){
        dep[i]=h[i]=0,dsu[i]=i;
        vector<int>().swap(G[i]);
        vector<pii>().swap(E[i]);
        for(int j=0;j<=Lg;j++){
            fa[i][j]=0;
        }
    }
}
int d[N<<1],b[N<<1];
void dij(){
    for(int i=1;i<=n;i++){
        d[i]=inf;
        b[i]=0;
    }
    d[1]=0;
    priority_queue<pii>q;
    q.push(mp(0,1));
    while(!q.empty()){
        int u=q.top().second;
        q.pop();
        if(b[u]){
            continue;
        }
        b[u]=1;
        for(auto x:E[u]){
            int v=x.first,w=x.second;
            if(d[v]>d[u]+w){
                d[v]=d[u]+w;
                q.push(mp(-d[v],v));
            }
        }
    }
}
void make_tree(int u){
    for(int i=1;i<=Lg;i++){
        fa[u][i]=fa[fa[u][i-1]][i-1];
    }
    for(auto v:G[u]){
        if(dep[v]){
            continue;
        }
        dep[v]=dep[u]+1;
        fa[v][0]=u;
        make_tree(v);
        d[u]=min(d[u],d[v]);
    }
}
int find(int st,int p){
    for(int i=Lg;i>=0;i--){
        if(h[fa[st][i]]>p){
            st=fa[st][i];
        }
    }
    return st;
}
void solve(){
    read(n),read(m);
    cnt=n;
    for(int i=1;i<=m;i++){
        read(e[i].u),read(e[i].v),read(e[i].w),read(e[i].h);
    }
    for(int i=1;i<=n;i++){
        h[i]=inf;
        dsu[i]=i;
    }
    sort(e+1,e+m+1,cmp);
    for(int i=1;i<=m;i++){
        int u=e[i].u,v=e[i].v;
        u=getfa(u),v=getfa(v);
        if(u!=v){
            dsu[v]=dsu[u]=dsu[++cnt]=cnt;
            h[cnt]=e[i].h;
            G[cnt].pb(u),G[cnt].pb(v);
            d[cnt]=inf;
        }
    }
    for(int i=1;i<=m;i++){
        E[e[i].u].pb(mp(e[i].v,e[i].w));
        E[e[i].v].pb(mp(e[i].u,e[i].w));
    }
    dij();
    dep[cnt]=1;
    make_tree(cnt);
    int q,opt,s;
    read(q),read(opt),read(s);
    int lstans=0;
    while(q--){
        int st,p;
        read(st),read(p);
        st=(st+opt*lstans-1)%n+1;
        p=(p+opt*lstans)%(s+1);
        int pos=find(st,p);
        lstans=d[pos];
        write_endl(lstans);
    }
    clear();
}
signed main(){
    #ifndef ONLINE_JUDGE
        freopen("1.in","r",stdin);
        freopen("1.out","w",stdout);
    #endif
    int t;
    read(t);
    while(t--){
        solve();
    }
    return 0;
}

标签:10,int,void,dsu,write,解题,归程,NOI2018,define
From: https://www.cnblogs.com/luoshen0/p/17397062.html

相关文章

  • 解题记录1~4月份
    #1月开始打```atcoder```##abc132###$a,b,c$题:由于过于简单,直接跳过。###$d$题:插板法,把篮球分为$i$块,也就是插$i-1$块板子,所以可能性就有$\dbinom{k-1}{i-1}$种,红球同理可得$\dbinom{n-k-1}{i-1}$。###$e$题:把一条边拆成三条边,然后再跑一遍```dijkstra```即可......
  • 「解题报告」ARC103D Distance Sums
    给Kaguya看了一眼,Kaguya用了一分钟切了。我看了一个小时。这就是神吗。考虑一个点往叶子走答案的贡献,显然距离和会变化\(-siz_u+(n-siz_u)=n-2siz_u\)。如果我们以重心为根,那么所有的\(n-2siz_u>0\),那么这实际上是一个小根堆。那么我们考虑从大往小枚举叶子,然......
  • [网络安全]AntSword蚁剑实战解题详析
    免责声明:本文仅分享AntSword渗透相关知识,不承担任何法律责任。请读者自行安装蚁剑,本文不再赘述。蚁剑介绍蚁剑(AntSword)是一款开源的跨平台WebShell管理工具,它主要面向于合法授权的渗透测试安全人员以及进行常规操作的网站管理员。中国蚁剑的特点主要有如下几点:1.支持多平台......
  • [网络安全]BurpSuite爆破实战解题详析之BUUCTF Brute 1
    免责声明:本文仅分享AntSword渗透相关知识,不承担任何法律责任。请读者自行安装BurpSuite,本文不再赘述。在用户名和密码都未知的情况下,进行用户名、密码的组合爆破,效率极低。先爆破用户名,再利用得到的用户名爆破密码,将提高爆破速度。BUUCTFBrute1题目操作Burp抓包单独......
  • [网络安全]DVWA之File Upload—AntSword(蚁剑)攻击姿势及解题详析合集
    免责声明:本文仅分享SQL攻击相关知识,不承担任何法律责任。DVWA、BurpSuite请读者自行安装,本文不再赘述。同类文章参考:[网络安全]AntSword(蚁剑)实战解题详析(入门)FileUpload—lowlevel源码中无过滤:上传包含一句话木马<?php@eval($_POST[qiushuo]);?>的文件qiu.php回显......
  • [网络安全]sqli-labs Less-2 解题详析
    往期回顾:[[网络安全]sqli-labsLess-1解题详析](https://blog.csdn.net/2301_77485708/article/details/130410800?spm=1001.2014.3001.5502)判断注入类型GET1and1=1,回显如下:GET1and1=2,没有回显:说明该漏洞类型为整型注入。判断注入点个数GET1orderby3,回显如下:GE......
  • [网络安全]DVWA之Brute Force攻击姿势及解题详析合集
    免责声明:本文仅分享Burp爆破相关知识,不承担任何法律责任。DVWA及Brup请读者自行安装,本文不再赘述。同类文章参考:[网络安全]BurpSuite爆破实战解题详析之BUUCTFBrute1DVWA之BruteForce攻击之lowlevel思路:先爆用户名,再爆密码。抓包后给username添加payload位置添加Bu......
  • [网络安全]sqli-labs Less-3 解题详析
    判断注入类型GET1'and'1'='1,回显如下:GET1'and'1'='2:没有回显,说明该漏洞类型为GET型单引号字符型注入判断注入点个数GET1'orderby2--+,回显如下:由上图可知,sql语法中给$id加上了()猜测后端语句为SELECT*FROMxxwhereid=('$id')故构造GET1')orderby3-......
  • [网络安全]sqli-labs Less-4 解题详析
    判断注入类型GET1"and"1"="1,回显如下:GET1"and"1"="2没有回显,说明该漏洞类型为GET型双引号字符型注入判断注入点个数GET1"orderby3--+由上图可知,sql语法中给$id加上了()猜测后端语句为SELECT*FROMxxwhereid=("$id")故构造GET1')orderby3--+,此时后......
  • [网络安全]sqli-labs Less-5 解题详析
    往期sqli-labs在该博客中,读者可自行浏览。[秋说的博客](https://blog.csdn.net/2301_77485708?spm=1000.2115.3001.5343)该博客实操性较高,请读者`躬身实践`判断注入类型GET1'and'1'='1回显如下:GET1'and'1'='2没有回显,说明该漏洞类型为GET型单引号字符型注入判断注入......