题解 伊莉斯

传送门

首先可以确定是按位确定
考虑怎么 check 一个位置到 \((n, n)\) 的最小代价
发现只有角上的四个魔眼是有用的
然后分类讨论这个点在什么地方
image
image
然后大力写就可以了

点击查看代码
#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;
}
posted @ 2022-06-30 10:30  Administrator-09  阅读(4)  评论(0编辑  收藏  举报