Submission #292550

# Submission time Handle Problem Language Result Execution time Memory
292550 2020-09-07T09:08:23 Z oolimry Seats (IOI18_seats) C++14
100 / 100
2588 ms 149488 KB
#include "seats.h"
#include <bits/stdc++.h>

using namespace std;

const long long inf = 1e9;
typedef pair<long long, int> ii;

///We want to see at each T, whether the numbers from 0 to T form a rectangle. We consider all squares from 0 to T labelled as black
///For some T, consider all 2x2 squares on the grid. A beautiful rectangle is formed if and only if:
///there are exactly 4 2x2 squares with 1 black square, and no 2x2 squares with 3 black squares.

///Let the 4 numbers in the 2x2 square be a, b, c, d where a < b < c < d.
///From T = a to T = b - 1, there is one more 2x2 square with one black square
///From T = c to T = d - 1, there is a 2x2 square with 3 black squares, hence it is impossible

///We can represent this as a segment tree for all T from 0 to HW - 1.
///For all T, the number of 2x2 squares with one black square cannot go below 4, hence it is sufficient to query if the minimum is 4, and if so, and how many 4s are there.
///We can do a range update(+1) from T = a to T = b - 1
///As for T = c to T = d - 1, we can add a very large number to indicate that we are "ruining" the range, as this range is completely impossible.

///Then for every swap, only 8 2x2 squares are affected.
///We can undo the range updates, swap the two values, and redo the range updates.


///we build a grid such that the boundaries are filled with the number n
int n, rows, cols;
static ii pos[1000005]; ///for each number, ii(r, c)
static vector<vector<int> > arr; ///arr[r*cols+c] is the element at (r,c)

///Everything here onwards is segment tree
///This is a range min range add segment tree, but we also store the no. of occurances of the minimum element
static ii tree[2000005]; ///we store the minimum element, and the number of occurances
static long long lazy[2000005]; 

///helper function to update the value of node i from the children of i
inline void relax(int i){
  if(tree[i<<1].first == tree[i<<1|1].first){
    tree[i] = ii(tree[i<<1].first+lazy[i], tree[i<<1].second + tree[i<<1|1].second);
  } 
  else{
    tree[i] = min(tree[i<<1],tree[i<<1|1]);
    tree[i].first += lazy[i];
  }
}

void initSegment(){
  for(int i = n;i < 2 * n;i++) tree[i] = ii(0,1);
  for(int i = n - 1;i >= 0;i--) relax(i);
}

inline void update(int l, int r, long long v){
  if(l == r) return;
  int ll = l + n, rr = r - 1 + n;
  for(l += n,r += n;l < r;l>>=1,r>>=1){
    if(l&1){
      tree[l].first += v;
      lazy[l] += v;
      l++;
    }
    if(r&1){
      r--;
      tree[r].first += v;
      lazy[r] += v;
    }
  }
  while(ll > 1){
    ll >>= 1;
    relax(ll);
  }
  while(rr > 1){
    rr >>= 1;
    relax(rr);
  }
}

///We need not propogate the lazy since we only query the entire range. We just store the lazy
inline int query(){
  return tree[1].second; ///the global minimum is definitely 4 (since 0 and everything form beautiful rectangles), hence just return the no. of occurances.
}

///consider a 2x2 square whose top-left corner is at r, c
void makeUpdate(int r, int c, bool isUndo){
  vector<int> values = {arr[r][c],arr[r+1][c],arr[r][c+1],arr[r+1][c+1]};
  sort(values.begin(),values.end());

  ///if isReverse, we undo our previous update
  if(isUndo){
    update(values[0],values[1],-1);
    update(values[2],values[3],-inf);
  }
  else{
    update(values[0],values[1],1); ///add one to the range, there is one more 2x2 square with exactly 1 black square
    update(values[2],values[3],inf); ///add infinity to "ruin" that range. When there are 2 black squares in the 2x2 square, it's impossible to have  beautiful rectangle
  }
}

void give_initial_chart(int H, int W, vector<int> R, vector<int> C) {
  n = H * W;
  rows = H; cols = W;
  for(int i = 0;i < rows+2;i++){
    arr.push_back({});
    arr.back().assign(cols+2,n);
  }
  for(int i = 0;i < n;i++){
    R[i]++; C[i]++;
    arr[R[i]][C[i]] = i;
    pos[i] = ii(R[i],C[i]);
  }

  initSegment();

  for(int r = 0;r <= rows;r++){
    for(int c = 0;c <= cols;c++){
      makeUpdate(r,c,false);
    }
  }	
}

int swap_seats(int a, int b) {
  ii aPos = pos[a]; ii bPos = pos[b];

  ///undo updates for all affected rectangles
  makeUpdate(aPos.first-1,aPos.second-1,true);
  makeUpdate(aPos.first,aPos.second-1,true);
  makeUpdate(aPos.first-1,aPos.second,true);
  makeUpdate(aPos.first,aPos.second,true);
  makeUpdate(bPos.first-1,bPos.second-1,true);
  makeUpdate(bPos.first,bPos.second-1,true);
  makeUpdate(bPos.first-1,bPos.second,true);
  makeUpdate(bPos.first,bPos.second,true);


  ///swapping the elements
  pos[b] = aPos; pos[a] = bPos;
  arr[aPos.first][aPos.second] = b; arr[bPos.first][bPos.second] = a;


  ///now update again for all affected rectangles
  makeUpdate(aPos.first-1,aPos.second-1,false);
  makeUpdate(aPos.first,aPos.second-1,false);
  makeUpdate(aPos.first-1,aPos.second,false);
  makeUpdate(aPos.first,aPos.second,false);
  makeUpdate(bPos.first-1,bPos.second-1,false);
  makeUpdate(bPos.first,bPos.second-1,false);
  makeUpdate(bPos.first-1,bPos.second,false);
  makeUpdate(bPos.first,bPos.second,false);

  return query();
}
# Verdict Execution time Memory Grader output
1 Correct 15 ms 512 KB Output is correct
2 Correct 18 ms 512 KB Output is correct
3 Correct 24 ms 512 KB Output is correct
4 Correct 17 ms 512 KB Output is correct
5 Correct 15 ms 512 KB Output is correct
6 Correct 22 ms 512 KB Output is correct
7 Correct 22 ms 512 KB Output is correct
8 Correct 22 ms 512 KB Output is correct
9 Correct 22 ms 512 KB Output is correct
10 Correct 22 ms 512 KB Output is correct
11 Correct 21 ms 512 KB Output is correct
12 Correct 16 ms 512 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 15 ms 512 KB Output is correct
2 Correct 18 ms 512 KB Output is correct
3 Correct 24 ms 512 KB Output is correct
4 Correct 17 ms 512 KB Output is correct
5 Correct 15 ms 512 KB Output is correct
6 Correct 22 ms 512 KB Output is correct
7 Correct 22 ms 512 KB Output is correct
8 Correct 22 ms 512 KB Output is correct
9 Correct 22 ms 512 KB Output is correct
10 Correct 22 ms 512 KB Output is correct
11 Correct 21 ms 512 KB Output is correct
12 Correct 16 ms 512 KB Output is correct
13 Correct 46 ms 1380 KB Output is correct
14 Correct 55 ms 1400 KB Output is correct
15 Correct 36 ms 1408 KB Output is correct
16 Correct 31 ms 1884 KB Output is correct
17 Correct 44 ms 1408 KB Output is correct
18 Correct 47 ms 1400 KB Output is correct
19 Correct 44 ms 1416 KB Output is correct
20 Correct 39 ms 1664 KB Output is correct
21 Correct 31 ms 1408 KB Output is correct
22 Correct 32 ms 1852 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1771 ms 82728 KB Output is correct
2 Correct 1054 ms 98680 KB Output is correct
3 Correct 979 ms 97272 KB Output is correct
4 Correct 859 ms 98568 KB Output is correct
5 Correct 897 ms 98680 KB Output is correct
6 Correct 977 ms 98680 KB Output is correct
7 Correct 963 ms 98552 KB Output is correct
8 Correct 920 ms 98572 KB Output is correct
9 Correct 954 ms 98680 KB Output is correct
10 Correct 949 ms 98168 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 46 ms 1536 KB Output is correct
2 Correct 133 ms 8136 KB Output is correct
3 Correct 879 ms 83064 KB Output is correct
4 Correct 1783 ms 83244 KB Output is correct
5 Correct 961 ms 98800 KB Output is correct
6 Correct 1891 ms 149488 KB Output is correct
7 Correct 882 ms 99468 KB Output is correct
8 Correct 1046 ms 98808 KB Output is correct
9 Correct 1014 ms 93364 KB Output is correct
10 Correct 1022 ms 103356 KB Output is correct
11 Correct 980 ms 120332 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 96 ms 2036 KB Output is correct
2 Correct 119 ms 2036 KB Output is correct
3 Correct 153 ms 2036 KB Output is correct
4 Correct 196 ms 2164 KB Output is correct
5 Correct 271 ms 3060 KB Output is correct
6 Correct 1268 ms 87032 KB Output is correct
7 Correct 1420 ms 90892 KB Output is correct
8 Correct 1269 ms 83940 KB Output is correct
9 Correct 2295 ms 90820 KB Output is correct
10 Correct 1272 ms 103432 KB Output is correct
11 Correct 1300 ms 105588 KB Output is correct
12 Correct 1277 ms 100324 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 15 ms 512 KB Output is correct
2 Correct 18 ms 512 KB Output is correct
3 Correct 24 ms 512 KB Output is correct
4 Correct 17 ms 512 KB Output is correct
5 Correct 15 ms 512 KB Output is correct
6 Correct 22 ms 512 KB Output is correct
7 Correct 22 ms 512 KB Output is correct
8 Correct 22 ms 512 KB Output is correct
9 Correct 22 ms 512 KB Output is correct
10 Correct 22 ms 512 KB Output is correct
11 Correct 21 ms 512 KB Output is correct
12 Correct 16 ms 512 KB Output is correct
13 Correct 46 ms 1380 KB Output is correct
14 Correct 55 ms 1400 KB Output is correct
15 Correct 36 ms 1408 KB Output is correct
16 Correct 31 ms 1884 KB Output is correct
17 Correct 44 ms 1408 KB Output is correct
18 Correct 47 ms 1400 KB Output is correct
19 Correct 44 ms 1416 KB Output is correct
20 Correct 39 ms 1664 KB Output is correct
21 Correct 31 ms 1408 KB Output is correct
22 Correct 32 ms 1852 KB Output is correct
23 Correct 1771 ms 82728 KB Output is correct
24 Correct 1054 ms 98680 KB Output is correct
25 Correct 979 ms 97272 KB Output is correct
26 Correct 859 ms 98568 KB Output is correct
27 Correct 897 ms 98680 KB Output is correct
28 Correct 977 ms 98680 KB Output is correct
29 Correct 963 ms 98552 KB Output is correct
30 Correct 920 ms 98572 KB Output is correct
31 Correct 954 ms 98680 KB Output is correct
32 Correct 949 ms 98168 KB Output is correct
33 Correct 46 ms 1536 KB Output is correct
34 Correct 133 ms 8136 KB Output is correct
35 Correct 879 ms 83064 KB Output is correct
36 Correct 1783 ms 83244 KB Output is correct
37 Correct 961 ms 98800 KB Output is correct
38 Correct 1891 ms 149488 KB Output is correct
39 Correct 882 ms 99468 KB Output is correct
40 Correct 1046 ms 98808 KB Output is correct
41 Correct 1014 ms 93364 KB Output is correct
42 Correct 1022 ms 103356 KB Output is correct
43 Correct 980 ms 120332 KB Output is correct
44 Correct 96 ms 2036 KB Output is correct
45 Correct 119 ms 2036 KB Output is correct
46 Correct 153 ms 2036 KB Output is correct
47 Correct 196 ms 2164 KB Output is correct
48 Correct 271 ms 3060 KB Output is correct
49 Correct 1268 ms 87032 KB Output is correct
50 Correct 1420 ms 90892 KB Output is correct
51 Correct 1269 ms 83940 KB Output is correct
52 Correct 2295 ms 90820 KB Output is correct
53 Correct 1272 ms 103432 KB Output is correct
54 Correct 1300 ms 105588 KB Output is correct
55 Correct 1277 ms 100324 KB Output is correct
56 Correct 140 ms 2036 KB Output is correct
57 Correct 230 ms 2036 KB Output is correct
58 Correct 409 ms 3000 KB Output is correct
59 Correct 1540 ms 99960 KB Output is correct
60 Correct 2588 ms 99692 KB Output is correct
61 Correct 1408 ms 99592 KB Output is correct
62 Correct 1383 ms 96364 KB Output is correct
63 Correct 2536 ms 102144 KB Output is correct
64 Correct 1621 ms 100364 KB Output is correct
65 Correct 1448 ms 99572 KB Output is correct
66 Correct 1704 ms 93748 KB Output is correct
67 Correct 1557 ms 104500 KB Output is correct
68 Correct 1469 ms 113032 KB Output is correct
69 Correct 2491 ms 123132 KB Output is correct