求调,我寻思这不是 O(nlogn) 的做法吗,咋会 TLE 呢
思路是:用堆去记录修改的范围,到达边界后,再异或回来
#include<bits/stdc++.h>
using namespace std;
const int N = 507;
const int M = 2e5 + 17;
int n, m, q, k;
char c[N][N], opt[M];
int a[M], b[M];
template <typename T> inline void read(T &x) {
char c = getchar(); x = 0; int f = 0;
for(; !isdigit(c); c = getchar()) f |= (c == '-');
for(; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + (c ^ 48);
x = f ? -x : x;
}
priority_queue <pair<int, int> > que;
int tx, ty, ys[21];
void oper(int id, char cc, int d) {
if(ys[id%k] == 1) {
if(cc == 'U') cc = 'D';
else if(cc == 'D') cc = 'U';
else if(cc == 'L') cc = 'R';
else if(cc == 'R') cc = 'L';
}
if(cc == 'U') tx = max(tx-d, 1);
else if(cc == 'D') tx = min(tx+d, n);
else if(cc == 'L') ty = max(ty-d, 1);
else if(cc == 'R') ty = min(ty+d, m);
}
int main() {
scanf("%d%d%d%d", &n, &m, &q, &k);
for(int i = 1; i <= n; ++ i) scanf("%s", (c[i] + 1));
for(int i = 1; i <= q; ++ i) {
scanf("%s", &opt[i]);
read(a[i]);
read(b[i]);
}
tx = 1, ty = 1;
for(int i = 1; i <= q; ++ i) {
if(que.size())
while(i > -que.top().first) {
ys[que.top().second] ^= 1;
que.pop();
}
oper(i, opt[i], a[i]);
if(c[tx][ty] == 'X') {
ys[i%k] ^= 1;
que.push(make_pair( -(i + b[i] * k), i%k ));
}
}
printf("%d %d\n", tx, ty);
return 0;
}
/*
3 3 4 1
..X
.XX
XXX
D 1 2
R 1 2
D 2 0
L 1 0
: 1 3
10 10 8 2
XX.XX.X...
XXX..XXX.X
XXX.X.XXXX
XXXXXXX.X.
.XX...XX.X
.XXX.X.X.X
...XXX.XXX
XX...XX...
X..XX....X
XXXXX...XX
U 2 1
L 1 3
R 3 1
L 1 2
D 2 1
R 5 1
L 4 0
D 3 0
: 1 10
*/