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

P9019 [USACO23JAN] Tractor Paths P 题解

时间:2023-10-04 22:33:44浏览次数:42  
标签:Paths int 题解 sum kMaxN USACO23JAN len 区间 dis

Description

有 \(n\) 个区间,第 \(i\) 个区间为 \([l_i,r_i]\)。保证 \(l_1<l_2<\cdots<l_n\) 且 \(r_1<r_2<\cdots<r_n\)。其中一部分区间是特殊的,输入会给定。

如果第 \(i\) 个区间和第 \(j\) 个区间相交,那么 \(i,j\) 之间有一条边。保证 \(1,n\) 联通。

给定 \(Q\) 组询问,每次给定 \(a,b\) 满足 \(1\le a < b\le n\),你需要回答 \(a\) 到 \(b\) 至少要经过多少条边,以及有多少个特殊区间对应的点,使得这个点可能在 \(a\) 到 \(b\) 的最短路径上。

\(n,Q\le 2\times 10^5\)。

Solution

显然一个区间肯定是尽量跳能跳的最远的区间,那么设 \(nxt_{i}\) 表示区间 \(i\) 能跳的最远的区间,第一问就可以直接倍增求了。

第二问实际上是求:

\[\sum_{i=a}^{b}{a_i\times [dis(a,i)+dis(i,b)=dis(a,b)]} \]

设 \(dis(a,b)=len\),钦定 \(dis(a,i)=x,dis(i,b)=len-x\),还是不好做。

容易发现 \(\forall i\in[a,b],dis(a,i)+dis(i,b)\geq dis(a,b)\),所以只要满足 \(dis(a,i)\leq x,dis(i,b)\leq len-x\) 即可。

如果设 \(L_{i,j}\) 表示 \(i\) 往左跳 \(2^j\) 步到达的点,\(R_{i,j}\) 表示 \(i\) 往右跳 \(2^j\) 步到达的点,那么满足条件的 \(i\) 要满足 \(i\in[L_{b,len-x},R_{a,x}]\),答案就是:\(\sum\limits_{i=1}^{len-1}{cnt(L_{b,len-x},R_{a,x})}\)

考虑设 \(sum_i\) 表示前 \(i\) 个区间的特殊区间的个数,\(sl_{i,j}=\sum\limits_{k=i-2^j}^{i-1}{sum_{k-1}},sr_{i,j}=\sum\limits_{k=i+1}^{i+2^j}{sum_k}\)。

预处理后只要在询问里面倍增即可。

时间复杂度:\(O((n+q)\log n)\)。

Code

#include <bits/stdc++.h>

// #define int int64_t

const int kMaxN = 2e5 + 5;

int n, q;
int a[kMaxN], l[kMaxN], r[kMaxN], sum[kMaxN];
int nxt[kMaxN][20], pre[kMaxN][20], sumn[kMaxN][20], sump[kMaxN][20];

int getdis(int s, int t) {
  if (s == t) return 0;
  int ret = 1;
  for (int i = 19; ~i; --i)
    if (nxt[s][i] < t)
      s = nxt[s][i], ret += (1 << i);
  return ret;
}

void dickdreamer() {
  std::string str1, str2;
  std::cin >> n >> q >> str1 >> str2;
  int ccl = 0, ccr = 0;
  for (int i = 1; i <= 2 * n; ++i) {
    if (str1[i - 1] == 'L') {
      l[++ccl] = i;
    } else {
      r[++ccr] = i;
    }
  }
  for (int i = 1; i <= n; ++i) {
    a[i] = (str2[i - 1] == '1');
    sum[i] = sum[i - 1] + a[i];
  }
  for (int i = 1; i <= n; ++i) {
    int L = i, R = n + 1, res = i;
    while (L + 1 < R) {
      int mid = (L + R) >> 1;
      if (l[mid] <= r[i]) L = res = mid;
      else R = mid;
    }
    nxt[i][0] = res;
    sumn[i][0] = sum[res];
    L = 0, R = i, res = i;
    while (L + 1 < R) {
      int mid = (L + R) >> 1;
      if (r[mid] >= l[i]) R = res = mid;
      else L = mid;
    }
    pre[i][0] = res;
    sump[i][0] = sum[res - 1];
  }
  for (int i = 1; i <= 19; ++i) {
    for (int j = 1; j <= n; ++j) {
      nxt[j][i] = nxt[nxt[j][i - 1]][i - 1];
      pre[j][i] = pre[pre[j][i - 1]][i - 1];
      sumn[j][i] = sumn[j][i - 1] + sumn[nxt[j][i - 1]][i - 1];
      sump[j][i] = sump[j][i - 1] + sump[pre[j][i - 1]][i - 1];
    }
  }
  for (int cs = 1; cs <= q; ++cs) {
    int s, t;
    std::cin >> s >> t;
    int mi = getdis(s, t), cnt = a[s] + a[t];
    for (int i = 19; ~i; --i)
      if ((mi - 1) >> i & 1)
        cnt -= sump[t][i], t = pre[t][i];
    for (int i = 19; ~i; --i)
      if ((mi - 1) >> i & 1)
        cnt += sumn[s][i], s = nxt[s][i];
    std::cout << mi << ' ' << cnt << '\n';
  }
}

int32_t main() {
#ifdef ORZXKR
  freopen("in.txt", "r", stdin);
  freopen("out.txt", "w", stdout);
#endif
  std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);
  int T = 1;
  // std::cin >> T;
  while (T--) dickdreamer();
  // std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";
  return 0;
}

标签:Paths,int,题解,sum,kMaxN,USACO23JAN,len,区间,dis
From: https://www.cnblogs.com/Scarab/p/17742848.html

相关文章

  • 题解 P9701【[GDCPC2023] Classic Problem】
    题如其名,确实挺经典的。我们称边权在输入中给定的边为特殊边,其它边为平凡边。称特殊边涉及到的点为特殊点,其它点为平凡点。显然,对于连续的若干平凡点\([l,r]\),他们内部的最优连边方式就是连成一条链,花费\(r-l\)的代价。我们先把这样的代价加到答案中,然后将极长连续平凡点缩成......
  • [SHOI2009] 会场预约 题解
    LG任意时刻每个点最多被一条线段覆盖暴力删每条线段是对的插入\([l,r]\)时需要删除的线段要么被\([l,r]\)包含,要么覆盖\(l\)或\(r\)性质非常强所以做法非常多一种比较神奇的:对于两条线段\([l_{1},r_{1}],[l_{2},r_{2}]\),定义<为\(r_{1}<l_{2}\),即线段\(1\)完......
  • 题解 accoders::NOI 5511【漂亮轰炸(bomb)】
    题解accoders::NOI5511【漂亮轰炸(bomb)】http://47.92.197.167:5283/contest/406/problem/4BZOJ3252是弱化版。problem一棵树,边带权。\(Q\)次询问,给定\(k\)和一个首都点,选择\(k\)条路径轰炸,其中必须由一轮要轰炸首都,但没有要求每条路径都经过首都。每条边只能被炸一次,......
  • 题解 P9695【[GDCPC2023] Traveling in Cells】
    显然,询问的答案即为\(x\)所在的极长的满足颜色均在\(\mathbb{A}\)内的连续段的权值和。如果我们能维护对颜色的单点修改,以及求出某个位置所在极长连续段的左右端点\(l,r\),只需要树状数组即可求出答案。一个朴素的想法是对每种颜色开一棵线段树,单点修改是平凡的,极长连续段左......
  • 题解 P9702【[GDCPC2023] Computational Geometry】
    这题一看就不是计算几何,考虑区间DP。设凸多边形的\(n\)个顶点依次为\(P_1,P_2,\cdots,P_n\)。设\(f_{i,j}\)在\(i<j\)时表示\(P_i,P_{i+1},\cdots,P_{j-1},P_j\)组成的多边形的直径的平方,在\(i>j\)时表示\(P_i,P_{i+1},\cdots,P_n,P_1,\cdots,P_{j-1},P_j\)组......
  • 题解 P9697【[GDCPC2023] Canvas】
    好题。后面的操作会覆盖前面的操作,这东西不好处理,我们不妨时光倒流,将问题转化为一个位置一旦被填了数,就再也不会变了。如果解决了这个问题,只需将操作序列倒过来,就得到了原问题的解。显然,所有\(x_i=y_i=2\)的操作会最先被执行,所有\(x_i=y_i=1\)的操作会最后被执行。只需要给......
  • 高橋君 题解
    AtCoder天下一プログラマーコンテスト2014本戦高橋君题意给定\(n,k\),求\[\sum\limits_{i=0}^{k}\dbinom{n}{i}\]多测,\(1\len,k,T\le10^5\)。题解可以考虑使用莫队求解,下文讲述如何移动指针。\(n\rightarrown+1\)根据杨辉三角递推式\(\dbinom{n}{m}=......
  • 题解 P2674 《瞿葩的数字游戏》T2-多边形数
    题目描述给你一个正整数数\(n\),问你它是不是多边形数\(K\),如果是,设\(K_1\)是最小的\(K\),\(K_2\)是次小的\(K\),输出\(K_1\)和\(K_2\)。具体思路我们主要来看上面这张表里有什么规律。性质1:\(1\)是任何一个多边形数。性质2:\(2\)不是任何一个多边形数。性......
  • 情报破译 题解
    \(d<n\le2e5,m\le10,1\lep\le10^9,0\lea_i\le1e9\)每个位运算之间独立,所以我们可以构造一个\(\{2^{k-1},2^{k-1}.....\}\)和一个\(\{0,0,0...\}\)的数组,让他们倍增去做如上运算,最后用他们把\(p\)轮拼出来,我们就知道了\(i\)位置上二进制下第\(j\)位如果是\(0\)......
  • 国标GB28181协议下视频监控平台EasyGBS播放器起播慢或延迟高问题解决方案
    GB28181视频监控国标平台EasyGBS是基于国标GB28181协议、支持多路设备同时接入的视频监控/视频云服务平台,支持对多平台、多终端分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。国标GB28181平台EasyGBS可提供视频直播监控、云端录像、云存储、检索回放、智能告警、语音对讲、平......