Submission #288543

#TimeUsernameProblemLanguageResultExecution timeMemory
288543Mercenary자리 배치 (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...