2019牛客多校第三场

匿名 (未验证) 提交于 2019-12-02 23:52:01

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要补掉其他随缘吧。。。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!