密室逃脱
直接模拟
#include <bits/stdc++.h>
using namespace std;
char s[2000];
int main() {
int t;
scanf("%d", &t);
while (t--) {
int n, k;
scanf("%d %d", &n, &k);
scanf("%s", s);
for (int i = 0; i < n; i++) {
printf("%c", (s[i] + k - 'A') % 26 + 'A');
}
printf("\n");
}
}
题目序号配给
拓扑排序+字典序最小
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
struct Edge {
int to;
int next;
} edge[maxn];
int in[maxn], head[maxn], ans[maxn], tot;
int n, m;
vector<int> G;
void add(int u, int v) {
edge[++tot].next = head[u];
edge[tot].to = v;
head[u] = tot;
}
void topsort() {
priority_queue<int, vector<int>, greater<int> > q;
for (int i = 1; i <= n; i++) {
if (in[i] == 0) q.push(i);
}
while (!q.empty()) {
int u = q.top();
q.pop();
G.push_back(u);
for (int i = head[u]; i != 0; i = edge[i].next) {
int v = edge[i].to;
in[v]--;
if (in[v] == 0) q.push(v);
}
}
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i++) {
int t1, t2;
scanf("%d %d", &t1, &t2);
add(t1, t2);
in[t2]++;
}
topsort();
int tmp = 1;
for (int i = 0; i < G.size(); i++) {
ans[G[i]] = tmp++;
}
for (int i = 1; i <= n; i++) {
printf("%d ", ans[i]);
}
}
定海神针
参考:最大子正方形
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1200;
const int INF = 0x3f3f3f3f;
int mp[maxn][maxn];
int dp[maxn][maxn];
inline int read() {
int X = 0, w = 0;
char ch = 0;
while (!isdigit(ch)) {
w |= ch == '-';
ch = getchar();
}
while (isdigit(ch)) {
X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
}
return w ? -X : X;
}
int main() {
int T;
T=read();
while (T--) {
int n;
int maxx = 1;
memset(dp, 0, sizeof(dp));
n=read();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
mp[i][j]=read();
dp[i][j] = 1;
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (mp[i][j] == mp[i - 1][j - 1] && mp[i][j] == mp[i - 1][j] && mp[i][j] == mp[i][j - 1]) {
dp[i][j] = min(dp[i - 1][j], min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;
maxx = max(dp[i][j], maxx);
}
}
}
printf("%d\n", maxx);
}
}