Advertisement
simonmadson

B

Feb 24th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.55 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5.  
  6. vector<int> solve(vector<int> &arr, int n, int k) {
  7.     vector<int> dp(n + 1);
  8.     for (int i = 1; i <= n; ++i) {
  9.         int left = max(1, i - k), right = min(n, i + k);
  10.         int pright = arr[i] ? min(n, arr[i] + k) + 1 : 0;
  11.         if (pright > left) left = pright;
  12.         dp[i] = dp[arr[i]] + right - left + 1;
  13.     }
  14.     return dp;
  15. }
  16.  
  17. vector<int> stupid_solve(vector<int> arr, int n, int k) {
  18.     vector<bool> used(n+1);
  19.     vector<int> ans(n+1);
  20.     for (int i = 1; i <= n; ++i) {
  21.         int v = i;
  22.         used.assign(n+1, 0);
  23.         while (1) {
  24.             if (v == 0) break;
  25.             for (int j = max(1, v-k); j <= min(n, v+k); ++j){
  26.                 used[j] = 1;
  27.             }
  28.             v = arr[v];
  29.         }
  30.         for (int j = 1; j <= n; ++j) {
  31.             ans[i] += used[j];
  32.         }
  33.     }
  34.     return ans;
  35. }
  36.  
  37. void stress(int n, int k) {
  38.     vector<int> v(n+1);
  39.     for (int i = 1; i <= n; ++i) {
  40.         v[i] = rand() % i;
  41.     }
  42.     vector<int> v1 = stupid_solve(v, n, k),
  43.                 v2 = solve(v, n, k);
  44.     for (int i = 1; i <= n; ++i) {
  45.         if (v1[i] != v2[i]) {
  46.             printf("ALERTALERT: n=%d, k=%d, the array is: ", n, k);
  47.             for (int i = 1; i <= n; ++i) {
  48.                 printf("%d ", v[i]);
  49.             }
  50.         }
  51.     }
  52. }
  53.  
  54. int main() {
  55.     srand(time(NULL));
  56.     for (int i = 0; i < 10000; ++i) {
  57.         int n = rand() % 100 + 1;
  58.         int k = rand() % (n+1);
  59.         stress(n, k);
  60.     }
  61.     return 0;
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement