首页 > 其他分享 >题解 AT3726 [ARC087B] FT Robot

题解 AT3726 [ARC087B] FT Robot

时间:2023-07-17 21:22:04浏览次数:307  
标签:FT nn int 题解 ey AT3726 ARC087B

首先可以观察到一个非常重要的性质:对于一次前进的操作,如果前面有奇数次转向,则走上下,否则走左右。(当然如果一开始就前进就只能走右)

于是我们可以将其拆成许多的“块”,并分成两类,即前进方向为左右还是上下。

然后对于两个维度分别 dp 。

\(f_{i},_{j}=f_{i-1},_{j-val} \ | \ f_{i-1},_{j+val}\)

\(g\) 同理。

当然还要对负数的情况以及边界进行一下处理。

code:

#include <bits/stdc++.h>
using namespace std;
const int N = 8000 + 5, nn = 8000;
string s;
int len, ex, ey, tot = 0;
bool f[2][N * 2], g[2][N * 2];
struct node{int type, num;}a[N];
vector<int> v[2];
int main() {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	cin >> s >> ex >> ey; len = s.size(); s = "." + s;
	int cnt = 0, flag = 0;
	for (int i = 1; i <= len; ++i) { //预处理出每个块 
		if (s[i] == 'F') {
			if (!flag) a[++tot].type = cnt % 2, a[tot].num = 1, flag = 1;
			else if (flag) ++a[tot].num;
		} else {
			flag = 0;
			++cnt;
		}
	}
	int st = 1, t = 0, t2 = 0;
	if (s[1] == 'F') st = 2, f[0][a[1].num + nn] = 1; //单独处理一下一开始就前进的情况 
	for (int i = st; i <= tot; ++i) v[a[i].type].push_back(a[i].num);
	g[0][nn] = 1;
	if (st == 1) f[0][nn] = 1;
	for (int i = 0; i < v[0].size(); ++i) { //横坐标DP 
		for (int j = -nn; j <= nn; ++j) {
			f[t ^ 1][j + nn] = 0;
			if (j - v[0][i] >= -nn) f[t ^ 1][j + nn] |= f[t][j - v[0][i] + nn];
			if (j + v[0][i] <= nn) f[t ^ 1][j + nn] |= f[t][j + v[0][i] + nn];
		}
		t ^= 1;
	}
	for (int i = 0; i < v[1].size(); ++i) { //纵坐标DP 
		for (int j = -nn; j <= nn; ++j) {
			g[t2 ^ 1][j + nn] = 0;
			if (j - v[1][i] >= -nn) g[t2 ^ 1][j + nn] |= g[t2][j - v[1][i] + nn];
			if (j + v[1][i] <= nn) g[t2 ^ 1][j + nn] |= g[t2][j + v[1][i] + nn];
		}
		t2 ^= 1;
	}
	if (f[t][ex + nn] && g[t2][ey + nn]) cout << "Yes" << endl; //如果都能达到,输出Yes 
	else cout << "No" << endl;
	return 0;
}

标签:FT,nn,int,题解,ey,AT3726,ARC087B
From: https://www.cnblogs.com/HQJ2007/p/17561259.html

相关文章

  • 领略一下swift函数派发机制流程
    函数派发Swift中函数的派发机制有三种:静态派发,函数表派发,消息派发。静态派发静态派发是指在运行时不需要查表,直接跳转到方法进行执行。静态派发的性能也是最高的。c语言采用的是直接派发。函数表派发class类型采用函数表派发。当一个对象调用一个函数时,会从对象的头8字节找到......
  • Charles抓取https请求及常见问题解决
    一、背景APP测试的时候,通常都需要通过抓包工具抓取各类请求,查看接口的入参、返回值等,用于分析定位问题。常用的抓包工具有fiddler、charles等,抓取http的请求比较简单,https的请求稍显复杂。由于更喜欢charles的页面风格,本篇文章主要介绍以下两点:1、Charles如何抓取电脑端和手机端的......
  • 使用 Microsoft AI 打造你的首款智能机器人(入门只需要1小时)
    语言和人文是基础,数理化是未来。当高科技烂大街成为常态,还有啥理由不努力学习AI科学呢。 最近在学习AI,一位朋友正好送了我一本AI技术的书籍,如获至宝,写点经验。书的主题:使用MicrosoftAI打造你的首款智能机器人 一、AI养猪尼泊尔农村出来的一个大学生M女士,和大学同学一起,构建了......
  • CF1808C Unlucky Numbers 题解
    可以证明答案是\(l\)或\(r\)的一段前缀,拼上后面全部相同的一段字符\(d\),证明方式类似数位dp。能够自由填的数字一定是相等的,这样不会影响幸运值。前面那些不能自由填写的,就是\(l\)或\(r\)的一段前缀。假如不是\(l\)或\(r\)的一段前缀,必然填写相等的更好,而这种情况已......
  • P7809 [JRKSJ R2] 01 序列 题解
    前言传送门blog思路Problem1问题一问的是最长不下降子序列的长度,在一个$01$串中的最长不下降子序列,总共有三种$000\dots$,$000\dots111\dots$和$111111\dots$。可以把找到以上三种最长不下降子序列问题变为:$$\max^r_{i=l}(\sum_{j=l}^i[a_j=0])+(\sum_{j=i+1}^......
  • P7333 [JRKSJ R1] JFCA 题解
    前言传送门blog思路首先看数据范围$10^5$,$O(n\log_2n)$可以过,自然想到二分。二分具有单调性,那么如何确保整个$a$序列按顺序排列呢?我们可以使用st表维护区间最大值,如果在这个距离中已经有了$a_i\geb_j$那么最大值一定指向的是新加入进来的那个值,否则在之前二分就......
  • P8708 [蓝桥杯 2020 省 A1] 整数小拼接 题解
    前言传送门blog思路这种选出两个数拼接在一起的题,一看就可以使用two-point,我们使用$l$和$r$分别从最大的和最小的开始搜索,进行两次。以$l$为头,$r$为尾。以$r$为头,$l$为尾。如何比较大小呢?我们可以先去做宇宙总统这道题。首先排序的$cmp$:boolcmp(strin......
  • UVA10791 最小公倍数的最小和 Minimum Sum LCM 题解
    前言长沙市一中8机房0714模拟测1。传送门blog思路本题思路,首先我们先看$\operatorname{lcm}$,明显要使得这些数的$\operatorname{lcm}=n$那么我们就需要所有的数的质因子必须包含$n$的质因子。若$1\lea,b$,则$a\timesb\gea+b$,所以我们就有了策略。将同一个质因......
  • P9451 [ZSHOI-R1] 新概念报数 题解
    目录DescriptionSolutionCodeDescription在此题中,对于一个数\(x\),若\(\texttt{popcount}(x)\geq3\)(即\(x\)在二进制下\(\texttt{1}\)的个数大于等于三时),那它是非法的,否则其为合法的。给定\(T\)个数,如果当前的数\(x\)是非法的,则输出No,Commander,否则输出第一个大于......
  • requests.exceptions.ProxyError问题解决方法
    出现这个问题是因为你系统上在使用代理,然后你的代理又是规则匹配的。https://stackoverflow.com/questions/36906985/switch-off-proxy-in-requests-library3种解决方法:headers={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64;rv:109.0)Gecko/20100101Fi......