Codeforces Round #619 (Div. 2)D.Time to go

大毒瘤实现题......

#include<bits/stdc++.h>
using namespace std;
 
long long n,m,k,all;
vector< pair< int , string > >v1,v2;
 
void cal(){
    for(int i=0;i<v2.size();i++){
        v1.push_back(v2[i]);
    }
}
 
int main(){
    cin>>n>>m>>k;
    if(4*n*m-2*n-2*m<k){
        cout<<"NO"<<endl;
        exit(0);
    }
    
    if(n==1){
        cout<<"YES"<<endl;
        cout<<k<<endl;
        string ppp;
        for(int i=0;i<m-1;i++){
            ppp=ppp+"R";
        }
        for(int i=0;i<m-1;i++){
            ppp=ppp+"L";
        }
        ppp.resize(k);
        for(int i=0;i<k;i++)cout<<1<<" "<<ppp[i]<<endl;
        exit(0);
    }
    else if(m==1){
        cout<<"YES"<<endl;
        cout<<k<<endl;
        string ppp;
        for(int i=0;i<n-1;i++){
            ppp=ppp+"D";
        }
        for(int i=0;i<n-1;i++){
            ppp=ppp+"U";
        }
        ppp.resize(k);
        for(int i=0;i<k;i++)cout<<1<<" "<<ppp[i]<<endl;
        exit(0);
    }
    
    all=0;
    for(int i=1;i<=n;i++){
        if(i==1){
            v1.push_back(make_pair(m-1,"R"));
            v1.push_back(make_pair(m-1,"L"));
            v1.push_back(make_pair(1,"D"));
            all=all+2*(m-1)+1;
        }
        else if(i==n){
            v1.push_back(make_pair(m-1,"R"));
            v1.push_back(make_pair(m-1,"UDL"));
            v1.push_back(make_pair(n-1,"U"));
            all=all+4*(m-1)+(n-1);
        }
        else{
            v1.push_back(make_pair(m-1,"R"));
            v1.push_back(make_pair(m-1,"UDL"));
            v1.push_back(make_pair(1,"D"));
            all=all+4*(m-1)+1;
        }
    }
    while(all>k){
        string pp=v1.back().second;
        string zzz;
        long long tmp=v1.back().second.size();
        long long cishu=v1.back().first;
        v1.pop_back();
        if(all-tmp*cishu>k){
            all-=tmp*cishu;
            continue;
        }
        all-=tmp*cishu;
        long long cur=k-all;
        v2.clear();
        if(cur>=tmp)v2.push_back(make_pair(cur/tmp,pp));
        if((cur%tmp)==0)break;
        for(int i=0;i<cur%tmp;i++)zzz=zzz+pp[i];
        v2.push_back(make_pair(1,zzz));
    }
    cal();
    cout<<"YES"<<endl;
    cout<<v1.size()<<endl;
    for(int i=0;i<v1.size();i++){
        cout<<v1[i].first<<" "<<v1[i].second<<endl;
    }
}
View Code

嘛,考虑怎么(最简单的)走最多,然后判断一下答案,然后输出路径就好了

思想很简单....

但我当时打的时候没实现出来.....

自闭....(被C搞到自闭,最后只剩30+分钟)(然后一直再想着缩圈......(wtsl))

.....

猜你喜欢

转载自www.cnblogs.com/shatianming/p/12307086.html