F题没出,J题没出,锅++
题目链接:https://ac.nowcoder.com/acm/contest/883#question
A:
神仙题。
B:
签到题。一眼可以二分长度。

1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson (curpos<<1) 15 #define rson (curpos<<1|1) 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 const int maxn = 1e5 + 10; 21 int n, a[maxn], b[maxn], cnt1 = 0, cnt2 = 0; 22 23 int check(int x) { 24 x*=2; 25 rep1(i, x, n) 26 if (a[i] - a[i - x] == b[i] - b[i - x]) return 1; 27 return 0; 28 } 29 30 int main() { 31 a[0] = b[0] = 0; 32 scanf("%d", &n); 33 rep1(i, 1, n) { 34 int x; scanf("%1d", &x); 35 a[i] = a[i - 1], b[i] = b[i - 1]; 36 if (x) cnt1++, a[i]++; 37 else cnt2++, b[i]++; 38 } 39 int l = 1, r = n / 2; 40 while (l <= r) { 41 int mid = l + r >> 1; 42 if (check(mid)) l = mid + 1; 43 else r = mid - 1; 44 } 45 printf("%d %d ", 2 * r, 2 * min(cnt1, cnt2)); 46 return 0; 47 }
不过队友O(n)前缀和过了。

1 #include<cstdio> 2 #include<cstring> 3 #include<map> 4 #include<algorithm> 5 #include<iostream> 6 #include<cstring> 7 #include<string> 8 using namespace std; 9 map<int, int> M; 10 int main() { 11 int Sum = 0; 12 int n; 13 cin >> n; 14 string s; 15 cin >> s; 16 int n0, n1; 17 n0 = 0; n1 = 0; 18 int ans = 0; 19 M[0] = -1; 20 for (int i = 0; i < n; i++) { 21 if (s[i] == '0') { 22 n0++; 23 Sum--; 24 } else { 25 n1++; 26 Sum++; 27 } 28 if (M.count(Sum)) { 29 M[Sum] = min(M[Sum], i); 30 } else { 31 M[Sum] = i; 32 } 33 ans = max(ans, i - M[Sum]); 34 } 35 cout << ans << " " << min(n0, n1) * 2 << endl; 36 37 return 0; 38 }
C:
题解说是很有趣的构造题。
D:
数论。
E:
kruskal重构树神仙题。
F:
数据结构乱搞题。手写队列ac,优先队列似乎会TLE。

1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson (curpos<<1) 15 #define rson (curpos<<1|1) 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 const int maxn = 5e2 + 10; 21 int n, m, a[maxn][maxn], maxx[maxn], minn[maxn], q[maxn][2]; 22 23 int main() { 24 int t; scanf("%d", &t); 25 while (t--) { 26 int ans = 1; 27 scanf("%d%d", &n, &m); 28 rep1(i, 1, n) { 29 rep1(j, 1, n) scanf("%d", &a[i][j]); 30 } 31 rep1(i, 1, n) { 32 rep1(j, 1, n) maxx[j] = -int_inf, minn[j] = int_inf; 33 rep1(j, i, n) { 34 // 维护第p列的极值 35 rep1(p, 1, n) maxx[p] = max(maxx[p], a[j][p]); 36 rep1(p, 1, n) minn[p] = min(minn[p], a[j][p]); 37 int l = 1, h0 = 0, h1 = 0, t0 = 1, t1 = 1; 38 rep1(r, 1, n) { 39 while (t0 <= h0 && maxx[r] >= maxx[q[h0][0]]) h0--; 40 while (t1 <= h1 && minn[r] <= minn[q[h1][1]]) h1--; 41 q[++h0][0] = q[++h1][1] = r; 42 while (l <= r && maxx[q[t0][0]] - minn[q[t1][1]] > m) { 43 l++; 44 if (q[t0][0] < l) t0++; 45 if (q[t1][1] < l) t1++; 46 } 47 ans = max(ans, (r - l + 1) * (j - i + 1)); 48 } 49 } 50 } 51 printf("%d ", ans); 52 } 53 return 0; 54 }
G:
分治题。
H:
选一个超远的点,然后二分斜率求叉积判断即可。

1 #include<cstdio> 2 #include<cstdlib> 3 #include<cmath> 4 #include<queue> 5 #include<iostream> 6 #include<map> 7 using namespace std; 8 9 10 typedef long long ll; 11 const int maxn = 2e6 + 10; 12 struct Point { 13 ll x, y; 14 } A[maxn]; 15 16 ll Cal(Point a, Point b) { 17 return a.x * b.y - a.y * b.x; 18 } 19 int n; 20 Point ans1; 21 Point ans2; 22 23 ll check(ll x) { 24 ll num1 = 0; ll num2 = 0; 25 bool flag = false; 26 Point now; 27 now.x = x; 28 now.y = ans2.y; 29 Point Or = now; 30 Or.x -= ans1.x; 31 Or.y -= ans1.y; 32 for (int i = 1; i <= n; i++) { 33 Point phi = A[i]; 34 phi.x -= ans1.x; 35 phi.y -= ans1.y; 36 if (Cal(Or, phi) > 0) { 37 num1++; 38 } else if (Cal(Or, phi) < 0) { 39 num2++; 40 } 41 } 42 if (num1 == num2) { 43 return 0; 44 } else if (num1 > num2) { 45 return 1; 46 } else if (num1 < num2) { 47 return -1; 48 } 49 } 50 51 int main() { 52 ios::sync_with_stdio(false); 53 cin.tie(0); 54 int T; 55 cin >> T; 56 ans1.x = -172337ll; 57 ans1.y = -1001ll; 58 ans2.y = 199997ll; 59 while (T--) { 60 cin >> n; 61 for (int i = 1; i <= n; i++) { 62 ll x, y; 63 cin >> x >> y; 64 A[i].x = x; 65 A[i].y = y; 66 } 67 ll l = 0; ll r = 1000000000ll; 68 while (l <= r) { 69 ll m = (l + r ) / 2; 70 if (check(m) == 0) { 71 ans2.x = m; 72 break; 73 } else if (check(m) < 0) { 74 l = m + 1; 75 } else if (check(m) > 0) { 76 r = m - 1; 77 } 78 } 79 cout << ans1.x << " " << ans1.y << " " << ans2.x << " " << ans2.y << endl; 80 } 81 return 0; 82 }
I:
dp。
J:
数据结构大暴力。

1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define sot(a,b) sort(a+1,a+1+b) 8 #define rep1(i,a,b) for(int i=a;i<=b;++i) 9 #define rep0(i,a,b) for(int i=a;i<b;++i) 10 #define eps 1e-8 11 #define int_inf 0x3f3f3f3f 12 #define ll_inf 0x7f7f7f7f7f7f7f7f 13 #define lson (curpos<<1) 14 #define rson (curpos<<1|1) 15 /* namespace */ 16 using namespace std; 17 /* header end */ 18 19 const int maxn = 1e6 + 10; 20 unordered_map<string, int>mp; 21 int q, m; 22 char rs[maxn]; 23 24 struct _List { 25 string s[maxn]; 26 int pre[maxn], nxt[maxn], v[maxn]; 27 int sz, csz, head, tail; 28 29 void init() { 30 sz = 2, csz = 0, head = 1, tail = 2; 31 pre[head] = 0, nxt[head] = 2; 32 pre[tail] = 1, nxt[tail] = 0; 33 } 34 int app(string _s, int _v) { 35 csz++; 36 if (csz == m + 1) del(nxt[head]); 37 s[++sz] = _s, v[sz] = _v; 38 nxt[pre[tail]] = sz; 39 pre[sz] = pre[tail]; 40 nxt[sz] = tail; 41 pre[tail] = sz; 42 return sz; 43 } 44 void del(int pos) { 45 --csz; 46 mp.erase(s[pos]); 47 pre[nxt[pos]] = pre[pos]; 48 nxt[pre[pos]] = nxt[pos]; 49 } 50 } _list; 51 52 int main() { 53 int t; scanf("%d", &t); 54 while (t--) { 55 scanf("%d%d", &q, &m); 56 _list.init(); 57 mp.clear(); 58 rep1(i, 1, q) { 59 int op, v, pos; scanf("%d%s%d", &op, rs, &v); 60 string s(rs); 61 if (!op) { 62 if (mp.find(s) != mp.end()) { 63 pos = mp[s]; 64 v = _list.v[pos]; 65 _list.del(pos); 66 } 67 mp[s] = _list.app(s, v); 68 printf("%d ", v); 69 } else { 70 int flag = 0; 71 if (mp.find(s) != mp.end()) { 72 pos = mp[s]; 73 flag = 1; 74 if (v == -1) { 75 pos = _list.pre[pos]; 76 if (pos == _list.head) flag = 0; 77 } else if (v == 1) { 78 pos = _list.nxt[pos]; 79 if (pos == _list.tail) flag = 0; 80 } 81 } 82 if (flag) printf("%d ", _list.v[pos]); 83 else puts("Invalid"); 84 } 85 } 86 } 87 return 0; 88 }