心灵感应
应【数据删除】要求,这次没有题目链接,也没有题目大意。
本质是别样的剪枝大赛。复杂度不会证,依旧 \(O(能过)\)。
发现实际上只用记录四个角的焦躁值就够了,因为在 \(x,y\) 取到极值的时候焦躁值最大。
\(O(nm)\) 很小,尝试写点近似于 \(O(1)\) 的判断。
回想一下搜索的知识,可以对四个角分开考虑,一个不行肯定不行。想一个估价函数,如果前面已经产生的焦躁值加上后续会产生的最小的焦躁值都比上界大,肯定不行。
然后就是实现的问题了。分讨一下,可以解决。
Code
注意:肯定是能剪的更快的,但是我只会这种最唐的。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define fi first
#define se second
#define IOS ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)
#define File(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout)
const int N = 2e6 + 10;
int n,m;
LL T;
LL xl,yl,xr,yr;
char res[N];
void print(){
for(int i=1;i<=2*n-2;i++)
cout << res[i];
cout << "\n";
return ;
}
bool chk(LL x,LL xx,LL y,LL yy){
if(max(x,xx) + max(y,yy) > T) return 1;
return 0;
}
LL calc(LL l,LL r){
return (r - l + 1) * (l + r) / 2;
}
LL DIS(LL x,LL y,LL xx,LL yy){
if(x <= xx){
if(y <= yy) return calc(0,abs(x-xx) + abs(y-yy)) + calc(0,n*2-xx-yy);
else return calc(abs(xx-xx)+abs(y-yy),abs(x-xx)+abs(y-yy)) + calc(abs(xx-xx)+abs(y-yy)+1,n*2-xx-yy);
}
else{
if(y <= yy) return calc(abs(x-xx)+abs(yy-yy),abs(x-xx)+abs(y-yy)) + calc(abs(x-xx)+abs(yy-yy)+1,n*2-xx-yy);
else return calc(abs(x-xx)+abs(y-yy),n*2 - x - y);
}
}
void dfs(int x,int y,LL sxl,LL sxr,LL syl,LL syr){
if(m <= 0) return ;
if(x > n || y > n) return ;
if(x + y != 2){
if(sxl + syl + DIS(x,y,xl,yl) > T) return ;
if(sxl + syr + DIS(x,y,xl,yr) > T) return ;
if(sxr + syl + DIS(x,y,xr,yl) > T) return ;
if(sxr + syr + DIS(x,y,xr,yr) > T) return ;
sxl += abs(xl - x);
sxr += abs(xr - x);
syl += abs(yl - y);
syr += abs(yr - y);
}
if(chk(sxl,sxr,syl,syr)) return ;
if(x == n && y == n){
print();
m -- ;
return ;
}
res[x+y-1] = 'R';
dfs(x+1,y,sxl,sxr,syl,syr);
res[x+y-1] = 'U';
dfs(x,y+1,sxl,sxr,syl,syr);
}
int main()
{
IOS;
File("sense");
cin >> n >> m >> T;
cin >> xl >> yl >> xr >> yr;
dfs(1,1,0,0,0,0);
return 0;
}

浙公网安备 33010602011771号