Educational Codeforces Round 53 (Rated for Div. 2) C. Vasya and Robot(二分或者尺取)
题意:给出一个序列,序列有四个字母组成,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(二分或者尺取)的更多相关文章
- Educational Codeforces Round 53 (Rated for Div. 2) C Vasya and Robot 二分
题目:题目链接 思路:对于x方向距离与y方向距离之和大于n的情况是肯定不能到达的,另外,如果n比abs(x) + abs(y)大,那么我们总可以用UD或者LR来抵消多余的大小,所以只要abs(x) + ...
- 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 ...
- Educational Codeforces Round 53 (Rated for Div. 2) C. Vasya and Robot
题意:给出一段操作序列 和目的地 问修改(只可以更改 不可以删除或添加)该序列使得最后到达终点时 所进行的修改代价最小是多少 其中代价的定义是 终点序号-起点序号-1 思路:因为代价是终点序号减去 ...
- Educational Codeforces Round 53 (Rated for Div. 2) (前五题题解)
这场比赛没有打,后来补了一下,第五题数位dp好不容易才搞出来(我太菜啊). 比赛传送门:http://codeforces.com/contest/1073 A. Diverse Substring ...
- Educational Codeforces Round 53 (Rated for Div. 2)
http://codeforces.com/contest/1073 A. Diverse Substring #include <bits/stdc++.h> using namespa ...
- Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum (数位dp求和)
题目链接:https://codeforces.com/contest/1073/problem/E 题目大意:给定一个区间[l,r],需要求出区间[l,r]内符合数位上的不同数字个数不超过k个的数的 ...
- [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,如果 ...
- Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum
https://codeforces.com/contest/1073/problem/E 题意 求出l到r之间的符合要求的数之和,结果取模998244353 要求:组成数的数位所用的数字种类不超过k ...
- 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即可.(感 ...
随机推荐
- hadoop再次集群搭建(3)-如何选择相应的hadoop版本
之前接触过很多很多hadoop版本,现在重新搭建平台,面临选择哪个版本的问题. 当我们决定是否采用某个软件用于开源环境时,通常需要考虑以下几个因素: (1)是否为开源软件,即是否免费. (2) 是否有 ...
- php5.6,curl上传的变化
$ch = curl_init ();curl_setopt ( $ch, CURLOPT_SAFE_UPLOAD, false); //php5.6要加上这个 $fields = array(); ...
- solr的查询语法、查询参数、检索运算符
转载自:http://martin3000.iteye.com/blog/1328931 1.查询语法 solr的一些查询语法 1.1. 首先假设我的数据里fields有:name, tel, add ...
- opencv3.2加载图片
#include <opencv2/opencv.hpp>#include <iostream> using namespace cv;using namespace std; ...
- c++正确处理 is-a has-a关系
比如.我们想实现一个Set类,而已经有一个List类可提供给你使用,我们到底用is-a(public继承)关系还是用has-a(组合)关系呢? 1:如果使用is-a关系,则 class Set:pub ...
- p3172 选数
传送门 分析 对这个$f(k)$整除分块,用杜教筛搞出$\mu$的部分然后另一部分快速幂即可 代码 #include<iostream> #include<cstdio> #i ...
- 对 BFC 的理解
对CSS有了解的道友们肯定都知道盒式模型这个概念,对一个元素设置CSS,首先需要知道这个元素是block还是inline类型.而BFC就是用来格式化块级盒子,同样管理inline类型的盒子还有IFC, ...
- Batch Normalization 与Dropout 的冲突
BN或Dropout单独使用能加速训练速度并且避免过拟合 但是倘若一起使用,会产生负面效果. BN在某些情况下会削弱Dropout的效果 对此,BN与Dropout最好不要一起用,若一定要一起用,有2 ...
- 小小c#算法题 - 11 - 二叉树的构造及先序遍历、中序遍历、后序遍历
在上一篇文章 小小c#算法题 - 10 - 求树的深度中,用到了树的数据结构,树型结构是一类重要的非线性数据结构,树是以分支关系定义的层次结构,是n(n>=0)个结点的有限集.但在那篇文章中,只 ...
- Java50道经典习题-程序38 求字符串长度
题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度. import java.util.Scanner; public class Prog38 { public stat ...