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

P9019 [USACO23JAN] Tractor Paths P 题解

时间:2024-09-27 21:35:39浏览次数:8  
标签:Paths int 题解 P9019 mid USACO23JAN Tractor

P9019 [USACO23JAN] Tractor Paths P 题解

难度其实绝对不止蓝题。

先考虑第一问。维护任意两点之间的最短路是困难的,难以 dp 或是采取其它方法解决。难以算最短路就转换思路,考虑从 \(x\) 走 \(p\) 步能走到哪。考虑到这个东西是有单调性的,也就是说对于 \(x<y<z\),从 \(x\) 能走到 \(z\) 一定能从 \(x\) 走到 \(y\)。那么这个东西可以倍增解决。设 \(f_{i,j}\) 表示从 \(i\) 走 \(2^j\) 步最远能到哪里,倍增转移就可以了。

对于第二问,simple 的想法是枚举 "特殊点" \(i\),检查是否有 \(dis(x,i)+dis(i,y)=dis(x,y)\)。这样就有了 \(O(n^2)\) 的做法。对于正解,考虑优化,发现这样做复杂度不优的原因是枚举一个 \(i\) 的同时本质上还枚举了其它的 "特殊点"。考虑复杂度 \(O(n\log n)\) 怎么做。显然的想法是仍然要用倍增优化。发现可行的点集形成一个区间,于是我们设 \(p_{i,j}\) 表示从 \(i\) 向前走 \(2^j\) 步最远可以到的 "特殊点" 的个数,\(q_{i,j}\) 表示从 \(i\) 向后走 \(2^j\) 步最远可以到的 "特殊点" 的个数,那么对于 \(x\rightarrow y\),距离为 \(d\),答案就是 \(\sum p_{x,k}-q_{y,d-k}\) 这样一个东西。那么这个东西看上去不好维护,然而考虑对于 \(j\) 这一维前缀和处理,表示 \([i,i+2^0],[i,i+2^1],\cdots,[i,i+2^j]\) 所有区间的特殊点个数和,这样一来事实上维护了从 \(1\) 到最终距离的总和,于是用两个前缀和相减就得到了答案。

代码:

#include <bits/stdc++.h>
#define N 200005
#define M 20
using namespace std;
int n, q;
string s, S;
int ls[N], lt, rs[N], rt;
int rk[N << 1];
int sum[N]; 

int f[N][M], g[N][M];
int sf[N][M], sg[N][M];

int get_dis(int x, int y) {
	int ans = 0;
	for (int i = M - 1; ~i; --i)
		if (f[x][i] < y)
			x = f[x][i], ans += (1 << i);
	return ans + 1;
}
int main() {
	cin >> n >> q;
	cin >> s;
	s = " " + s;
	for (int i = 1; i <= (n << 1); i++) {
		if (s[i] == 'L')
			ls[++lt] = i, rk[i] = lt;
		else
			rs[++rt] = i, rk[i] = rt;
	}
	cin >> S;
	S = " " + S;
	for (int i = 1; i <= n; i++)
		sum[i] = sum[i - 1] + S[i] - '0';
	for (int i = 1; i <= n; i++) {
		int l = i, r = n, mid = 0, as = 0;
		while (l <= r) {
			mid = (l + r) >> 1;
			if (ls[mid] <= rs[i])
				as = mid, l = mid + 1;
			else
				r = mid - 1; 
		}
		f[i][0] = as;
		sf[i][0] = sum[as];
		l = 1, r = i, mid = 0, as = 0;
		while (l <= r) {
			mid = (l + r) >> 1;
			if (rs[mid] >= ls[i])
				as = mid, r = mid - 1;
			else
				l = mid + 1;
		}
		g[i][0] = as;
		sg[i][0] = sum[as - 1];
	}
	for (int j = 1; j < M; j++)
		for (int i = 1; i <= n; i++) {
			f[i][j] = f[f[i][j - 1]][j - 1];
			sf[i][j] = sf[i][j - 1] + sf[f[i][j - 1]][j - 1];
			g[i][j] = g[g[i][j - 1]][j - 1];
			sg[i][j] = sg[i][j - 1] + sg[g[i][j - 1]][j - 1];
		}
	while (q--) {
		int x, y;
		scanf("%d%d", &x, &y);
		int ds = get_dis(x, y);
		cout << ds << " ";
		int ans = S[x] + S[y] - 2 * '0';
		for (int i = M - 1; ~i; --i)
			if (((ds - 1) >> i) & 1) {
				ans += sf[x][i];
				x = f[x][i];
				ans -= sg[y][i];
				y = g[y][i];
			}				
		cout << ans << "\n";
	}
	return 0;
}

标签:Paths,int,题解,P9019,mid,USACO23JAN,Tractor
From: https://www.cnblogs.com/Rock-N-Roll/p/18436615

相关文章

  • Codeforces Round 944 (Div. 4) A~G题解
    A\(min\)函数和\(max\)函数的使用,按照格式输出即可。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<int,int>PII;voidsolve(){intx,y;cin>>x>>y;cout<<min(x,y)<<'......
  • Codeforces Round 973题解(E)
    E.PrefixGCD假设我们从一个空集合\(b\)开始,不断从\(a\)数组中选择一个元素添加到\(b\)集合的尾部,当把\(a\)数组的元素全部添加到\(b\)中后,得到的\(b\)即为所求的rearrange后的\(a\)。结论1:每次选择使得其和当前\(b\)中所有元素的最大公约数最小的那个\(a_i\)加入到\(b\)的末......
  • ZZJC新生训练赛第一场题解
    先给出比赛链接:https://ac.nowcoder.com/acm/contest/91452下面说一下难度分层:(同一难度下按字典序排序)Easy(简单):B,FMedium(中等):A,E,HHard(困难):C,GAnti-AK(防AK):D,Icin.tie(nullptr)->sync_with_stdio(false);//加速输入输出的A游游的整数翻转将所......
  • 【洛谷】P4819 [中山市选] 杀人游戏 的题解
    【洛谷】P4819[中山市选]杀人游戏的题解题目传送门题解Tarjan我可爱的Tarjan嘻嘻qaq枚举每一个点,然后枚举每条出边,如果相连的两个点在同一个强连通分量中,或者xx......
  • 【洛谷】AT_abc178_d [ABC178D] Redistribution 的题解
    【洛谷】AT_abc178_d[ABC178D]Redistribution的题解洛谷传送门AT传送门题解一个水水的动态规划,阿巴巴巴。题目大概是这样:给定一个正整数SSS,问有多少个数满足以......
  • 【2024秋#113】锦城ACM周测题解
    2024秋#112】锦城ACM周测题解A.awa1思路这里是对答案进行二分,我们预测一个答案的范围,取这个范围的中点,试探是否可行。如果可行,将这个范围的右边的范围缩小到mid(注意我们所求是最短时间,所以当mid可行的时候我们是将预测的最大的值变小),如果不可行,说明我们预测的这个范围左边......
  • Pbootcms源码上传安装后前端显示错乱乱码问题解决方案
    PbootCMS前端显示错乱或乱码问题可能是由多种原因造成的,下面是一些可能的解决方案:检查字符集设置:确认前端页面的字符集设置是否正确。通常在HTML头部会有一个<meta>标签定义字符集,例如<metacharset="UTF-8">。同时检查PbootCMS后台的字符集设置是否与前端一致,确保数据库和......
  • 【题解】【归并排序】—— [NOIP2011 普及组] 瑞士轮
    【题解】【归并排序】——[NOIP2011普及组]瑞士轮[NOIP2011普及组]瑞士轮题目背景题目描述输入格式输出格式输入输出样例输入#1输出#1提示1.思路解析2.AC代码[NOIP2011普及组]瑞士轮通往洛谷的传送门题目背景在双人对决的竞技性比赛,如乒乓球、羽毛球、......
  • P10603 BZOJ4372 烁烁的游戏 题解
    题目传送门前置知识动态树分治|动态开点线段树|标记永久化解法考虑动态点分治。两种操作本质上是将luoguP6329【模板】点分树|震波的操作互换了下,将原需支持单点修改、区间查询的数据结构换成需支持区间修改、单点查询的数据结构即可。区间修改、单点查询的动态开......
  • Light Bulbs (Hard Version) 题解
    提供一个非常另类的解法,没有异或哈希,没有建图,没有缩点和强连通分量,而是使用了并查集和线段树的算法。由于每个颜色恰好有两种,我们考虑把两个颜色的位置\(i,j\)变成一段区间\([i,j]\)(\(i<j\)),然后每个颜色就能用一段区间\([l,r]\)表示。根据题意,如果我们激活了一个区间\([l,......