专栏文章

题解:CF1974F Cutting Game

CF1974F题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@miqlifwt
此快照首次捕获于
2025/12/04 06:45
3 个月前
此快照最后确认于
2025/12/04 06:45
3 个月前
查看原文
纯纯搞笑题。
把每一次操作后剩下的矩阵存下来(xx 左右端点,yy 左右端点),然后对每一个棋子计算它的贡献,显然可以二分出它最后出现在哪里,那么这个棋子就算当时删矩阵的那个人,即后面一个
CPP
const int N=2e5+5;
int x[N],y[N];
struct node{
	int lx,rx,ly,ry;
}p[N];
bool check(int id,int num){
	return x[id]<=p[num].rx&&x[id]>=p[num].lx&&y[id]<=p[num].ry&&y[id]>=p[num].ly;
}//是否在剩下的矩阵中
void sol(){
	int a,b,n,m;
	cin>>a>>b>>n>>m;
	for (int i=1;i<=n;i++) cin>>x[i]>>y[i];
	int lx=1,ly=1,rx=a,ry=b;
	for (int i=1;i<=m;i++){
		char c;
		int k;
		cin>>c>>k;
		if (c=='U') lx+=k;
		if (c=='D') rx-=k;
		if (c=='L') ly+=k;
		if (c=='R') ry-=k;
		p[i]={lx,rx,ly,ry};//存下剩下的矩阵
	}
	int ans1=0,ans2=0;
	for (int i=1;i<=n;i++){
		int L=1,R=m,Ans=-1;
		while (L<=R){
			int mid=(L+R)>>1;
			if (check(i,mid)) Ans=mid+1,/*一定要在这里 +1!!!*/L=mid+1;
			else R=mid-1;
		}
		if (Ans!=m+1){
			if (Ans&1) ans1++;
			else ans2++;
		}
	}
	cout<<ans1<<' '<<ans2<<endl;
}
二分时注意 AnsAns+1+1,原因上面已经解释了。

评论

1 条评论,欢迎与作者交流。

正在加载评论...