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即可.(感 ...
随机推荐
- ubuntu 12.04 下 eclipse关联 source code
一.JDK source code 命令行中: sudo apt-get install openjdk-7-source 下好的jdk源码在 Linux 在目录 usr/lib/jvm/openjd ...
- 第一个Dockerfile
1. 创建docker目录 $ mkdir docker && cd docker 2. 编写Dockerfile $ vim Dockerfile [docker/Dockfile] ...
- css知多少(9)——float下篇(转)
css知多少(9)——float下篇 float内容比较多,咱们分上.下两篇来介绍,上篇已经写完,这是下篇.建议大家先把上篇看了,再来看下文,精彩内容不要掠过啊. 1. 清除float <上 ...
- Tensorflow fetch和feed
import tensorflow as tf #Fetch input1 = tf.constant(1.0)input2 = tf.constant(3.0)input3 = tf.constan ...
- 解析IFC数据并转成json格式
{ "com.bim.ifc.ifc2x3.ifc2x3tc1.IfcBuilding (#104)-": [{ "objKey": "GlobalI ...
- Opencv中Rect_类
Rect_类有些意思,成员变量x.y.width.height,分别为左上角点的坐标和矩形的宽和高.常用的成员函数有Size()返回值为一个Size,area()返回矩形的面积,contains(Po ...
- HDU 2819 Swap (二分匹配+破输出)
题意:给定上一个01矩阵,让你变成一个对角全是 1 的矩阵. 析:二分匹配,把行和列看成两个集合,用匈牙利算法就可以解决,主要是在输出解,在比赛时一紧张不知道怎么输出了. 输出应该是要把 match[ ...
- Elasticsearch suggester搜索建议初步
环境 Elasticsearch 2.3.5 Elasticsearch-ik-plugin 实现 搜索建议的对象 假设有以下两个json对象,需要对其中tags字段进行搜索建议: //对象Produ ...
- [译]如何在visual studio中调试Javascript
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- Android camera调用出现错误解决方法
开发时,先是使用三星的手机测试,发现一切正常: 但是到了小米的手机的时候,发现图片很模糊,发现是设置camera.setParameters(parameters);报错导致用的是默认的最小的分辨率, ...