Submission #288543

#TimeUsernameProblemLanguageResultExecution timeMemory
288543MercenarySeats (IOI18_seats)C++14
5 / 100
4091 ms61176 KiB
#include "seats.h"

#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/trie_policy.hpp>

#define pb push_back
#define mp make_pair
#define taskname "A"

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;
typedef pair<int,int> ii;
typedef tree <int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;

const int maxn = 1e3 + 5;
const int mod = 1e9 + 7;

vector<vector<int>> a;
vector<int> r , c;
int n , m;
int s[4][maxn * maxn * 4];
void update(int x , int l , int r , int pos , int& valx , int &valy){
    if(l == r){
        s[0][x] = s[1][x] = valx;
        s[2][x] = s[3][x] = valy;
        return;
    }
    int mid = l + r >> 1;
    if(pos <= mid)update(x * 2 , l , mid , pos , valx , valy);
    else update(x * 2 + 1 , mid + 1 , r , pos , valx , valy);
    s[0][x] = max(s[0][x * 2] , s[0][x * 2 + 1]);
    s[1][x] = min(s[1][x * 2] , s[1][x * 2 + 1]);
    s[2][x] = max(s[2][x * 2] , s[2][x * 2 + 1]);
    s[3][x] = min(s[3][x * 2] , s[3][x * 2 + 1]);

}
void query(int x , int l , int r , int L , int R , int &lx , int &rx , int & ly , int & ry){
    if(L > r || l > R)return;
    if(L <= l && r <= R){
        lx = min(lx , s[1][x]);
        ly = min(ly , s[3][x]);
        rx = max(rx , s[0][x]);
        ry = max(ry , s[2][x]);
        return ;
    }
    int mid = l + r >> 1;
    query(x * 2 , l , mid , L , R , lx , rx , ly , ry);
    query(x * 2 + 1, mid + 1 , r , L , R , lx , rx , ly , ry);
}
void build(int x , int l , int r){
    if(l == r){
        s[0][x] = s[1][x] = ::r[l - 1];
        s[2][x] = s[3][x] = ::c[l - 1];
        return;
    }
    int mid = l + r >> 1;
    build(x * 2 , l , mid);
    build(x * 2 + 1 , mid + 1 , r);
    s[0][x] = max(s[0][x * 2] , s[0][x * 2 + 1]);
    s[1][x] = min(s[1][x * 2] , s[1][x * 2 + 1]);
    s[2][x] = max(s[2][x * 2] , s[2][x * 2 + 1]);
    s[3][x] = min(s[3][x * 2] , s[3][x * 2 + 1]);
}

void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C) {
    r = R;c = C;
    m = H;n = W;
    a.resize(m , vector<int>(n , 0));
    for(int i = 0 ; i < n * m ; ++i)a[r[i]][c[i]] = i;
    if(n <= 1000 && m <= 1000){
        build(1,1,m*n);
    }
}

int swap_seats(int u , int v) {
    if(n <= 1000 && m <= 1000){
        update(1 , 1 , m * n , u + 1 , r[v] , c[v]);
        update(1 , 1 , m * n , v + 1 , r[u] , c[u]);
        swap(r[u] , r[v]);swap(c[u] , c[v]);
        int lx = m - 1, ly = n - 1 , rx = 0 , ry = 0;
        int res = 0;
        for(int i = 0 ; i < n * m ; ++i){
            res++;
            while(true){
                query(1,1,m*n,1,i+1,lx,rx,ly,ry);
                if(i == (rx - lx + 1) * (ry - ly + 1) - 1)break;
                i = (rx - lx + 1) * (ry - ly + 1) - 1;
            }
//            cout << endl;
        }
        return res;
    }
}

#ifdef LOCAL
#include <cstdio>
#include <cstdlib>
#include <vector>
#include "seats.h"

namespace {

int read_int() {
  int x;
  if (scanf("%d", &x) != 1) {
    fprintf(stderr, "Error while reading input\n");
    exit(1);
  }
  return x;
}

}  // namespace

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    if(fopen(taskname".INP","r")){
        freopen(taskname".INP", "r",stdin);
        freopen(taskname".OUT", "w",stdout);
    }
  int H = read_int();
  int W = read_int();
  int Q = read_int();
  std::vector<int> R(H * W), C(H * W);
  for (int i = 0; i < H * W; ++i) {
    R[i] = read_int();
    C[i] = read_int();
  }
  std::vector<int> A(Q), B(Q);
  for (int j = 0; j < Q; ++j) {
    A[j] = read_int();
    B[j] = read_int();
  }

  give_initial_chart(H, W, R, C);
  for (int j = 0; j < Q; ++j) {
    int answer = swap_seats(A[j], B[j]);
    cout << answer << endl;
  }
  return 0;
}

#endif // LOCAL

Compilation message (stderr)

seats.cpp: In function 'void update(int, int, int, int, int&, int&)':
seats.cpp:32:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   32 |     int mid = l + r >> 1;
      |               ~~^~~
seats.cpp: In function 'void query(int, int, int, int, int, int&, int&, int&, int&)':
seats.cpp:50:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   50 |     int mid = l + r >> 1;
      |               ~~^~~
seats.cpp: In function 'void build(int, int, int)':
seats.cpp:60:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   60 |     int mid = l + r >> 1;
      |               ~~^~~
seats.cpp: In function 'int swap_seats(int, int)':
seats.cpp:97:1: warning: control reaches end of non-void function [-Wreturn-type]
   97 | }
      | ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...