传送门

A. XORinacci

签到。

Code
  1. /*
  2. * Author: heyuhhh
  3. * Created Time: 2020/2/26 9:26:33
  4. */
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <cstring>
  8. #include <vector>
  9. #include <cmath>
  10. #include <set>
  11. #include <map>
  12. #include <queue>
  13. #include <iomanip>
  14. #define MP make_pair
  15. #define fi first
  16. #define se second
  17. #define sz(x) (int)(x).size()
  18. #define all(x) (x).begin(), (x).end()
  19. #define INF 0x3f3f3f3f
  20. #define Local
  21. #ifdef Local
  22. #define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
  23. void err() { std::cout << '\n'; }
  24. template<typename T, typename...Args>
  25. void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
  26. #else
  27. #define dbg(...)
  28. #endif
  29. void pt() {std::cout << '\n'; }
  30. template<typename T, typename...Args>
  31. void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
  32. using namespace std;
  33. typedef long long ll;
  34. typedef pair<int, int> pii;
  35. //head
  36. const int N = 1e5 + 5;
  37. int f[3];
  38. int a, b, n;
  39. void run(){
  40. cin >> a >> b >> n;
  41. f[0] = a, f[1] = b;
  42. f[2] = a ^ b;
  43. n %= 3;
  44. cout << f[n] << '\n';
  45. }
  46. int main() {
  47. ios::sync_with_stdio(false);
  48. cin.tie(0); cout.tie(0);
  49. cout << fixed << setprecision(20);
  50. int T; cin >> T;
  51. while(T--) run();
  52. return 0;
  53. }

B. Uniqueness

题意:

给出\(n,n\leq 2000\)个数,现在可以至多删除一段区间\([l,r]\)。最后要使得剩下的数互不相同。问最终删除区间的最小长度为多少。

思路:

枚举左、右端点,用一个\(set\)来维护剩下的元素即可。

时间复杂度\(O(n^2logn)\)。

Code
  1. /*
  2. * Author: heyuhhh
  3. * Created Time: 2020/2/26 9:34:06
  4. */
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <cstring>
  8. #include <vector>
  9. #include <cmath>
  10. #include <set>
  11. #include <map>
  12. #include <queue>
  13. #include <iomanip>
  14. #define MP make_pair
  15. #define fi first
  16. #define se second
  17. #define sz(x) (int)(x).size()
  18. #define all(x) (x).begin(), (x).end()
  19. #define INF 0x3f3f3f3f
  20. #define Local
  21. #ifdef Local
  22. #define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
  23. void err() { std::cout << '\n'; }
  24. template<typename T, typename...Args>
  25. void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
  26. #else
  27. #define dbg(...)
  28. #endif
  29. void pt() {std::cout << '\n'; }
  30. template<typename T, typename...Args>
  31. void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
  32. using namespace std;
  33. typedef long long ll;
  34. typedef pair<int, int> pii;
  35. //head
  36. const int N = 2000 + 5;
  37. int n;
  38. int a[N];
  39. void run(){
  40. cin >> n;
  41. for(int i = 1; i <= n; i++) cin >> a[i];
  42. set <int> s;
  43. int ans = n;
  44. for(int l = 0; l <= n; l++) {
  45. if(s.count(a[l])) break;
  46. s.insert(a[l]);
  47. ans = min(ans, n - l);
  48. set <int> t;
  49. for(int r = n; r > l; r--) {
  50. if(s.count(a[r]) || t.count(a[r])) break;
  51. t.insert(a[r]);
  52. ans = min(ans, r - l - 1);
  53. }
  54. }
  55. cout << ans << '\n';
  56. }
  57. int main() {
  58. ios::sync_with_stdio(false);
  59. cin.tie(0); cout.tie(0);
  60. cout << fixed << setprecision(20);
  61. run();
  62. return 0;
  63. }

C. Magic Grid

题意:

现在要构造一个\(n\cdot n\)的矩阵,矩阵里面的数互不相同,取值为\([0,n^2-1]\),并且使得矩阵中行、列异或值都相同。

思路:

归纳一下,直接将整个矩阵按\(k\)分块,分成多个\(4\cdot 4\)的小矩阵构造就行。

正确性因为所有的数都加上\(2^x\)过后,最后的异或值不会发生变化。

代码如下:

Code
  1. /*
  2. * Author: heyuhhh
  3. * Created Time: 2020/2/26 11:02:11
  4. */
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <cstring>
  8. #include <vector>
  9. #include <cmath>
  10. #include <set>
  11. #include <map>
  12. #include <queue>
  13. #include <iomanip>
  14. #define MP make_pair
  15. #define fi first
  16. #define se second
  17. #define sz(x) (int)(x).size()
  18. #define all(x) (x).begin(), (x).end()
  19. #define INF 0x3f3f3f3f
  20. #define Local
  21. #ifdef Local
  22. #define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
  23. void err() { std::cout << '\n'; }
  24. template<typename T, typename...Args>
  25. void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
  26. #else
  27. #define dbg(...)
  28. #endif
  29. void pt() {std::cout << '\n'; }
  30. template<typename T, typename...Args>
  31. void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
  32. using namespace std;
  33. typedef long long ll;
  34. typedef pair<int, int> pii;
  35. //head
  36. const int N = 1000 + 5;
  37. int n;
  38. int a[N][N];
  39. void run() {
  40. int k = n / 4;
  41. int now = 0;
  42. for(int i = 1; i <= k; i++) {
  43. for(int j = 1; j <= k; j++) {
  44. for(int x = (i - 1) * 4 + 1; x <= i * 4; x++) {
  45. for(int y = (j - 1) * 4 + 1; y <= j * 4; y++) {
  46. a[x][y] = now++;
  47. }
  48. }
  49. }
  50. }
  51. for(int i = 1; i <= n; i++) {
  52. for(int j = 1; j <= n; j++) {
  53. cout << a[i][j] << " \n"[j == n];
  54. }
  55. }
  56. }
  57. int main() {
  58. ios::sync_with_stdio(false);
  59. cin.tie(0); cout.tie(0);
  60. cout << fixed << setprecision(20);
  61. while(cin >> n) run();
  62. return 0;
  63. }

D. Restore Permutation

直接从后往前构造即可,利用树状数组+二分查询来确定一个位置的值,时间复杂度\(O(nlog^2n)\)。

代码如下:

Code
  1. /*
  2. * Author: heyuhhh
  3. * Created Time: 2020/2/26 16:34:24
  4. */
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <cstring>
  8. #include <vector>
  9. #include <cmath>
  10. #include <set>
  11. #include <map>
  12. #include <queue>
  13. #include <iomanip>
  14. #define MP make_pair
  15. #define fi first
  16. #define se second
  17. #define sz(x) (int)(x).size()
  18. #define all(x) (x).begin(), (x).end()
  19. #define INF 0x3f3f3f3f
  20. #define Local
  21. #ifdef Local
  22. #define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
  23. void err() { std::cout << '\n'; }
  24. template<typename T, typename...Args>
  25. void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
  26. #else
  27. #define dbg(...)
  28. #endif
  29. void pt() {std::cout << '\n'; }
  30. template<typename T, typename...Args>
  31. void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
  32. using namespace std;
  33. typedef long long ll;
  34. typedef pair<int, int> pii;
  35. //head
  36. const int N = 2e5 + 5;
  37. int n;
  38. int a[N];
  39. ll s[N];
  40. struct BIT {
  41. ll c[N];
  42. int lowbit(int x) {return x & (-x);}
  43. void add(int x, int v) {
  44. for(; x < N; x += lowbit(x)) c[x] += v;
  45. }
  46. ll query(int x) {
  47. ll res = 0;
  48. for(; x; x -= lowbit(x)) res += c[x];
  49. return res;
  50. }
  51. }bit;
  52. void run(){
  53. cin >> n;
  54. for(int i = 1; i <= n; i++) cin >> s[i];
  55. for(int i = 1; i <= n; i++) bit.add(i, i);
  56. for(int i = n; i >= 1; i--) {
  57. int l = 1, r = n + 1, mid;
  58. while(l < r) {
  59. mid = (l + r) >> 1;
  60. if(bit.query(mid) > s[i]) r = mid;
  61. else l = mid + 1;
  62. }
  63. a[i] = l;
  64. bit.add(a[i], -a[i]);
  65. }
  66. for(int i = 1; i <= n; i++) cout << a[i] << " \n"[i == n];
  67. }
  68. int main() {
  69. ios::sync_with_stdio(false);
  70. cin.tie(0); cout.tie(0);
  71. cout << fixed << setprecision(20);
  72. run();
  73. return 0;
  74. }

E. Let Them Slide

题意:

有一个\(n\cdot w,n,w\leq 10^6\)的表,现在有\(n\)个数组,每个数组中元素的取值范围为\([-10^9,10^9]\),所有数组的长度之和不超过\(10^6\)。

每一个数组可以在表内左右移动。

问最后对于每一列,其和的最大值为多少。

思路:

  • 对每一个数组单独考虑其贡献:容易发现一个数组对列的贡献为\(1,2,\cdots,max,\cdots,max,max-1,\cdots,2,1\)的形式。
  • 形象点来说,一个数组的贡献一开始为一个从\(1\)开始,有着最大宽度的滑动窗口;最后窗口宽度会回到\(1\)。中间有一段对列的贡献始终相同。
  • 那么我们中间的那一段可以直接利用差分来处理,而前面部分和后面部分我们直接暴力计算贡献就行。用\(set\)的话好写一点,时间复杂度为\(O(len\cdot log_{len})\)。
  • 注意一点细节:因为可能窗口中的最大值为负数,在某些位置,我们可以让这一列为空,那么最后的取值就是\(0\)了。对于这一点的处理可以找一下关系:设当前数组的长度为\(k\),那么\(r=w-k\),\([1,r],[w-k+1,w]\)这段可以取\(0\);我们最后窗口的上界为\(min(k,w-k+1)\)。
    • 显然当\(2k\leq w\)时,所有位置均可取\(0\);
    • 当\(2k>w\)即上界\(max=k\)时,此时\(r<k\),那么\([1,r]、[w-k+1,w]\)这两段区间我们暴力计算的时候可以直接计算。

最终总的时间复杂度为\(O(nlogn)\),这里的\(n\)为数组总长度。

细节见代码:

Code
  1. /*
  2. * Author: heyuhhh
  3. * Created Time: 2020/2/26 17:04:19
  4. */
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <cstring>
  8. #include <vector>
  9. #include <cmath>
  10. #include <set>
  11. #include <map>
  12. #include <queue>
  13. #include <iomanip>
  14. #include <assert.h>
  15. #define MP make_pair
  16. #define fi first
  17. #define se second
  18. #define sz(x) (int)(x).size()
  19. #define all(x) (x).begin(), (x).end()
  20. #define INF 0x3f3f3f3f
  21. #define Local
  22. #ifdef Local
  23. #define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
  24. void err() { std::cout << '\n'; }
  25. template<typename T, typename...Args>
  26. void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
  27. #else
  28. #define dbg(...)
  29. #endif
  30. void pt() {std::cout << '\n'; }
  31. template<typename T, typename...Args>
  32. void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
  33. using namespace std;
  34. typedef long long ll;
  35. typedef pair<int, int> pii;
  36. //head
  37. const int N = 1e6 + 5;
  38. int n, w;
  39. int a[N];
  40. ll ans[N], sum[N];
  41. void run(){
  42. cin >> n >> w;
  43. multiset <int> S;
  44. for(int i = 1; i <= n; i++) {
  45. int k; cin >> k;
  46. for(int j = 1; j <= k; j++) cin >> a[j];
  47. S.clear();
  48. int Max = min(k, w - k + 1), r = w - k;
  49. if(2 * k <= w) {
  50. for(int j = 1; j <= k; j++) if(a[j] < 0) a[j] = 0;
  51. }
  52. for(int j = 1; j <= w; j++) {
  53. if(j <= Max) {
  54. S.insert(a[j]);
  55. } else if(j <= min(k, w - Max + 1)) {
  56. S.insert(a[j]);
  57. auto it = S.lower_bound(a[j - Max]);
  58. assert(it != S.end());
  59. S.erase(it);
  60. } else if(j > w - Max + 1) {
  61. auto it = S.lower_bound(a[k - Max + j - (w - Max + 1)]);
  62. assert(it != S.end());
  63. S.erase(it);
  64. } else {
  65. int st = j;
  66. int ed = w - Max + 1 + 1;
  67. auto it = S.end(); it--;
  68. int now = *it;
  69. sum[st] += now, sum[ed] -= now;
  70. j = w - Max + 1;
  71. continue;
  72. }
  73. auto it = S.end(); it--;
  74. int now = *it;
  75. if(j <= r || j >= w - r + 1) now = max(0, now);
  76. ans[j] += now;
  77. }
  78. assert(S.size() == 1);
  79. }
  80. for(int i = 1; i <= w; i++) {
  81. sum[i] += sum[i - 1];
  82. ans[i] += sum[i];
  83. }
  84. for(int i = 1; i <= w; i++) {
  85. cout << ans[i] << " \n"[i == w];
  86. }
  87. }
  88. int main() {
  89. ios::sync_with_stdio(false);
  90. cin.tie(0); cout.tie(0);
  91. cout << fixed << setprecision(20);
  92. run();
  93. return 0;
  94. }

F. Bits And Pieces

题意:

给出序列\(a_{1,2\cdots,n},n\leq 10^6\)。

现在要找最大的\(a_i|(a_j\& a_k)\),其中\((i,j,k)\)满足\(i<j<k\)。

思路:

  • 显然我们可以枚举\(a_i\),那么问题就转换为如何快速找\(a_j\& a_k\)。
  • 暴力的方法就是从高到低枚举二进制每一位,然后用各种方法乱搞。
  • 因为最后要使得结果最大,我们二进制从高到底枚举时肯定是贪心来考虑的:即如果有两个数他们的与在这一位为\(1\),那么最后的答案中一定有这一位。
  • 那么我们逐位考虑,并且考虑是否有两个在右边的数他们与的结果为当前答案的超集即可,有的话答案直接加上这一位。
  • 那么可以用\(sos\ dp\)处理超集的信息,并且维护在最右端的两个位置,之后贪心来处理即可。

稍微来说一下这个\(sos\ dp\),我们定义\(dp[i][mask]\)为状态为\(mask\)时,处理了二进制后面\(i\)位的超集信息后,当前最右端的两个位置。那么转移时枚举第\(i+1\)位,若这一位为\(1\),那么\(dp[i][mask]\rightarrow dp[i+1][mask-(1<<(i+1))],dp[i+1][mask]\)进行转移即可。

代码中滚动掉了一维。

细节见代码:

Code
  1. /*
  2. * Author: heyuhhh
  3. * Created Time: 2020/2/27 10:51:39
  4. */
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <cstring>
  8. #include <vector>
  9. #include <cmath>
  10. #include <set>
  11. #include <map>
  12. #include <queue>
  13. #include <iomanip>
  14. #define MP make_pair
  15. #define fi first
  16. #define se second
  17. #define sz(x) (int)(x).size()
  18. #define all(x) (x).begin(), (x).end()
  19. #define INF 0x3f3f3f3f
  20. #define Local
  21. #ifdef Local
  22. #define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
  23. void err() { std::cout << '\n'; }
  24. template<typename T, typename...Args>
  25. void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
  26. #else
  27. #define dbg(...)
  28. #endif
  29. void pt() {std::cout << '\n'; }
  30. template<typename T, typename...Args>
  31. void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
  32. using namespace std;
  33. typedef long long ll;
  34. typedef pair<int, int> pii;
  35. //head
  36. const int N = 2e6 + 5;
  37. int n;
  38. int a[N];
  39. pii dp[N];
  40. void add(int x, int id) {
  41. if(dp[x].fi == -1) {
  42. dp[x].fi = id;
  43. } else if(dp[x].se == -1) {
  44. if(dp[x].fi == id) return;
  45. dp[x].se = id;
  46. if(dp[x].fi < dp[x].se) swap(dp[x].fi, dp[x].se);
  47. } else if(dp[x].fi < id) {
  48. dp[x].se = dp[x].fi;
  49. dp[x].fi = id;
  50. } else if(dp[x].se < id) {
  51. if(dp[x].fi == id) return;
  52. dp[x].se = id;
  53. }
  54. }
  55. void merge(int x1, int x2) {
  56. add(x1, dp[x2].fi);
  57. add(x1, dp[x2].se);
  58. }
  59. void run() {
  60. memset(dp, -1, sizeof(dp));
  61. cin >> n;
  62. for(int i = 1; i <= n; i++) {
  63. cin >> a[i];
  64. add(a[i], i);
  65. }
  66. for(int i = 0; i < 21; i++) {
  67. for(int j = 0; j < N; j++) if(j >> i & 1) {
  68. merge(j ^ (1 << i), j);
  69. }
  70. }
  71. int ans = 0;
  72. for(int i = 1; i <= n - 2; i++) {
  73. int lim = (1 << 21) - 1;
  74. int cur = a[i] ^ lim, res = 0;
  75. for(int j = 20; j >= 0; j--) if(cur >> j & 1) {
  76. if(dp[res ^ (1 << j)].se > i) {
  77. res ^= (1 << j);
  78. }
  79. }
  80. ans = max(ans, res | a[i]);
  81. }
  82. cout << ans << '\n';
  83. }
  84. int main() {
  85. ios::sync_with_stdio(false);
  86. cin.tie(0); cout.tie(0);
  87. cout << fixed << setprecision(20);
  88. run();
  89. return 0;
  90. }

Manthan, Codefest 19(Div. 1 + Div. 2)的更多相关文章

  1. Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)-D. Restore Permutation-构造+树状数组

    Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)-D. Restore Permutation-构造+树状数组 [Pro ...

  2. Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)-C. Magic Grid-构造

    Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)-C. Magic Grid-构造 [Problem Descripti ...

  3. Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)-E. Let Them Slide-思维+数据结构

    Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)-E. Let Them Slide-思维+数据结构 [Problem ...

  4. 云端搭建Linux学习环境 链接https://edu.aliyun.com/article/19 (阿里云ECS服务器 )课堂

    云端搭建Linux学习环境 链接https://edu.aliyun.com/article/19 1. 开通云服务器 2 1.包年包月   按量付费(适合测试数据的时候) 2 2.地域   服务器数 ...

  5. Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)D(树状数组)

    //树状数组中数组的特性,有更巧妙的方法.//我们知道在树状数组中,对于数组tree[i],它所维护的区间为[i−lowbit(i)+1,i]//所以对于tree[2^i],它所维护的区间就为[1,2 ...

  6. RMQ+差分处理(Let Them Slide)Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)

    题意:https://codeforc.es/contest/1208/problem/E 现有n行w列的墙,每行有一排连续方块,一排方块可以左右连续滑动,且每个方块都有一个价值,第i 列的价值定义为 ...

  7. 线段树维护最后一个0的位置(Restore Permutation)Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)

    题意:https://codeforc.es/contest/1208/problem/D 给你长度为n的序列,s[i]的值为p[1]到p[i-1]中比p[i]小的数的和,让你求出p序列. 思路: 首 ...

  8. Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)E(多重集维护)

    #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;long long ans[1000007]; ...

  9. Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)B(SET)

    #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;int a[2007];set<int& ...

随机推荐

  1. P1567

    最大子数组和问题,dp或者分治.. #include <bits/stdc++.h> #define rep(i, a, b) for(int i = a; i <= b; i++) ...

  2. SEO 建站过程复盘

    今天在A5看到一篇关于一个牛站的复盘,整个建站过程值得借鉴. https://www.admin5.com/article/20200218/943930.shtml

  3. CSS-禁止文本被选中

    pc端: .not-select{ -moz-user-select:none; /*火狐*/ -webkit-user-select:none; /*webkit浏览器*/ -ms-user-sel ...

  4. Django - Form嵌套的Meta类 + 为什么type()能创建类

    Form里面嵌套了一个Meta类 class PostForm(forms.ModelForm): class Meta: model = Post # field to be exposed fie ...

  5. windows远程linux的方法(不用xshell)

    先cmd进入DOS,再输入命令ssh root@要远程的linux的ip 输入密码 即可进入linux后台.如下图,即为edr后台,可以见到unabackup服务了. 如果是多次远程不同IP,第二次远 ...

  6. 吴裕雄--天生自然Numpy库学习笔记:NumPy 位运算

    bitwise_and() 函数对数组中整数的二进制形式执行位与运算. import numpy as np print ('13 和 17 的二进制形式:') a,b = 13,17 print ( ...

  7. spring boot+jwt 权限验证

    上周看了一下jwt以前公司的开发都是使用session共享的方法.现在主流的两种方式一种是把登录信息保存在服务器,另一种则是把信息保存在客户端.在使用session 存储的时候会遇到很多的问题,随着项 ...

  8. comsol日常联系

  9. mybatis源码探索笔记-3(使用代理mapper执行方法)

    前言 前面两章我们构建了SqlSessionFactory,并通过SqlSessionFactory创建了我们需要的SqlSession,并通过这个SqlSession获取了我们需要的代理mapper ...

  10. [读书]The Man Who Solved the Market

    出乎个人意料的是,西蒙斯是从FICC类品种起步的,包括量化投资方法获得第一次重大突破也是在FICC品种上. FICC市场的深度不够,所以文艺复兴科技实现规模扩张是股票策略成功之后的事情,很靠后. 虽然 ...