树状数组维护差分,求调(玄关%%%
查看原帖
树状数组维护差分,求调(玄关%%%
732565
_HCNX_楼主2024/9/23 11:00

subtask3错4个,subtask5错1个,求调%%%

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e6+10;
int n,m,q,k,vis[50][N],x=1,y=1;
char mp[510][510];
int lowbit(int p){
	return p&(-p);
}
void add(int num,int p,int z){
	while(p<=q){
		vis[num][p]+=z;
		p+=lowbit(p);
	}
	return;
}
int query(int num,int p){
	int res=0;
	while(p>0){
		res+=vis[num][p];
		p-=lowbit(p);
	}
	return res;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin>>n>>m>>q>>k;
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			cin>>mp[i][j];
		}
	}
	char c; int a,b,t;
	for(int i=1;i<=q;++i){
		cin>>c>>a>>b;
		t=query(i%k,i/k+1);
		if(c=='U'){
			if(t%2==1) x=min(n,x+a);
			else x=max(1,x-a);
		}
		else if(c=='D'){
			if(t%2==1) x=max(1,x-a);
			else x=min(n,x+a);
		}
		else if(c=='R'){
			if(t%2==1) y=max(1,y-a);
			else y=min(m,y+a);
		}
		else if(c=='L'){
			if(t%2==1) y=min(m,y+a);
			else y=max(1,y-a);
		}
		if(mp[x][y]=='X'){
			add(i%k,i/k+2,1);
			add(i%k,i/k+b+2,-1);
		}
	}
	cout<<x<<" "<<y<<endl;
	return 0;
}
2024/9/23 11:00
加载中...