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

题解 P9019 [USACO23JAN] Tractor Paths P

时间:2023-09-21 18:15:44浏览次数:46  
标签:21 int 题解 sum P9019 cin USACO23JAN 区间 id

显然,对于给定的 \(l,r\),最短路可以贪心求出,即每次走与当前区间相交且左端点最大的区间,这个可以用倍增加速。

定义 \(f_{i,j}\) 表示从区间 \(i\) 往右走 \(j\) 步后到达的区间,\(g_{i,j}\) 表示往左走的情况。

正反遍历一下即可求出 \(f_{i,1}\) 和 \(g_{i,1}\)。

对于第二问,第 \(i\) 步所能走到的区间会有一个范围,且对于每个 \(i\) 其范围不相交。

定义 \(s(i,j)\) 表示编号在 \([i,j]\) 范围内的特殊区间个数。

那么最终答案为 \(s(x,x)+s(y,y)+\sum\limits_{i=1}^{dis-1}s(g_{y,dis-i},f_{x,i})\)。

求倍增和的前缀和即可。复杂度 \(O(n\log n)\)。

code:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,q,f[N][21],g[N][21],fs[N][21],gs[N][21],id[N*2],sum[N];
char c[N*2];
string s;
int main(){
  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  cin>>n>>q;
  int t=0,t2=0;
  for(int i=1;i<=2*n;++i){
    cin>>c[i];
    if(c[i]=='L')id[i]=++t;
    else id[i]=++t2;
  }
  cin>>s;s="."+s;
  for(int i=1;i<=n;++i)sum[i]=sum[i-1]+s[i]-'0';
  for(int i=2*n;i>=1;--i){
    if(c[i]=='L'){
      g[id[i]][0]=id[t];
      gs[id[i]][0]=sum[id[t]-1];
    }else t=i;
  }
  for(int i=1;i<=2*n;++i){
    if(c[i]=='R'){
      f[id[i]][0]=id[t];
      fs[id[i]][0]=sum[id[t]];
    }else t=i;
  }
  for(int j=1;j<=20;++j)for(int i=1;i<=n;++i){
    f[i][j]=f[f[i][j-1]][j-1];fs[i][j]=fs[i][j-1]+fs[f[i][j-1]][j-1];
    g[i][j]=g[g[i][j-1]][j-1];gs[i][j]=gs[i][j-1]+gs[g[i][j-1]][j-1];
  }
  while(q--){
    int x,y,d1=0,d2;cin>>x>>y;
    d2=s[x]-'0'+s[y]-'0';
    int u=x,v;
    for(int i=20;i>=0;--i){
      if(f[u][i]<y){
        d1+=(1<<i);
        u=f[u][i];
      }
    }
    ++d1;
    cout<<d1<<" ";
    u=x;v=y;
    for(int i=0;i<=20;++i){
      if((d1-1)&(1<<i)){
        d2+=fs[u][i]-gs[v][i];
        u=f[u][i];v=g[v][i];
      }
    }
    cout<<d2<<endl;
  }
  return 0;
}

标签:21,int,题解,sum,P9019,cin,USACO23JAN,区间,id
From: https://www.cnblogs.com/HQJ2007/p/17720595.html

相关文章

  • To_Heart—题解——好多好多!
    1.CF1860Dlink&&submission发现自己并不会处理纯纯的dp甚至自己根本不会dp!定义dp_{i,j,k}状态表示前i个字符有j个0,01的数量减去10的数量为k。转移比较显然了,答案是\(dp_{n,cnt0,0}\),其中cnt0是原序列中0的个数。注意k有正负。2.CF1860Flink.首先......
  • 【UVA 12676】Inverting Huffman 题解(哈夫曼树)
    静态霍夫曼编码是一种主要用于文本压缩的编码算法。给出的文本为由N个不同字符组成的特定大小,算法选择N个代码,每个代码对应一个不同的字符性格使用这些代码压缩文本。为了选择代码,算法构建一个有N片叶子的二元根树。对于N≥2,树可按如下方式构建。1.对于文本中的每个不同字符,构......
  • 题解 UVA1537 Picnic Planning
    这道题在显然是最小生成树,但是很显然我是不会打最小生成树的。题意描述给定一张\(n\)个点\(m\)条边的无向图,求出无向图的一棵最小生成树,满足一号节点的度数不超过给定的整数\(s\)。具体思路首先,看到这种度数最多为\(s\)的题,显然想到wqs二分。但是wqs二分是恰好选......
  • 【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答(四)
    ​贴接上回。。。 【往期FAQ参考】【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答(一)【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答(二)【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答(三) 【本期FAQ】1、JS服务卡片能实现按钮触摸时更换背景色,离开恢复原来......
  • ABC319题解
    直接从D开始了。D可可爱爱的二分捏。check就按照题目里写的就行了。然后\(l\)的初值要注意一下,就是\(\max^{i\len}_{i=1}a_i\)。代码:#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintmaxn=2e5+10;intn,m;inta[maxn];intl,......
  • Friendly Arrays题解
    2023-09-18题目FriendlyArrays难度&重要性(1~10):5题目来源luogu题目算法贪心解题思路一道大水题。这道题解法非常的套路,我们需要对于处理按位或和按位异或时,首先就要把数拆成二进制的形式去考虑。首先我们需要简单了解一下按位或和按位异或的运算规则:按位或,对于两......
  • 使用dom4j解析xml文件及selectNodes取不到值问题解决
    参考文档:https://blog.csdn.net/PARADDD/article/details/131307189https://blog.csdn.net/weixin_37703598/article/details/81273199......
  • asp.net 跨域问题解决
    前言:近期在对接前后端分离的项目中遇到了跨域问题,查了一些资料都比较新,没有比较老的解决方式所以记录一下背景如下:后端最老的aspx前端vue3部署在iis上1.跨域的处理点击查看代码<httpProtocol> <customHeaders> <addname="Access-Control-Allow-Origin"value=......
  • 【POJ 3278】Catch That Cow 题解(广度优先搜索)
    农夫约翰已被告知一头逃亡奶牛的位置,并想立即抓住她。他从一条数字线上的N点(0≤N≤100000)开始,奶牛在同一条数字线上的K点(0≥K≤100000)。农夫约翰有两种交通方式:步行和坐车。*步行:FJ可以在一分钟内从任何点X移动到点X-1或X+1*坐车:FJ可以在一分钟内从任何X点移动到2×X点。如果奶......
  • 题解 [ARC165C] Social Distance on Graph
    赛时:看不懂题,啊这!赛后:就这?题目描述有一个简单相连的无向图,其顶点数为\(n\),编号为\(1\)至\(n\)。图中有\(m\)条加权边,第\(i\)条边连接顶点\(a_i\)和\(b_i\),权重为\(w_i\)。此外,连接两个顶点的简单路径的权重是简单路径中包含的边的权重之和。我们给每个顶点涂上红......