B. Crazy Binary String
solved at 00:16
签到
D. Big Integer
upsolved 队友做的
F. Planting Trees
upsolved
\(O(n^3)\)单调队列,我是傻逼
#include <bits/stdc++.h> using namespace std; const int N = 505; int d[N][N], n, m, T, ans, mx[N], mn[N]; int minn[N], maxx[N]; int h_mn, t_mn, h_mx, t_mx; int main() { scanf("%d", &T); while(T--) { ans = 0; scanf("%d%d", &n, &m); for(int i = 1; i <= n; ++i) { for(int j = 1; j <= n; ++j) scanf("%d", &d[i][j]); } for(int up = 1; up <= n; ++up) { memset(mx, 0, sizeof(mx)); memset(mn, 0x3f, sizeof(mn)); for(int down = up; down <= n; ++down) { h_mn = t_mn = h_mx = t_mx = 0; for(int k = 1, left = 0; k <= n; ++k) { mx[k] = max(mx[k], d[down][k]); mn[k] = min(mn[k], d[down][k]); for(; h_mn != t_mn && mn[minn[t_mn - 1]] > mn[k]; ) t_mn--; minn[t_mn++] = k; for(; h_mx != t_mx && mx[maxx[t_mx - 1]] < mx[k]; ) t_mx--; maxx[t_mx++] = k; for(; h_mn != t_mn && h_mx != t_mx && mx[maxx[h_mx]] - mn[minn[h_mn]] > m;) { if(maxx[h_mx] < minn[h_mn]) left = maxx[h_mx++]; else left = minn[h_mn++]; } ans = max(ans, (down - up + 1) * (k - left)); } } } printf("%d\n", ans); } return 0; }
H. Magic Line
solved at 00:36
要求用一条直线把平面上的点分成两部分,两部分个数相同且不能有点在线上
注意到点的坐标范围只有\(1000\)而你最终输出的线的坐标可以到\(1e9\)
一定可以用一条近似竖直线的先把点分开
J. LRU management
solved at 04:59(+22)
队友做的,明天就补
还有个G要补掉其他随缘吧。。。