제출 #1330708

#제출 시각아이디문제언어결과실행 시간메모리
1330708AMnu자리 배치 (IOI18_seats)C++20
컴파일 에러
0 ms0 KiB
#include "seats.h"
#include <bits/stdc++.h>
using namespace std;

const int MAXN=1e6+5;

int N, M;
int A[MAXN];
int X[MAXN];
int Y[MAXN];
int P[MAXN];
bool B[3][3];

struct segment {
	int L, R;
	int val, ans, lazy;
	segment *lef, *rig;
	
	void build(int x,int y) {
		L=x;
		R=y;
		val=0;
		ans=R-L+1;
		lazy=0;
		
		if (x==y) {
			return;
		}
		
		int T;
		T=(L+R)/2;
		lef=new segment;
		lef->build(L,T);
		rig=new segment;
		rig->build(T+1,R);
		
		return;
	}
	
	void balance() {
		if (!lazy) {
			return;
		}
		
		lef->val+=lazy;
		lef->lazy+=lazy;
		rig->val+=lazy;
		rig->lazy+=lazy;
		lazy=0;
		
		return;
	}
	
	void update(int x,int y,int z) {
		if (L>y||R<x||!z) {
			return;
		}
		
		if (L>=x&&R<=y) {
			val+=z;
			lazy+=z;
			return;
		}
		
		balance();
		lef->update(x,y,z);
		rig->update(x,y,z);
		val=min(lef->val,rig->val);
		ans=0;
		
		if (val==lef->val) {
			ans+=lef->ans;
		}
		
		if (val==rig->val) {
			ans+=rig->ans;
		}
		
		return;
	}
	
	void debug() {
		return;
		
		if (L==R) {
			cout<<val<<' ';
			
			if (R==N*M-1) {
				cout<<'\n';
			}
			
			return;
		}
		
		balance();
		lef->debug();
		rig->debug();
	}
	
}
data;

int pos(int a,int b) {
	if (a<0||a>=N||b<0||b>=M) {
		return N*M;
	}
	
	return A[a*M+b];
}

int index(int a) {
	return X[a]*M+Y[a];
}

bool valid(bool a,bool b,bool c) {
	return (a^b)&&(b^c);
}

int score() {
	int ret=0;
	
	ret+=valid(B[0][1],B[1][1],B[1][0]);
	ret+=valid(B[0][1],B[1][1],B[1][2]);
	ret+=valid(B[2][1],B[1][1],B[1][0]);
	ret+=valid(B[2][1],B[1][1],B[1][2]);
	
	ret+=valid(B[0][0],B[0][1],B[1][1]);
	ret+=valid(B[0][0],B[1][0],B[1][1]);
	ret+=valid(B[0][2],B[0][1],B[1][1]);
	ret+=valid(B[0][2],B[1][2],B[1][1]);
	ret+=valid(B[2][0],B[2][1],B[1][1]);
	ret+=valid(B[2][0],B[1][0],B[1][1]);
	ret+=valid(B[2][2],B[2][1],B[1][1]);
	ret+=valid(B[2][2],B[1][2],B[1][1]);
	
	return ret;
}

void balance(int a) {
	if (a==N*M) {
		return;
	}
	
	for (int i=-1;i<=1;i++) {
		for (int j=-1;j<=1;j++) {
			B[i+1][j+1]=pos(X[a]+i,Y[a]+j)<a;
		}
	}
	
	int save;
	save=score();
	B[1][1]=1;
	save=score()-save;
	
	if (save!=P[a]) {
		data.update(a,N*M-1,save-P[a]);
		P[a]=save;
	}
}

void spread(int a) {
	for (int i=-1;i<=1;i++) {
		for (int j=-1;j<=1;j++) {
			balance(pos(X[a]+i,Y[a]+j));
		}
	}
}

void give_initial_chart(int H, int W, vector<int> R, vector<int> C) {
	N=H;
	M=W;
	data.build(0,N*M-1);
	
	for (int i=0;i<N*M;i++) {
		X[i]=R[i];
		Y[i]=C[i];
		A[index(i)]=i;
	}
	
	for (int i=0;i<N*M;i++) {
		balance(i);
	}
}

int swap_seats(int a, int b) {
	swap(X[a],X[b]);
	swap(Y[a],Y[b]);
	swap(A[index(a)],A[index(b)]);
	spread(a);
	spread(b);
	
	return data.ans;
}

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

seats.cpp: In function 'void balance(int)':
seats.cpp:156:17: error: reference to 'data' is ambiguous
  156 |                 data.update(a,N*M-1,save-P[a]);
      |                 ^~~~
In file included from /usr/include/c++/13/vector:69,
                 from seats.h:3,
                 from seats.cpp:1:
/usr/include/c++/13/bits/range_access.h:346:5: note: candidates are: 'template<class _Tp> constexpr const _Tp* std::data(initializer_list<_Tp>)'
  346 |     data(initializer_list<_Tp> __il) noexcept
      |     ^~~~
/usr/include/c++/13/bits/range_access.h:336:5: note:                 'template<class _Tp, long unsigned int _Nm> constexpr _Tp* std::data(_Tp (&)[_Nm])'
  336 |     data(_Tp (&__array)[_Nm]) noexcept
      |     ^~~~
/usr/include/c++/13/bits/range_access.h:325:5: note:                 'template<class _Container> constexpr decltype (__cont.data()) std::data(const _Container&)'
  325 |     data(const _Container& __cont) noexcept(noexcept(__cont.data()))
      |     ^~~~
/usr/include/c++/13/bits/range_access.h:314:5: note:                 'template<class _Container> constexpr decltype (__cont.data()) std::data(_Container&)'
  314 |     data(_Container& __cont) noexcept(noexcept(__cont.data()))
      |     ^~~~
seats.cpp:101:1: note:                 'segment data'
  101 | data;
      | ^~~~
seats.cpp: In function 'void give_initial_chart(int, int, std::vector<int>, std::vector<int>)':
seats.cpp:172:9: error: reference to 'data' is ambiguous
  172 |         data.build(0,N*M-1);
      |         ^~~~
/usr/include/c++/13/bits/range_access.h:346:5: note: candidates are: 'template<class _Tp> constexpr const _Tp* std::data(initializer_list<_Tp>)'
  346 |     data(initializer_list<_Tp> __il) noexcept
      |     ^~~~
/usr/include/c++/13/bits/range_access.h:336:5: note:                 'template<class _Tp, long unsigned int _Nm> constexpr _Tp* std::data(_Tp (&)[_Nm])'
  336 |     data(_Tp (&__array)[_Nm]) noexcept
      |     ^~~~
/usr/include/c++/13/bits/range_access.h:325:5: note:                 'template<class _Container> constexpr decltype (__cont.data()) std::data(const _Container&)'
  325 |     data(const _Container& __cont) noexcept(noexcept(__cont.data()))
      |     ^~~~
/usr/include/c++/13/bits/range_access.h:314:5: note:                 'template<class _Container> constexpr decltype (__cont.data()) std::data(_Container&)'
  314 |     data(_Container& __cont) noexcept(noexcept(__cont.data()))
      |     ^~~~
seats.cpp:101:1: note:                 'segment data'
  101 | data;
      | ^~~~
seats.cpp: In function 'int swap_seats(int, int)':
seats.cpp:192:16: error: reference to 'data' is ambiguous
  192 |         return data.ans;
      |                ^~~~
/usr/include/c++/13/bits/range_access.h:346:5: note: candidates are: 'template<class _Tp> constexpr const _Tp* std::data(initializer_list<_Tp>)'
  346 |     data(initializer_list<_Tp> __il) noexcept
      |     ^~~~
/usr/include/c++/13/bits/range_access.h:336:5: note:                 'template<class _Tp, long unsigned int _Nm> constexpr _Tp* std::data(_Tp (&)[_Nm])'
  336 |     data(_Tp (&__array)[_Nm]) noexcept
      |     ^~~~
/usr/include/c++/13/bits/range_access.h:325:5: note:                 'template<class _Container> constexpr decltype (__cont.data()) std::data(const _Container&)'
  325 |     data(const _Container& __cont) noexcept(noexcept(__cont.data()))
      |     ^~~~
/usr/include/c++/13/bits/range_access.h:314:5: note:                 'template<class _Container> constexpr decltype (__cont.data()) std::data(_Container&)'
  314 |     data(_Container& __cont) noexcept(noexcept(__cont.data()))
      |     ^~~~
seats.cpp:101:1: note:                 'segment data'
  101 | data;
      | ^~~~