题目哦

题意:给出一个序列,序列有四个字母组成,U:y+1,D:y-1 , L:x-1 , R:x+1;   这是规则 。 给出(x,y) 问可不可以经过最小的变化这个序列可以由(0,0) 变到(x,y)

注意!!!!是可以变任意序列的!不是只有y变y , x变x ,比赛看错题意导致没A ,

分析:这需要借助前置和与后缀和 , 这样的话我就可以知道[L , R] 这个区间需要变化什么 , 没错你可以理解为题目的范围n变为[L , R] , x变为x-xl[L+1]-xr[R+1] ,y同理; 这样我们就可以运用尺取法,不断的枚举区间就好了。我用的是尺取法 , 许多人用的是二分 ,不过思想是一样的,这个一样贴出代码

需要理解下判断条件问题(结合代码):很容易就知道n<abs(x)+abs(y) 这样是不行的, 还有就是n与(abs(x)+abs(y))的奇偶性也必须一样 , 因为不可能有偶数次运算后变奇数(建议模拟一遍);既然前面说到是理解为题目的范围n变为[L , R] , x变为x-xl[L+1]-xr[R+1] ,y同理 , 那在二分或者尺取的时候的判断也是如此

尺取:

#include<bits/stdc++.h>
using namespace std ;
const int maxn = *1e5+;
#define ll long long
ll xl[maxn],xr[maxn],yl[maxn],yr[maxn];
char s[maxn];
int main( )
{
int n,x,y; scanf("%d",&n);
getchar();
scanf("%s",s+);
scanf("%d%d",&x,&y);
int NOWX=,NOWY=;
int MIN=n;
for(int i= ; i<=n ; i++)
{
xl[i]=xl[i-];
yl[i]=yl[i-];
if(s[i]=='U')
{
yl[i]++;
NOWY++;
}
if(s[i]=='D')
{
yl[i]--;
NOWY--;
}
if(s[i]=='L')
{
xl[i]--;
NOWX--;
}
if(s[i]=='R')
{
xl[i]++;
NOWX++;
}
} if(NOWX==x&&NOWY==y)
{
puts("");
return ;
}
if(abs(x)+abs(y)>n)
{
puts("-1");
return ;
}
if((n-(abs(x)+abs(y)))%!=)
{
puts("-1");
return ;
}
for(int i=n ; i>= ; i--)
{
xr[i]=xr[i+];
yr[i]=yr[i+];
if(s[i]=='U')
{
yr[i]++;
}
if(s[i]=='D')
{
yr[i]--;
}
if(s[i]=='L')
{
xr[i]--;
}
if(s[i]=='R')
{
xr[i]++;
}
}
int head,tail;
head=;
tail=;
while()
{ int X=xr[tail+]+xl[head-];
int Y=yr[tail+]+yl[head-];
int D=tail-head+;
// printf("%d %d (%d %d)\n",head,tail,X,Y);
if((D>=abs(x-X)+abs(y-Y))&&(D-abs(X-x)-abs(Y-y))%==)
{
head++;
MIN=min(MIN,D);
}
else
tail++;
if(tail>n)
break; }
printf("%d\n",MIN);
}

二分:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+;
int xl[N],yl[N],xr[N],yr[N];
int n;
int x,y;
int check(int mid)
{
int l=;
for(int r=mid;r<n;r++)
{
int tx=xl[l-]+xr[r+];
int ty=yl[l-]+yr[r+];
int rx=abs(x-tx);
int ry=abs(y-ty);
if(mid>=rx+ry && (mid-(rx+ry))%==)
return ;
l++;
}
return ;
}
int main()
{
cin>>n;
string s;
cin>>s;
s='@'+s;
n++;
for(int i=;i<n;i++)
{
xl[i]=xl[i-],
yl[i]=yl[i-];
if(s[i]=='U')
{
yl[i]++;
}
if(s[i]=='D')
{
yl[i]--;
}
if(s[i]=='L')
{
xl[i]--;
}
if(s[i]=='R')
{
xl[i]++;
}
}
for(int i=n-;i>;i--)
{
xr[i]=xr[i+],
yr[i]=yr[i+];
if(s[i]=='U')
{
yr[i]++;
}
if(s[i]=='D')
{
yr[i]--;
}
if(s[i]=='L')
{
xr[i]--;
}
if(s[i]=='R')
{
xr[i]++;
}
}
cin>>x>>y;
int l=-,h=n;
while(h-l>)
{
int mid=(h+l)/;
if(check(mid))
h=mid;
else l=mid;
}
if(h==n)cout<<"-1";
else
cout<<h;
}

Educational Codeforces Round 53 (Rated for Div. 2) C. Vasya and Robot(二分或者尺取)的更多相关文章

  1. Educational Codeforces Round 53 (Rated for Div. 2) C Vasya and Robot 二分

    题目:题目链接 思路:对于x方向距离与y方向距离之和大于n的情况是肯定不能到达的,另外,如果n比abs(x) + abs(y)大,那么我们总可以用UD或者LR来抵消多余的大小,所以只要abs(x) + ...

  2. Educational Codeforces Round 53 (Rated for Div. 2) C. Vasya and Robot 【二分 + 尺取】

    任意门:http://codeforces.com/contest/1073/problem/C C. Vasya and Robot time limit per test 1 second mem ...

  3. Educational Codeforces Round 53 (Rated for Div. 2) C. Vasya and Robot

    题意:给出一段操作序列 和目的地 问修改(只可以更改 不可以删除或添加)该序列使得最后到达终点时  所进行的修改代价最小是多少 其中代价的定义是  终点序号-起点序号-1 思路:因为代价是终点序号减去 ...

  4. Educational Codeforces Round 53 (Rated for Div. 2) (前五题题解)

    这场比赛没有打,后来补了一下,第五题数位dp好不容易才搞出来(我太菜啊). 比赛传送门:http://codeforces.com/contest/1073 A. Diverse Substring ...

  5. Educational Codeforces Round 53 (Rated for Div. 2)

    http://codeforces.com/contest/1073 A. Diverse Substring #include <bits/stdc++.h> using namespa ...

  6. Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum (数位dp求和)

    题目链接:https://codeforces.com/contest/1073/problem/E 题目大意:给定一个区间[l,r],需要求出区间[l,r]内符合数位上的不同数字个数不超过k个的数的 ...

  7. [codeforces][Educational Codeforces Round 53 (Rated for Div. 2)D. Berland Fair]

    http://codeforces.com/problemset/problem/1073/D 题目大意:有n个物品(n<2e5)围成一个圈,你有t(t<1e18)元,每次经过物品i,如果 ...

  8. Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum

    https://codeforces.com/contest/1073/problem/E 题意 求出l到r之间的符合要求的数之和,结果取模998244353 要求:组成数的数位所用的数字种类不超过k ...

  9. Educational Codeforces Round 53 (Rated for Div. 2)G. Yet Another LCP Problem

    题意:给串s,每次询问k个数a,l个数b,问a和b作为后缀的lcp的综合 题解:和bzoj3879类似,反向sam日神仙...lcp就是fail树上的lca.把点抠出来建虚树,然后在上面dp即可.(感 ...

随机推荐

  1. Android 数据库 OrmLite Failed to open database

    04-01 16:49:32.720: E/SQLiteLog(1894): (14) cannot open file at line 30204 of [00bb9c9ce4]04-01 16:4 ...

  2. StackMapTable format error

    环境:Oracle Java 7 , Mac OSX 报错如上图所示,主要是 Caused by: java.lang.ClassFormatError: StackMapTable format e ...

  3. shell直接退出后 后台进程关闭的原因和对处

    在linux上进行测试时发现启动后台进程后,如果使用exit退出登录shell,shell退出后后台进程还是能够正常运行,但如果直接关闭登陆的窗口(如直接关掉xshell),那后台进程就会一起终了.都 ...

  4. 使用Java建立聊天客户端

    ---------------siwuxie095                             关于 聊天服务器,详见本人博客的分类:来一杯Java, 里面的 使用ServerSocket ...

  5. SpringBoot10 整合JSP

    1 整合JSP 1.1 导入相关依赖 JSP依赖.JSTL依赖 <?xml version="1.0" encoding="UTF-8"?> < ...

  6. TaikrSpaceShooterStartKit.unitypackage包下载地址

    有好多教程里面没有资源包,现在加密分享给大家 unity4.*  链接: https://pan.baidu.com/s/1XMo2zVpV3ZhkNZKOb6H0yw 密码: tqnt unity5 ...

  7. cakephp目录结构

  8. Android 实现形态各异的双向侧滑菜单 自定义控件来袭(转载)

    1.概述 关于自定义控件侧滑已经写了两篇了~~今天决定把之前的单向改成双向,当然了,单纯的改动之前的代码也没意思,今天不仅会把之前的单向改为双向,还会多添加一种侧滑效果,给大家带来若干种形态各异的双向 ...

  9. Gremlin:图遍历语言

    Gremlin简介 Gremlin是Apache TinkerPop 框架下的图遍历语言.Gremlin是一种函数式数据流语言,可以使得用户使用简洁的方式表述复杂的属性图(property graph ...

  10. com.fasterxml.jackson.databind.JavaType.isReferenceType

    <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-map ...