제출 #114490

#제출 시각아이디문제언어결과실행 시간메모리
114490claudySeats (IOI18_seats)C++14
25 / 100
3571 ms180984 KiB
# include "seats.h"
# include "bits/stdc++.h"
std::pair<int,int> DR[] = {{-1,0},{0,1},{1,0},{0,-1},{-1,1},{-1,-1},{1,1},{1,-1}};
# define ll long long
# define clock (clock() * 1000.0 / CLOCKS_PER_SEC)
# define rc(s) return cout << s,0
# define rcg(s) cout << s;exit(0)
# define _ ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0);
# define db(x) cerr << #x << " = " << x << '\n'
# define pb push_back
# define mp make_pair
# define all(s) s.begin(),s.end()
# define sz(x) (int)((x).size())
using namespace std;

int n,m,q,r[1 << 20],c[1 << 20],A,B;
int ans = 0;
set<int>posok;
int t[2][1 << 22][2];
set<int>s1[2005],s2[2005];

void upd1(int nod,int l,int r,int pos,int val,int op)
{
	if(l == r)
	{
		t[0][nod][op] = val;
		return ;
	}
	int mid = l + r >> 1;
	if(pos <= mid) upd1(nod << 1,l,mid,pos,val,op);
	else upd1(nod << 1 | 1,mid + 1,r,pos,val,op);
	t[0][nod][op] = min(t[0][nod << 1][op],t[0][nod << 1 | 1][op]);
}

void upd2(int nod,int l,int r,int pos,int val,int op)
{
	if(l == r)
	{
		t[1][nod][op] = val;
		return ;
	}
	int mid = l + r >> 1;
	if(pos <= mid) upd2(nod << 1,l,mid,pos,val,op);
	else upd2(nod << 1 | 1,mid + 1,r,pos,val,op);
	t[1][nod][op] = max(t[1][nod << 1][op],t[1][nod << 1 | 1][op]);
}

int qry1(int nod,int tl,int tr,int l,int r,int op)
{
	if(l > r) return 1e9;
	if(tl == l && tr == r) return t[0][nod][op];
	int mid = tl + tr >> 1;
	return min(qry1(nod << 1,tl,mid,l,min(mid,r),op),qry1(nod << 1 | 1,mid + 1,tr,max(mid + 1,l),r,op));
}

int qry2(int nod,int tl,int tr,int l,int r,int op)
{
	if(l > r) return 0;
	if(tl == l && tr == r) return t[1][nod][op];
	int mid = tl + tr >> 1;
	return max(qry2(nod << 1,tl,mid,l,min(mid,r),op),qry2(nod << 1 | 1,mid + 1,tr,max(mid + 1,l),r,op));
}

void add1(int idx, int val)
{
	s1[val].insert(idx);
	upd1(1,1,n * m,idx,val,0);
	upd2(1,1,n * m,idx,val,0);
}

void add2(int idx,int val)
{
	s2[val].insert(idx);
	upd1(1,1,n * m,idx,val,1);
	upd2(1,1,n * m,idx,val,1);
}

void rem1(int idx, int val)
{
	if(s1[val].find(idx) != s1[val].end()) s1[val].erase(s1[val].find(idx));
}

void rem2(int idx, int val)
{
	if(s2[val].find(idx) != s2[val].end()) s2[val].erase(s2[val].find(idx));
}

void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C) {
	n = H;
	m = W;
	posok.clear();
	for(int i = 1;i <= 4 * n * m;i++) t[0][i][0] = t[0][i][1] = 1e9;
	for(int i = 1;i <= 4 * n * m;i++) t[1][i][0] = t[1][i][1] = 0;
	for(int i = 1;i <= max(n,m);i++)
	{
		s1[i].clear();
		s2[i].clear();
	}
	for(int i = 1;i <= n * m;i++)
	{
		r[i] = R[i - 1] + 1;
		c[i] = C[i - 1] + 1;
		add1(i,r[i]);add2(i,c[i]);
	}

	int mn1 = 1e9,mn2 = 1e9,mx1 = 0,mx2 = 0;
	for(int i = 1;i <= n * m;i++)
	{
		mn1 = min(mn1,r[i]);
		mx1 = max(mx1,r[i]);
		mn2 = min(mn2,c[i]);
		mx2 = max(mx2,c[i]);
		if((mx2 - mn2 + 1) * (mx1 - mn1 + 1) == i){
			ans++;
			posok.insert(i);
		}
	}
}

vector<int>toerase;
set<int>vals;
vector<int>vec;

int swap_seats(int A, int B) {
	int x = A,y = B;
	x++;
	y++;
	if(x > y) swap(x,y);
	rem1(x,r[x]);rem2(x,c[x]);
	rem1(y,r[y]);rem2(y,c[y]);
	swap(r[x],r[y]);
	swap(c[x],c[y]);
	add1(x,r[x]);add2(x,c[x]);
	add1(y,r[y]);add2(y,c[y]);
	toerase.clear();
	for(auto it : posok)
	{
		if(it >= x && it <= y)
		{
			ans--;
			toerase.pb(it);
		}
	}
	for(auto it : toerase) posok.erase(posok.find(it));
	vals.clear();
	vals.insert(x);
	vals.insert(y);
	for(int i = 1;i <= max(n,m);i++)
	{
		if(sz(s1[i]) && *(s1[i].begin()) >= x && *(s1[i].begin()) <= y) vals.insert(*(s1[i].begin()));
		if(sz(s2[i]) && *(s2[i].begin()) >= x && *(s2[i].begin()) <= y) vals.insert(*(s2[i].begin()));
	}
	vec.clear();
	for(auto it : vals) vec.pb(it);
	vec.pb(y + 1);
	int mn1 = 1e9,mn2 = 1e9,mx1 = 0,mx2 = 0;
	mn1 = qry1(1,1,n * m,1,x,0);
	mn2 = qry1(1,1,n * m,1,x,1);
	mx1 = qry2(1,1,n * m,1,x,0);
	mx2 = qry2(1,1,n * m,1,x,1);
	for(int i = 0;i < sz(vec) - 1;i++)
	{
		mn1 = min(mn1, r[vec[i]]);
		mn2 = min(mn2, c[vec[i]]);
		mx1 = max(mx1, r[vec[i]]);
		mx2 = max(mx2, c[vec[i]]);
		int k = (mx1 - mn1 + 1) * (mx2 - mn2 + 1);
		if(k >= vec[i] && k < vec[i + 1])
		{
			ans++;
			posok.insert(k);
		}
	}
	return ans;
}


/*
int32_t main(){

	vector<int>C = {0,1,0,1};
	give_initial_chart(2,2,R,C);
	cout << ans << '\n';
	cout << swap_seats(2,1) << '\n';
}*/

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

seats.cpp: In function 'void upd1(int, int, int, int, int, int)':
seats.cpp:29:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid = l + r >> 1;
            ~~^~~
seats.cpp: In function 'void upd2(int, int, int, int, int, int)':
seats.cpp:42:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid = l + r >> 1;
            ~~^~~
seats.cpp: In function 'int qry1(int, int, int, int, int, int)':
seats.cpp:52:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid = tl + tr >> 1;
            ~~~^~~~
seats.cpp: In function 'int qry2(int, int, int, int, int, int)':
seats.cpp:60:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid = tl + tr >> 1;
            ~~~^~~~
#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...