(简单写法) Codeforces Round #619 (Div. 2) D. Time to Run

48 篇文章 0 订阅
11 篇文章 0 订阅

 具体走法如上图:先右,然后折回,再向下,在重复直到最后一行,最后一行先向右,然后上再折回,再左,一直重复直到走回原点

 这个走法模拟并不是难点,难点在与它每步最多四格,然后可以多次重复,步数不能超过3000,如果直接模拟我就看到有博客写到了一两百行,变成了一个大模拟,实际有个简单写法

先模拟走一遍,用字符串存起来,这个字符串中前k个,连续相同的字符就可以压缩到一步,然后输出就可以了

 

Bashar was practicing for the national programming contest. Because of sitting too much in front of the computer without doing physical movements and eating a lot Bashar became much fatter. Bashar is going to quit programming after the national contest and he is going to become an actor (just like his father), so he should lose weight.

In order to lose weight, Bashar is going to run for k

kilometers. Bashar is going to run in a place that looks like a grid of n rows and m columns. In this grid there are two one-way roads of one-kilometer length between each pair of adjacent by side cells, one road is going from the first cell to the second one, and the other road is going from the second cell to the first one. So, there are exactly (4nm−2n−2m)

roads.

Let's take, for example, n=3

and m=4. In this case, there are 34

roads. It is the picture of this case (arrows describe roads):

 

Bashar wants to run by these rules:

  • He starts at the top-left cell in the grid;
  • In one move Bashar may go up (the symbol 'U'), down (the symbol 'D'), left (the symbol 'L') or right (the symbol 'R'). More formally, if he stands in the cell in the row i

and in the column j, i.e. in the cell (i,j) he will move to:

  • in the case 'U' to the cell (i−1,j)
  • ;
  • in the case 'D' to the cell (i+1,j)
  • ;
  • in the case 'L' to the cell (i,j−1)
  • ;
  • in the case 'R' to the cell (i,j+1)
    • ;
  • He wants to run exactly k
  • kilometers, so he wants to make exactly k
    • moves;
    • Bashar can finish in any cell of the grid;
    • He can't go out of the grid so at any moment of the time he should be on some cell;
    • Bashar doesn't want to get bored while running so he must not visit the same road twice. But he can visit the same cell any number of times.

    Bashar asks you if it is possible to run by such rules. If it is possible, you should tell him how should he run.

    You should give him a

    steps to do and since Bashar can't remember too many steps, a should not exceed 3000. In every step, you should give him an integer f and a string of moves s of length at most 4 which means that he should repeat the moves in the string s for f

    times. He will perform the steps in the order you print them.

    For example, if the steps are 2

    RUD, 3 UUL then the moves he is going to move are RUD + RUD + UUL + UUL + UUL =

    RUDRUDUULUULUUL.

    Can you help him and give him a correct sequence of moves such that the total distance he will run is equal to k

    kilometers or say, that it is impossible?

    Input

    The only line contains three integers n

    , m and k (1≤n,m≤500, 1≤k≤109

    ), which are the number of rows and the number of columns in the grid and the total distance Bashar wants to run.

    Output

    If there is no possible way to run k

    kilometers, print "NO" (without quotes), otherwise print "YES" (without quotes) in the first line.

    If the answer is "YES", on the second line print an integer a

    (1≤a≤3000) — the number of steps, then print a

    lines describing the steps.

    To describe a step, print an integer f

    (1≤f≤109) and a string of moves s of length at most 4. Every character in s

    should be 'U', 'D', 'L' or 'R'.

    Bashar will start from the top-left cell. Make sure to move exactly k

    moves without visiting the same road twice and without going outside the grid. He can finish at any cell.

    We can show that if it is possible to run exactly k

    kilometers, then it is possible to describe the path under such output constraints.

    Examples

    Input

    Copy

    3 3 4
    
    Output

    Copy

    YES
    2
    2 R
    2 L
    
    Input

    Copy

    3 3 1000000000
    
    Output

    Copy

    NO
    
    Input

    Copy

    3 3 8
    
    Output

    Copy

    YES
    3
    2 R
    2 D
    1 LLRR
    
    Input

    Copy

    4 4 9
    
    Output

    Copy

    YES
    1
    3 RLD
    
    Input

    Copy

    3 4 16
    
    Output

    Copy

    YES
    8
    3 R
    3 L
    1 D
    3 R
    1 D
    1 U
    3 L
    1 D
    

    Note

    The moves Bashar is going to move in the first example are: "RRLL".

    It is not possible to run 1000000000

    kilometers in the second example because the total length of the roads is smaller and Bashar can't run the same road twice.

    The moves Bashar is going to move in the third example are: "RRDDLLRR".

    The moves Bashar is going to move in the fifth example are: "RRRLLLDRRRDULLLD". It is the picture of his run (the roads on this way are marked with red and numbered in the order of his running):

     

    #include<bits/stdc++.h>
    #define LOCAL
    using namespace std;
    typedef unsigned u;
    #define ll long long
    #define maxn 1350500
    #define esp 1e-10
    #define pi acos(-1.0)
    char a[maxn];
    string ans[maxn];int sum[maxn];
    int main()
    {
        ll n,m,k;
        cin>>n>>m>>k;
        if(k>4*n*m-2*n-2*m)
        {
            printf("NO\n");
            return 0;
        }
        ll id=0;
        for(ll i=1;i<=n;i++)
        {
            for(ll j=1;j<=m-1;j++) a[++id]='R';
            if(i!=n)
            {
    
                for(ll j=1;j<=m-1;j++) a[++id]='L';
                a[++id]='D';
            }
        }
    
        for(ll i=m;i>=1;i--)
        {
            for(ll j=1;j<=n-1;j++) a[++id]='U';
            if(i!=1)
            {
                for(ll j=1;j<=n-1;j++) a[++id]='D';
                a[++id]='L';
            }
        }//printf("a=%s\n",a+1);
        ll x=1;
        for(ll i=1;i<=k;i++)
        {
            ans[x].clear();
            ans[x]+=a[i];
            if(ans[x]==ans[x-1]) sum[x-1]++;
            else
            {
                sum[x]++;
                x++;
            }
        }
        x--;
        printf("YES\n%lld\n",x);
        for(ll i=1;i<=x;i++)
        {
            cout<<sum[i]<<" "<<ans[i]<<'\n';
        }
    }
    

     

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值