제출 #611418

#제출 시각아이디문제언어결과실행 시간메모리
611418Cross_Ratio자리 배치 (IOI18_seats)C++14
33 / 100
1809 ms71808 KiB
#include "seats.h" #include <bits/stdc++.h> using namespace std; int H, W; vector<int> R, C; vector<vector<int>> A; const int INF = 1e9; typedef pair<int,int> P; struct SegTree { struct Node { int sum[3];//0, 1, 2 int cnt; Node(int _c, int s1, int s2, int s3) { cnt = _c; sum[0] = s1; sum[1] = s2; sum[2] = s3; } Node() { cnt = sum[0] = sum[1] = sum[2] = 0; } }; vector<Node> seg; // max, min int MAX; void init(int N) { int i; for(i=1;i<2*N;i*=2) {} seg.resize(i); MAX = i; for(i=MAX/2;i<MAX;i++) { seg[i].sum[0] = 1; } } Node f(Node x, Node y, int cnt) { Node c; c.cnt = cnt; c.sum[0] = c.sum[1] = c.sum[2] = 0; for(int i = 0; i+cnt < 3; i++) { c.sum[i+cnt] += x.sum[i] + y.sum[i]; } return c; } void add(int s, int e, int k, int n, int ns, int ne) { if(e<=ns||ne<=s) return; if(s<=ns&&ne<=e) { seg[n].cnt += k; } else { int mid = ns + ne >> 1; add(s,e,k,2*n,ns,mid); add(s,e,k,2*n+1,mid,ne); } assert(seg[n].cnt >= 0); if(ne==ns+1) { seg[n].sum[0] = seg[n].sum[1] = seg[n].sum[2] = 0; if(seg[n].cnt < 3) seg[n].sum[seg[n].cnt] = 1; } else { seg[n] = f(seg[2*n],seg[2*n+1], seg[n].cnt); } /*cout << n << " Node :\n"; cout << ns <<' ' <<ne << '\n'; cout << seg[n].cnt << '\n'; cout <<seg[n].sum[0] << ' ' << seg[n].sum[1] << ' ' << seg[n].sum[2] << '\n';*/ } void add(int s, int e, int k) { //cout << "Plus " << k << " On " << s << " to " << e << '\n'; add(s,e,k,1,0,MAX/2); } int sum() { return seg[1].sum[2]; } }; //int chk[1000005]; SegTree tree; int B[1000005]; void give_initial_chart(int _H, int _W, vector<int> _R, vector<int> _C) { H = _H; W = _W; R = _R; C = _C; A.resize(H); int i, j; for(i=0;i<H;i++) A[i].resize(W); for(i=0;i<R.size();i++) { A[R[i]][C[i]] = i; } for(i=0;i<W;i++) B[C[i]] =i; tree.init(W+3); for(i=0;i+1<W;i++) { int a = min(B[i],B[i+1]); int b = max(B[i],B[i+1]); tree.add(a, b, 1); } tree.add(B[0], W, 1); tree.add(B[W-1], W, 1); } int dx[2] = {1,-1}; bool in(int x) { return 0 <=x && x < W; } int swap_seats(int a, int b) { if(a==b) return tree.sum(); if(C[a]>C[b]) swap(a, b); if(C[b]==C[a]+1) { int i; for(i=0;i<1;i++) { int a2 = C[a] - 1; if(in(a2)) { tree.add(min(a,B[a2]),max(a,B[a2]),-1); } else { tree.add(a, W, -1); } } for(i=0;i<1;i++) { int b2 = C[b] + 1; if(in(b2)) { tree.add(min(b,B[b2]),max(b,B[b2]),-1); } else { tree.add(b, W, -1); } } int v = B[C[b]]; B[C[b]] = B[C[a]]; B[C[a]] = v; v = C[a]; C[a] = C[b]; C[b] = v; for(i=0;i<1;i++) { int a2 = C[a] + 1; if(in(a2)) { tree.add(min(a,B[a2]),max(a,B[a2]),1); } else { tree.add(a, W, 1); } } for(i=0;i<1;i++) { int b2 = C[b] - 1; if(in(b2)) { tree.add(min(b,B[b2]),max(b,B[b2]),1); } else { tree.add(b, W, 1); } } } else { int i; for(i=0;i<2;i++) { int a2 = C[a] + dx[i]; if(in(a2)) { tree.add(min(a,B[a2]),max(a,B[a2]),-1); } else { tree.add(a, W, -1); } } for(i=0;i<2;i++) { int b2 = C[b] + dx[i]; if(in(b2)) { tree.add(min(b,B[b2]),max(b,B[b2]),-1); } else { tree.add(b, W, -1); } } int v = B[C[b]]; B[C[b]] = B[C[a]]; B[C[a]] = v; v = C[a]; C[a] = C[b]; C[b] = v; for(i=0;i<2;i++) { int a2 = C[a] + dx[i]; if(in(a2)) { tree.add(min(a,B[a2]),max(a,B[a2]),1); } else { tree.add(a, W, 1); } } for(i=0;i<2;i++) { int b2 = C[b] + dx[i]; if(in(b2)) { tree.add(min(b,B[b2]),max(b,B[b2]),1); } else { tree.add(b, W, 1); } } } int cnt = 0; int ma = C[0]; int mi = C[0]; for(int i=0;i<W;i++) { ma = max(ma, C[i]); mi = min(mi, C[i]); if(ma-mi+1==i+1) cnt++; }/* cout << "C :\n"; for(int i = 0; i < W; i++) { cout << C[i] << ' '; } cout << '\n'; cout << "B : \n"; for(int i = 0; i <W; i++) { cout << B[i] << ' '; } cout << '\n'; if(cnt != tree.sum()) { cout << "Wrong : "; cout << cnt << ' ' << tree.sum() << '\n'; }*/ return tree.sum(); }

컴파일 시 표준 에러 (stderr) 메시지

seats.cpp: In member function 'void SegTree::add(int, int, int, int, int, int)':
seats.cpp:49:26: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   49 |             int mid = ns + ne >> 1;
      |                       ~~~^~~~
seats.cpp: In function 'void give_initial_chart(int, int, std::vector<int>, std::vector<int>)':
seats.cpp:85:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   85 |     for(i=0;i<R.size();i++) {
      |             ~^~~~~~~~~
seats.cpp:83:12: warning: unused variable 'j' [-Wunused-variable]
   83 |     int i, j;
      |            ^
#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...