[题解]CF1733E Conveyor

CF1733E Conveyor

我们发现若 \((t,x,y)\) 存在史莱姆,则它一定是第 \(t-(x+y)+1\) 只史莱姆。

处理这只史莱姆在第 \(t\) 秒的位置不是很容易。但是我们可以考虑作差。

\(f_1[i][j]\) 为前 \(t-(x+y)+1\) 只史莱姆在 \(t\) 秒内经过 \((i,j)\) 的数量。

\(f_2[i][j]\) 为前 \(t-(x+y)\) 只史莱姆在 \(t\) 秒内经过 \((i,j)\) 的数量。

\(f_1[x][y]-f_2[x][y]=0/1\) 就是第 \(t-(x+y)+1\) 只史莱姆在第 \(t\) 秒到达 \((x,y)\) 的情况。

如何递推 \(f\),有一个很重要的观察:对于每一个格子,第奇数次经过它的史莱姆会向右走,第偶数次经过它的史莱姆会向下走。

所以如果有 \(x\) 只史莱姆经过,会有 \(\left\lceil\dfrac{x}{2}\right\rceil\) 只向右,\(\left\lfloor\dfrac{x}{2}\right\rfloor\) 只向下。

时间复杂度 \(O(qn^2)\)

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=120;
int q,x,y,t,f1[N][N],f2[N][N];
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>q;
	while(q--){
		cin>>t>>x>>y;
		memset(f1,0,sizeof f1),memset(f2,0,sizeof f2);
		f1[0][0]=t-x-y+1,f2[0][0]=t-x-y;
		for(int i=0;i<=x;i++){
			for(int j=0;j<=y;j++){
				if(i) f1[i][j]+=f1[i-1][j]/2,f2[i][j]+=f2[i-1][j]/2;
				if(j) f1[i][j]+=(f1[i][j-1]+1)/2,f2[i][j]+=(f2[i][j-1]+1)/2;
			}
		}
		if(f1[x][y]^f2[x][y]) cout<<"YES\n";
		else cout<<"NO\n";
	}
	return 0;
}
posted @ 2025-10-29 13:37  Sinktank  阅读(9)  评论(0)    收藏  举报
★CLICK FOR MORE INFO★ TOP-BOTTOM-THEME
Enable/Disable Transition
Copyright © 2023 ~ 2025 Sinktank - 1328312655@qq.com
Illustration from 稲葉曇『リレイアウター/Relayouter/中继输出者』,by ぬくぬくにぎりめし.