题解 伊莉斯
首先可以确定是按位确定
考虑怎么 check 一个位置到 \((n, n)\) 的最小代价
发现只有角上的四个魔眼是有用的
然后分类讨论这个点在什么地方
然后大力写就可以了
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 4000010
#define fir first
#define sec second
#define ll long long
// #define int long long
char buf[1<<21], *p1=buf, *p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf, 1, 1<<21, stdin)), p1==p2?EOF:*p1++)
inline ll read() {
ll ans=0, f=1; char c=getchar();
while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
return ans*f;
}
int n, a, b, c;
ll t;
namespace force{
int top;
char sta[N];
ll rest[15][15];
void dfs(int x, int y) {
if (x!=1||y!=1) for (int i=a; i<a+c; ++i) for (int j=b; j<b+c; ++j) rest[i][j]-=abs(x-i)+abs(y-j);
bool able=1;
for (int i=a; i<a+c; ++i) for (int j=b; j<b+c; ++j) if (rest[i][j]<0) able=0;
if (able) {
if (x==n&&y==n) {
for (int i=1; i<=top; ++i) cout<<sta[i]; cout<<endl;
exit(0);
}
if (x<n) sta[++top]='R', dfs(x+1, y), --top;
if (y<n) sta[++top]='U', dfs(x, y+1), --top;
}
if (x!=1||y!=1) for (int i=a; i<a+c; ++i) for (int j=b; j<b+c; ++j) rest[i][j]+=abs(x-i)+abs(y-j);
}
void solve() {
for (int i=0; i<c; ++i) for (int j=0; j<c; ++j) rest[a+i][b+j]=t;
dfs(1, 1);
puts("Again");
}
}
namespace task1{
int top;
char sta[N];
inline ll qsum(ll n) {return n*(n+1)/2;}
bool able(int x, int y) {
ll tem=t-abs(x-a)-abs(y-b);
if (x<=a&&y<=b) {
return qsum(a-x+b-y)+qsum(n-a+n-b)<=tem;
}
else if (x<=a) {
return qsum(a-x)+1ll*(a-x)*(y-b)+qsum(n-a+n-y)+1ll*(n-a+n-y)*(y-b)<=tem;
}
else if (y<=b) {
return qsum(b-y)+1ll*(b-y)*(x-a)+qsum(n-x+n-b)+1ll*(n-x+n-b)*(x-a)<=tem;
}
else return qsum(n-x+n-y)+1ll*(n-x+n-y)*(x-a+y-b)<=tem;
}
void solve() {
int x=1, y=1;
if (!able(1, 1)) {puts("Again"); return ;}
for (int i=1; i<=2*(n-1); ++i) {
if (x<n && able(x+1, y)) sta[++top]='R', ++x, t-=abs(x-a)+abs(y-b);
else if (y<n && able(x, y+1)) sta[++top]='U', ++y, t-=abs(x-a)+abs(y-b);
else {puts("Again"); return ;}
}
for (int i=1; i<=top; ++i) cout<<sta[i]; cout<<endl;
}
}
namespace task{
int top;
char sta[N];
pair<int, int> p[2][2];
ll rest[2][2], tem[2][2];
inline ll qsum(ll n) {return n*(n+1)/2;}
bool able(int x, int y) {
// cout<<"able: "<<x<<' '<<y<<endl;
for (int i=0; i<2; ++i) for (int j=0; j<2; ++j) tem[i][j]=rest[i][j];
if (x!=1||y!=1) {
for (int i=0; i<2; ++i)
for (int j=0; j<2; ++j)
tem[i][j]-=abs(p[i][j].fir-x)+abs(p[i][j].sec-y);
}
// cout<<"tem: "<<endl;
// for (int i=1; ~i; --i) {for (int j=0; j<2; ++j) cout<<setw(3)<<tem[i][j]<<' '; cout<<endl;}
if (x<=p[0][0].fir&&y<=p[0][0].sec) {
// cout<<"case 1"<<endl;
tem[0][0]-=qsum(p[0][0].fir-x+p[0][0].sec-y-1);
tem[0][1]-=qsum(p[0][0].fir-x+p[0][0].sec-y-1)+1ll*(p[0][0].fir-x+p[0][0].sec-y)*(c-1);
tem[1][0]-=qsum(p[0][0].fir-x+p[0][0].sec-y-1)+1ll*(p[0][0].fir-x+p[0][0].sec-y)*(c-1);
tem[1][1]-=qsum(p[0][0].fir-x+p[0][0].sec-y-1)+1ll*(p[0][0].fir-x+p[0][0].sec-y)*2*(c-1);
tem[1][1]-=qsum(n-p[1][1].fir+n-p[1][1].sec);
tem[1][0]-=qsum(n-p[1][1].fir+n-p[1][1].sec)+1ll*(n-p[1][1].fir+n-p[1][1].sec)*(c-1);
tem[0][1]-=qsum(n-p[1][1].fir+n-p[1][1].sec)+1ll*(n-p[1][1].fir+n-p[1][1].sec)*(c-1);
tem[0][0]-=qsum(n-p[1][1].fir+n-p[1][1].sec)+1ll*(n-p[1][1].fir+n-p[1][1].sec)*2*(c-1);
tem[0][0]-=qsum(2*(c-1)); tem[1][1]-=qsum(2*(c-1)-1);
if (tem[0][0]<0 || tem[1][1]<0) return 0;
ll sum1=qsum(c-2)+qsum(c-1), sum2=qsum(c-1)+2ll*(c-1)*(c-1)+qsum(c-2);
// for (int i=0; i<=(c-1)*(c-1); ++i) if (tem[1][0]-sum1-2*i>=0 && tem[0][1]-sum2+2*i>=0) return 1;
// return 0;
ll k=min((tem[1][0]-sum1)/2, 1ll*(c-1)*(c-1));
return k>=0 && tem[1][0]-sum1-2*k>=0 && tem[0][1]-sum2+2*k>=0;
}
else if (x<=p[0][1].fir&&y<=p[0][1].sec) {
// cout<<"case 2"<<endl;
tem[0][0]-=qsum(p[0][1].sec-y-1)+1ll*(p[0][1].sec-y)*(x-p[0][0].fir);
tem[0][1]-=qsum(p[0][1].sec-y-1)+1ll*(p[0][1].sec-y)*(p[0][1].fir-x);
tem[1][0]-=qsum(p[0][1].sec-y-1)+1ll*(p[0][1].sec-y)*(x-p[0][0].fir+c-1);
tem[1][1]-=qsum(p[0][1].sec-y-1)+1ll*(p[0][1].sec-y)*(p[0][1].fir-x+c-1);
tem[1][1]-=qsum(n-p[1][1].fir+n-p[1][1].sec);
tem[1][0]-=qsum(n-p[1][1].fir+n-p[1][1].sec)+1ll*(n-p[1][1].fir+n-p[1][1].sec)*(c-1);
tem[0][1]-=qsum(n-p[1][1].fir+n-p[1][1].sec)+1ll*(n-p[1][1].fir+n-p[1][1].sec)*(c-1);
tem[0][0]-=qsum(n-p[1][1].fir+n-p[1][1].sec)+1ll*(n-p[1][1].fir+n-p[1][1].sec)*2*(c-1);
tem[0][0]-=qsum(p[0][1].fir-x+c-1)+1ll*(p[0][1].fir-x+c-1)*(x-p[0][0].fir);
tem[1][1]-=qsum(p[0][1].fir-x+c-2);
tem[1][0]-=1ll*(p[0][1].fir-x+c-1)*(x-p[0][0].fir);
if (tem[0][0]<0 || tem[1][1]<0) return 0;
ll sum1=qsum(c-2)+qsum(p[0][1].fir-x), sum2=qsum(c-1)+2ll*(c-1)*(p[0][1].fir-x)+qsum(p[0][1].fir-x-1);
// for (int i=0; i<=(c-1)*(c-1); ++i) if (tem[1][0]-sum1-2*i>=0 && tem[0][1]-sum2+2*i>=0) return 1;
// return 0;
ll k=min((tem[1][0]-sum1)/2, 1ll*(c-1)*(c-1));
return k>=0 && tem[1][0]-sum1-2*k>=0 && tem[0][1]-sum2+2*k>=0;
}
else if (x<=p[1][1].fir&&y<=p[1][1].sec) {
// cout<<"case 3"<<endl;
tem[1][1]-=qsum(n-p[1][1].fir+n-p[1][1].sec);
tem[1][0]-=qsum(n-p[1][1].fir+n-p[1][1].sec)+1ll*(n-p[1][1].fir+n-p[1][1].sec)*(c-1);
tem[0][1]-=qsum(n-p[1][1].fir+n-p[1][1].sec)+1ll*(n-p[1][1].fir+n-p[1][1].sec)*(c-1);
tem[0][0]-=qsum(n-p[1][1].fir+n-p[1][1].sec)+1ll*(n-p[1][1].fir+n-p[1][1].sec)*2*(c-1);
tem[0][0]-=qsum(p[1][1].fir-x+p[1][1].sec-y)+1ll*(p[1][1].fir-x+p[1][1].sec-y)*(x-p[0][0].fir+y-p[0][0].sec);
tem[1][1]-=qsum(p[1][1].fir-x+p[1][1].sec-y-1);
tem[1][0]-=1ll*(p[1][1].fir-x+p[1][1].sec-y)*(x-p[1][0].fir);
if (tem[0][0]<0 || tem[1][1]<0) return 0;
ll sum1=qsum(p[1][1].sec-y-1)+qsum(p[1][1].fir-x), sum2=qsum(p[1][1].sec-y)+2ll*(p[1][1].fir-x)*(p[1][1].sec-y)+qsum(p[1][1].fir-x-1);
// for (int i=0; i<=(c-1)*(c-1); ++i) if (tem[1][0]-sum1-2*i>=0 && tem[0][1]-sum2+2*i>=0) return 1;
// return 0;
ll k=min((tem[1][0]-sum1)/2, 1ll*(c-1)*(c-1));
return k>=0 && tem[1][0]-sum1-2*k>=0 && tem[0][1]-sum2+2*k>=0;
}
else {
// cout<<"case 4"<<endl;
assert(x>=p[1][1].fir);
for (int i=0; i<2; ++i) for (int j=0; j<2; ++j) {
if (p[i][j].sec>=y) tem[i][j]-=qsum(p[i][j].sec-y-1)+1ll*(p[i][j].sec-y)*(x-p[i][j].fir);
tem[i][j]-=qsum(n-x+n-max(y, p[i][j].sec))+1ll*(n-x+n-max(y, p[i][j].sec))*(x-p[i][j].fir);
}
for (int i=0; i<2; ++i) for (int j=0; j<2; ++j) if (tem[i][j]<0) return 0;
return 1;
}
}
void move(int x, int y) {
for (int i=0; i<2; ++i)
for (int j=0; j<2; ++j)
rest[i][j]-=abs(p[i][j].fir-x)+abs(p[i][j].sec-y);
}
void solve() {
int x=1, y=1;
p[0][0]={a, b}; p[0][1]={a+c-1, b};
p[1][0]={a, b+c-1}; p[1][1]={a+c-1, b+c-1};
for (int i=0; i<2; ++i) for (int j=0; j<2; ++j) rest[i][j]=t;
if (!able(x, y)) {puts("Again"); return ;}
for (int i=1; i<=2*(n-1); ++i) {
// if (i>3) exit(0);
// cout<<"sta: "; for (int j=1; j<=top; ++j) cout<<sta[j]<<' '; cout<<endl;
if (x<n && able(x+1, y)) sta[++top]='R', move(++x, y);
else if (y<n && able(x, y+1)) sta[++top]='U', move(x, ++y);
else {puts("Again"); return ;}
}
for (int i=1; i<=top; ++i) cout<<sta[i]; cout<<endl;
// if (able(2, 1)) puts("return 1");
}
}
signed main()
{
freopen("elis.in", "r", stdin);
freopen("elis.out", "w", stdout);
n=read(); t=read(); a=read(); b=read(); c=read();
// if (c==1) task1::solve();
// force::solve();
task::solve();
return 0;
}