首页 > 其他分享 >P9019 [USACO23JAN] Tractor Paths P

P9019 [USACO23JAN] Tractor Paths P

时间:2023-04-07 16:26:03浏览次数:54  
标签:Paths cnt gs -- P9019 int USACO23JAN 区间 dis

Problem

Luogu P9019 [USACO23JAN] Tractor Paths P

Solution

首先有一个显然的结论,区间 \(i\) 向右能到的区间是 \([i+1,RT_i]\),向左能到的区间是 \([LT_i,i-1]\)。

根据这个考虑倍增。定义跳一步表示从当前区间去到最远能去的区间。设 \(f_{i,j}\) 表示区间 \(i\) 向右跳 \(j\) 步,最远到哪个区间,\(g_{i,j}\) 表示向左跳。

那么现在只需求出 \(f_{i,0}\) 和 \(g_{i,0}\) 就可以进行倍增。

设 \(l_i\) 表示第 \(i\) 个 L 向左最远到哪个区间,\(r_i\) 表示第 \(i\) 个 R 向右最远到哪个区间。对于 \(l_i\) 来说,只需要求出往右数,最靠近 \(i\) 的 R 是第几个 R,因为 R 越早出现表示对应的 L 也越早出现。这个值就是 \(l_i\),\(r_i\) 就反过来计算,原理是一样的。

那么 \(f_{i,0}=r_i,g_{i,0}=l_i\)。

然后第一问就很好做了,就倍增往后跳就行了。

第二问设 \(cnt(l,r)\) 表示从 \(l\) 区间到 \(r\) 区间有多少特殊区间。不妨设第一问答案是 \(dis\)。

那么第二问答案 \(ans=cnt(x,x)+cnt(y,y)+\sum\limits_{i=1}^{dis-1} cnt(g_{y,dis-i},f_{x,i})\)。后面那一部分可以合并成几个倍增。所以在倍增中统计前缀和的和?

Code

#include<cstdio>
#include<cstring>
#define N 200005
using namespace std;
int n,q,now,cnt,ans1,ans2,l[N],r[N],sum[N],f[N<<1][18],g[N<<1][18],fs[N<<1][18],gs[N<<1][18];
char s[N<<1],vs[N];
int dis(int x,int y)
{
    if (x==y) return 0;
    int res=0;
    for (int i=17;i>=0;--i)
        if (f[x][i]!=-1&&f[x][i]<y) res+=(1<<i),x=f[x][i];
    return res+1;
}
int main()
{
    scanf("%d%d",&n,&q);
    scanf("%s",s+1);
    cnt=0;now=1;
    for (int i=1;i<=2*n;++i)
    {
        if (s[i]=='L') cnt++;
        else r[now]=cnt,now++;
    }
    cnt=n+1;now=n;
    for (int i=2*n;i;--i)
    {
        if (s[i]=='R') cnt--;
        else l[now]=cnt,now--;
    }
    scanf("%s",vs+1);
    for (int i=1;i<=n;++i)
        sum[i]=sum[i-1]+vs[i]-'0';
    memset(f,-1,sizeof(f));
    memset(g,-1,sizeof(g));
    for (int i=1;i<n;++i)
        f[i][0]=r[i],fs[i][0]=sum[r[i]];
    for (int i=n;i>1;--i)
        g[i][0]=l[i],gs[i][0]=sum[l[i]-1];
    for (int j=1;j<=17;++j)
        for (int i=1;i<n;++i)
        {
            if (f[i][j-1]==-1) continue;
            f[i][j]=f[f[i][j-1]][j-1];
            if (f[i][j]!=-1) fs[i][j]=fs[i][j-1]+fs[f[i][j-1]][j-1];
        }
    for (int j=1;j<=17;++j)
        for (int i=n;i>1;--i)
        {
            if (g[i][j-1]==-1) continue;
            g[i][j]=g[g[i][j-1]][j-1];
            if (g[i][j]!=-1) gs[i][j]=gs[i][j-1]+gs[g[i][j-1]][j-1];
        }
    while (q--)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        ans1=dis(x,y);ans2=vs[x]-'0'+vs[y]-'0';
        for (int i=17;i>=0;--i)
            if ((ans1-1)&(1<<i)) ans2+=fs[x][i],x=f[x][i];
        for (int i=17;i>=0;--i)
            if ((ans1-1)&(1<<i)) ans2-=gs[y][i],y=g[y][i];
        printf("%d %d\n",ans1,ans2);
    }
    return 0;
}

标签:Paths,cnt,gs,--,P9019,int,USACO23JAN,区间,dis
From: https://www.cnblogs.com/Livingston/p/17296546.html

相关文章

  • Xcode的Search Paths配置
    在Xcode中的文件搜索路径配置有两个地方,一个是Project层的配置,一个是Target的配置。Project-BuildSettings-SearchPathsTarget-BuildSettings-SearchPaths在Target......
  • 33. CF-Divisor Paths
    链接求从\(x\)到\(y\)的最短路径的数量。显然应该从\(x\)走到\(\gcd(x,y)\)再走到\(y\),容易证明这样走是最优的。那么现在只需要把两段的最短路径数量分别求出......
  • USACO23JAN P【杂题】
    A.[USACO23JAN]TractorPathsP有\(n\)个区间,第\(i\)个区间为\([l_i,r_i]\)。保证\(l_1<l_2<\cdots<l_n\)且\(r_1<r_2<\cdots<r_n\)。其中一部分区间是特殊的。......
  • D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths (cf741D)
    D.Arpa’sletter-markedtreeandMehrdad’sDokhtar-koshpaths(cf741D)tag:dsuontree,dp题目链接题意:给你一棵树,每一条边的权值是'a'到'v'的字母,求在每一个点......
  • 题解 LGP9018【[USACO23JAN] Moo Route G】
    problem现在有一条数轴,\(t\)表示当前时刻。在\(t=0\)时Bessie恰好处在\(x=0\)的位置。接下来,每秒钟Bessie会向左或者向右移动一个单位距离,我们保证Bessie是在......
  • [LeetCode]Unique Paths
    QuestionArobotislocatedatthetop-leftcornerofamxngrid(marked‘Start’inthediagrambelow).Therobotcanonlymoveeitherdownorrightatany......
  • 题解 【[USACO23JAN] Lights Off G】
    problem给两个长为\(n\)的0/1字符串\(S,T\),进行如下操作\(cnt\)次:自行选定\(0\leqx<n\),使得\(T_x\)异或一。将\(S\)异或上\(T\)。将\(T\)的最后一位......
  • 题解 【[USACO23JAN] Find and Replace G】
    problem有一个字符串\(S\),初始时为\(\tt'a'\),现在进行\(n\)次操作,第\(i\)次操作形如:将\(S\)中的所有的字符\(ch_i\)替换为字符串\(T_i\)。然后输出\(S[l......
  • Java:Path及Paths使用
    Java8Windows10-- 主要内容:Windows下测试,组合文件路径、Path转File等。 准备:D盘;D盘下bootweb目录(springboot项目);D盘下test.txt文件;D盘下其它目录及......
  • ARC153F - Tri-Colored Paths
    题意给定一个\(n\)个点\(m\)条边的无向连通图,求将\(m\)条边进行\(3\)染色且满足:存在一条简单路径,使得路径上三种颜色的边各有至少一条。的方案数。数据范围:\(......