首页 > 其他分享 >CF1902 D Robot Queries 题解

CF1902 D Robot Queries 题解

时间:2023-12-04 17:00:05浏览次数:41  
标签:ch int 题解 pos Robot CF1902 read 坐标系

Link

CF1902 D Robot Queries

Question

Robot 初始在 \((0,0)\) ,有一个字符串 \(s\) ,表示运行列表

  • \(U\):y+1
  • \(D\):y -1
  • \(L\) :x -1
  • \(R\) :x+1

之后有 \(Q\) 次询问,有\(L,R,x,y\),问把运行序列的 \([L,R]\) 反转,Robot 是否经过了点 \((x,y)\)

Solution

显然,对于一个区间 \([L,R]\) 内部顺序的变化,是不影响 \(s_L\) 执行前的那个点和 \(s_R\) 执行后的那个点的

之后来观察序列反转到底给中间的路径造成了什么影响

image.png

观察这样的一组操作 RDRUU

蓝色的是反转前的,绿色的是反转后的

我们重新在初始点建一个红色的坐标系,在最终点建一个黄色的坐标系,注意黄色坐标系是反着的

发现,红色坐标系里的每个点 \((x,y)\) 在黄色坐标系里面都有,于是,我们把黄色的坐标系里的点映射到红色坐标系

也就是

\[(x',y')=(x_R-x+x_L,y_R-y+y_L) \]

只需要判断 \((x',y')\) 是否在未反转的路径上

如何判断?

map<pair<int,int>,vector<int> > 记录,每个点 \((x,y)\) ,Robot 在这个点的时刻

对于 \((x',y')\) 只需要二分查找,是否有一个时刻在 \([L,R]\) 区间内

对于 \((x,y)\) 观察是否有一个时刻 在 \([L,R]\) 区间外,极端地,只需要判断第时刻和最后一个时刻即可

Code

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
typedef pair<int,int> pii;
inline int read(){
    int ret=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
    while(ch<='9'&&ch>='0')ret=ret*10+ch-'0',ch=getchar();
    return ret*f;
}

char s[maxn];
map<pii,vector<int> > mp;
pii pos[maxn];

void check(){
    int x=read(),y=read(),l=read(),r=read();
    int x_=pos[r].first-x+pos[l-1].first,y_=pos[r].second-y+pos[l-1].second;

    auto& now1=mp[make_pair(x,y)];
    if(now1.size()>0){
        if(now1[0]<l||now1[now1.size()-1]>=r) {printf("YES\n");return ;}
    }
    auto& now2=mp[make_pair(x_,y_)];
    int pos_L=distance(now2.begin(),lower_bound(now2.begin(),now2.end(),l));
    if(pos_L<now2.size()&&now2[pos_L]<r) {printf("YES\n");return ;}

    printf("NO\n");
}
int main(){
    freopen("D.in","r",stdin);
    freopen("D.out","w",stdout);
    int N=read(),Q=read();
    for(int i=1;i<=N;i++)
        s[i]=getchar();
    int x=0,y=0;
    pos[0]=make_pair(x,y);
    mp[pos[0]].push_back(0);
    for(int i=1;i<=N;i++){
        if(s[i]=='U') y++;
        if(s[i]=='D') y--;
        if(s[i]=='L') x--;
        if(s[i]=='R') x++;
        pos[i]=make_pair(x,y);
        mp[pos[i]].push_back(i);
    }
    for(int i=1;i<=Q;i++){
        check();
    }
}

标签:ch,int,题解,pos,Robot,CF1902,read,坐标系
From: https://www.cnblogs.com/martian148/p/17875342.html

相关文章

  • win10 访问 ubuntu 虚拟机 上的Django web 服务 操作 和 问题解决
    虚拟机版本VMware16proubuntu版本 Ubuntu22.04.1LTS 第一步:虚拟机设置NATEdit>VirtualNetworkEditor修改配置更改DHCP设置要注意ip地址要用在虚拟机Ubuntu系统中的网段范围 在NAT添加端口转发 查看ubuntu防火墙sudoufwstatus Status:ina......
  • CF1902 C Insert and Equalize 题解
    LinkCF1902CInsertandEqualizeQuestion有一个\(n\)个元素的数组\(a\),每个元素都不一样现在我们需要在\(a\)中添加一个数字\(a_{n+1}\),和之前的元素都不一样然后选择一个数\(x\),可以在一个元素上加\(x\),为操作一次,(每次加的数都是\(x\))求,操作的最少次数Solution......
  • CF1902 A Binary Imbalance 题解
    LinkCF1902ABinaryImbalanceQuestion给出一个01串,可以在任意一个位置\(i\)插入一个字符,如果\(a_i\nea_{i+1}\)插入的字符为\(0\)否则插入的字符为\(1\)问,是否可以通过任意次操作使得串中\(0\)的数量比\(1\)多Solution如果一个串都为\(0\)肯定符合都......
  • [AGC063C] Add Mod Operations 题解
    题目链接点击打开链接题目解法好难想的构造题!!!到底是怎么想到的???首先无解的条件是好判的,如果有\(i\neqj,\;a_i=a_j\)且\(b_i\neqb_j\),那么就无解将\(a\)从小到大排序考虑下面的构造方式:\(y=curmax+x\),这样可以使最大值清\(0\),其他数都\(+x\),这是一个类似消元的过程,每......
  • CF1902 B Getting Points 题解
    LinkCF1902BGettingPointsQuestionMonocarp的一个学期有\(n\)天,需要修\(P\)个学分,完成一节课程加\(l\)个学费,完成一个任务加\(t\)个学分Monocarp一天可以完成一节课+两个任务任务每周分配一个,也就是day1,day8,day15...问,在可以修满学分的情况下,Monocarp最多休......
  • 湖南省网络攻防邀请赛 RE 题解
    ez_apkk解题过程:将apk拖入jadx,查看MainActivity,发现是简单RC4加密,密钥是“55667788”,最后再将加密结果+1publicStringEncrypt(StringplainText,Stringkey){int[]S=newint[256];byte[]K=newbyte[256];char[]cArr={'\n','+',18......
  • CF1692H Gambling 题解
    题意:思路:考虑离散化:枚举$x$中出现的每一个数$val$,$val$出现的次数为$cnt$,记录$val$每一次出现的索引$idx_i(1\lei\lecnt)$。设$x$中与$val$相等的数贡献为$+1$,与$val$不相等的数贡献为$-1$,那么问题转化为最大连续子段和。由......
  • P1004 [NOIP2000 提高组] 方格取数 题解
    题意:思路:考虑四维$dp$:设$dp[i][j][k][l]$表示两条路径分别走到$(i,j)$和$(k,l)$时所能获取的最大和,显然会超时。考虑三维$dp$:设$dp[i][j][k]$表示两条路径走了$i$步分别走到第$j$行和第$k$行时所能获取的最大和,通过当前步数$i$以及当......
  • vue 编辑器+使用场景+问题解决
    vue编辑器组件添加依赖"dependencies":{"@codemirror/autocomplete":"^6.4.2","@codemirror/commands":"^6.2.1","@codemirror/lang-javascript":"^6.0.2","@codemirror/lan......
  • SP1716 GSS3 - Can you answer these queries III 题解
    题意:给定一个长度为$n$的序列$a$,$q$次操作,每次操作为以下之一:\(0\)\(x\)\(y\):将\(a_x\)修改为\(y\)\(1\)\(l\)\(r\):询问区间\([l,r]\)的最大连续子序列和思路:考虑线段树维护区间最大连续子序列和:线段树每个节点需要维护的信息:区间左端点$l$,区......