0%

CF-996-C. The Trail

思路讲解

https://www.luogu.com.cn/article/5c0a5s3i

image

由上可知,只有让每行每列的和都为0才在所有情况下都有解。

所以说这种东西首先要确定在什么情况下是一定有解的,不能上来就做

AC代码

https://codeforces.com/contest/2055/submission/303531727

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <deque>
#include <queue>
#include <vector>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <cmath>
#include <bitset>
#include <iterator>
#include <random>
#include <iomanip>
#include <cctype>
#include <array>
#define FOR(i, a, b) for (int i = a; i <= b; ++i)
#define ROF(i, a, b) for (int i = a; i >= b; --i)

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pll;
typedef array<ll,3> arr;
const ll MAXN=1010;
// 假设我们要凑的数独是0吧

ll N,M,T,maze[MAXN][MAXN];
ll rowMaze[MAXN],colMaze[MAXN];

void solve(){
cin>>N>>M;
string s;
cin>>s;
FOR(i, 1, N){
rowMaze[i]=0;
FOR(j, 1, M){
cin>>maze[i][j];
rowMaze[i]+=maze[i][j];
}
}
//
FOR(i, 1, M){
colMaze[i]=0;
FOR(j, 1, N){
colMaze[i]+=maze[j][i];
}
}
int px=1,py=1;
if(s.back()=='D'){
maze[N][M]=-rowMaze[N];
colMaze[M]+=maze[N][M];
}else{
maze[N][M]=-colMaze[M];
rowMaze[N]+=maze[N][M];
}
FOR(i, 0, s.size()-1){
// 这样子的处理唯一就是要担心最后一个块,因为最后一个块行和列都后继无人了
if(s[i]=='D'){
// 如果他往下走,那么他这行就后继无人了
ll h=-rowMaze[px];
rowMaze[px]=0;
colMaze[py]+=h;
maze[px][py]=h;
}else{
// 如果他往右走,那么他这列就后继无人了
ll h=-colMaze[py];
colMaze[py]=0;
rowMaze[px]+=h;
maze[px][py]=h;
}
if(s[i]=='D'){
px+=1;
}else{
py+=1;
}
}

FOR(i, 1, N){
FOR(j, 1, M){
cout<<maze[i][j]<<' ';
}
cout<<'\n';
}
return;
}

int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>T;
while (T--) {
solve();
}
return 0;
}
/*
1
2 3
RRD
0 0 0
0 1 0

4
3 3
DRRD
0 2 3
0 0 0
3 1 0
4 5
DRRRRDD
0 1 0 2 3
0 0 0 0 0
-1 0 -3 -3 0
0 0 0 -1 0
2 3
RRD
0 0 0
0 1 0
5 5
DDDDRRRR
0 25 2 9 11
0 6 13 20 22
0 17 24 1 8
0 3 10 12 19
0 0 0 0 0

*/

心路历程(WA,TLE,MLE……)