题目哦

题意:给出一个序列,序列有四个字母组成,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. Windows10更新后无限重启

    以安全模式进入系统,禁用或卸载显卡驱动. 重启后重新安装驱动.

  2. NLTK词性标注解释

    1.      CC      Coordinating conjunction 连接词2.     CD     Cardinal number  基数词3.     DT     Determin ...

  3. MyBatis01 MyBatis基础知识【搞清楚原理】

    1 MyBatis是什么 mybatis是一个持久层的框架,它对jdbc做了封装:是apache下的顶级项目 mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成 ...

  4. mac上virtualBox的安装和使用

    一.下载和安装 去oracle官网下载mac版的virtualBox. 官网下载地址:https://www.virtualbox.org/. 下载好后按照向导进行安装即可. 二.使用方法 1.新建虚 ...

  5. Blender 安装

    Blender 安装 Blender 安装 windows 上安装 Blender 搞定 Ubuntu Linux 上安装 Blender 搞定 windows 上安装 Blender Step 1 ...

  6. Luogu 2375 [NOI2014]动物园

    字胡串什么的一直不太会,感觉这题…还蛮本质的 考虑暴力求解:num[i]相当于从一直跳nxt,如果nxt[j] * 2 <= i 那么就累加答案 其实这是一个树的结构,也就是说跳到一个结点满足条 ...

  7. 小小c#算法题 - 12 - Joseph Circle(约瑟夫环)

    约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数(从1开始报数),数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又 ...

  8. mybatis spring maven

    maven版本:3.3.9  解压即可使用 spring版本:4.3.9  通过maven进行管理下载 mybatis版本:3.4.4 通过maven进行管理下载 mysql版本:5.7  conne ...

  9. 责任型模式一:Observer(观察者)模式

    目的: Observer模式的宗旨是在多个对象之间定义一对多的关系,以便当一个对象状态改变时,其他所有依赖于这个对象的对象都能得到通知,并被自动更新.常用于业务逻辑层与表现层的分离. 需求:由GUI引 ...

  10. 通过ajax把json对象传入后台

    一.前台ajax部分 function icheckDelete(url){ var parms = { list : array //这是个数组 }; $.ajax({ dataType: &quo ...