首页 > 其他分享 >题解:AT_joisc2017_f 鉄道旅行 (Railway Trip)

题解:AT_joisc2017_f 鉄道旅行 (Railway Trip)

时间:2024-08-25 21:08:51浏览次数:12  
标签:joisc2017 int 题解 rx maxn 区间 Railway nr lx

题意

鉄道旅行 (Railway Trip)

分析

非常神仙的倍增做法。

我们设 \(l_{i,j}\) 表示从 \(i\) 点出发,停靠 \(2^j\) 站后能抵达的最左位置。

同理设 \(r_{i,j}\) 表示从 \(i\) 点出发,停靠 \(2^j\) 站后能抵达的最右位置。

考虑如何更新这两个状态。

因为可以走回头路,所以简单的 \(l_{i,j}=l_{l_{i, j-1}, j-1}\) 和 \(r_{i,j}=r_{r_{i, j-1}, j-1}\) 这种倍增方法是不行的。

我们可以考虑从两个端点来更新。

递推式如下:

\[\begin{aligned} l_{i,j}&=\min(l_{l_{i, j-1}, j-1}, l_{r_{i, j-1}, j-1})\\ r_{i,j}&=\max(r_{l_{i, j-1}, j-1}, r_{r_{i, j-1}, j-1}) \end{aligned} \]

每次查询时先从较左点向两侧扩展区间,如果该区间没有包含较右点,那么就扩展区间并统计答案。

然后再从较右点向两侧扩展区间,如果两区间没有交,那么扩展区间并统计答案。

最后得到的两区间再扩展一步就一定会有交。

Code

#include<bits/stdc++.h>
using namespace std;
#define maxn 100005

int lis[maxn], l[maxn][18], r[maxn][18], stk[maxn], *top=stk;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int n, k, q;
    cin>>n>>k>>q;
    for(int i=1;i<=n;i++) cin>>lis[i];
    for(int i=1;i<=n;i++)
    {
        while(top!=stk&&lis[*top]<lis[i]) top--;
        if(top!=stk) l[i][0]=*top;
        else l[i][0]=i;
        *++top=i;
    }
    top=stk;
    for(int i=n;i;i--)
    {
        while(top!=stk&&lis[*top]<lis[i]) top--;
        if(top!=stk) r[i][0]=*top;
        else r[i][0]=i;
        *++top=i;
    }
    for(int j=1;j<18;j++)
        for(int i=1;i<=n;i++)
            l[i][j]=min(l[l[i][j-1]][j-1], l[r[i][j-1]][j-1]),
            r[i][j]=max(r[l[i][j-1]][j-1], r[r[i][j-1]][j-1]);
    int a, b, ans;
    while(q--)
    {
        cin>>a>>b;
        ans=0;
        if(a>b) swap(a, b);
        int lx=a, rx=a;
        for(int i=17, nl, nr;~i;i--)
        {
            nl=min(l[lx][i], l[rx][i]);
            nr=max(r[lx][i], r[rx][i]);
            if(nr<b) lx=nl, rx=nr, ans+=1<<i;
        }
        a=rx;
        lx=rx=b;
        for(int i=17, nl, nr;~i;i--)
        {
            nl=min(l[lx][i], l[rx][i]);
            nr=max(r[lx][i], r[rx][i]);
            if(nl>a) lx=nl, rx=nr, ans+=1<<i;
        }
        cout<<ans<<'\n';
    }
}

标签:joisc2017,int,题解,rx,maxn,区间,Railway,nr,lx
From: https://www.cnblogs.com/redacted-area/p/18379540

相关文章

  • 题解:SP3109 STRLCP - Longest Common Prefix
    三倍经验:UVA11996JewelMagicP4036[JSOI2008]火星人题意维护一个字符串\(S\),支持以下操作:\(Q\i\j\):输出\(\operatorname{LCP}(S[i\dotsl],S[j\dotsl])\)\(R\i\char\):用\(char\)替换\(S\)的第\(i\)个字符\(I\i\char\):在\(S\)的第\(i\)......
  • 题解:CF590E Birthday
    题目分析题意给定\(n\)个字符串,要求从中选出若干个组成一个集合,且集合中每个字符串都互不包含。求集合最大包含几个字符串。分析本题弱化版:[ABC354G]SelectStrings就是求一个最长反链,并求构造方案。求构造方案还是比较有意思的。建议先做P4298[CTSC2008]祭祀。一......
  • 题解:P5217 贫穷
    题意维护一个字符串,支持以下操作:\(\texttt{Ixc}\),在第\(x\)个字母后面插入一个\(c\)。\(\texttt{Dx}\),删除第\(x\)个字母。\(\texttt{Rxy}\),反转当前文本中的区间\([x,y]\)。\(\texttt{Px}\),输出初始文本中第\(x\)个字母在当前文本中的位置。特别地,若不存在,......
  • 题解:UVA11996 Jewel Magic
    题意给你一个01串,要求完成以下操作:单点插入。单点删除。区间翻转。查询两点开始的LCP。分析先看查询操作,如何得到LCP的长度?我们可以考虑二分长度\(l\),然后用哈希检验区间\([p1,p1+l-1]\)是否等于区间\([p2,p2+l-1]\)。平衡树维护哈希即可。发现......
  • 题解:AT_abc354_g [ABC354G] Select Strings
    题目分析题意给定\(n\)个字符串,要求从中选出若干个组成一个集合,且集合中每个字符串都互不包含。求集合中字符串的权值的和的最大值。分析首先很容易想到用KMP判两个串是否存在包含关系。考虑建图,将不能同时存在于一个集合中的串的节点相连。然后发现只需求出这个图的最......
  • 题解:P7952 [✗✓OI R1] 天动万象
    提供一种和第一篇题解不同的理解思路。题目分析看到操作\(1\):拿dfs序水水就行了。看到操作\(2\):???特殊情况我们考虑一下特殊情况下操作\(2\)怎么处理。假如这棵树是一条链。设从根到叶节点权值如下:(随便赋的)节点编号123456权值123456如果我们......
  • 题解:CF1995C Squaring
    题意给定序列\(a\),每次操作可以使\(a_i\getsa_i^2\),求使\(a\)不降的最少操作次数。分析因为\(1^k=1\),所以无解的情况只有\(\exist\a_i=1\)且\(\exist\j\in[1,i),a_j>1\)。在有解的情况下,假设对\(a_{i-1}\)操作\({k_{i-1}}\)次,对\(a_i\)操作\({k_i}\)次。......
  • 题解:UVA1479 Graph and Queries
    分析先看删边操作。由于并不保证是森林,所以我们没有好的方法来在线维护删边相关的操作。所以,我们可以套路地把询问离线,然后倒着操作。删边变成加边。需要注意的是权值的修改,记录时要把当前权值和修改的权值反过来。然后我们发现这个操作很经典,维护方式和[HNOI2012]永无乡......
  • 题解:P7475 「C.E.L.U-02」简易输入法
    题意给定词典\(\text{U}\),每次询问读入一个字符串\(s\),以及一个整数\(x\)对于这个字符串有以下几种情形:设\(s_i\in\text{U}\)且\(s\)为\(s_i\)的前缀的个数为\(a\)。当\(a\gex\)时,请输出按照以输出次数从大到小为第一关键字,以字典序为第二关键字排序后的第\(x......
  • 题解:P7401 [COCI2020-2021#5] Planine
    题意现有一座上下起伏的山。它可以抽象为一个包含\(n\)(\(n\)为奇数)个点\((x_i,y_i)\)以及\((x_1,-\inf)\)与\((x_n,-\inf)\)的多边形。对于所有满足\(i\neq1\),\(i\neqn\),\(i\bmod2=1\)的整数\(i\),\((x_i,y_i)\)都是山谷。现要放置若干个高度为\(h\)的点光......