제출 #986399

#제출 시각아이디문제언어결과실행 시간메모리
986399Pyqe자리 배치 (IOI18_seats)C++17
100 / 100
1617 ms177896 KiB
#include "seats.h"
#include <bits/stdc++.h>

using namespace std;

#define mp make_pair
#define fr first
#define sc second

int n,m,a[1000069],ya[1000069],xa[1000069],vy[4]={-1,0,1,0},vx[4]={0,1,0,-1},inf=1e9;
pair<int,int> ps[1000069];
bool alr=0;

struct segtree
{
	int l,r,c;
	pair<int,int> mn,lz={0,0};
	segtree *p[2];
	
	void bd(int lh,int rh)
	{
		l=lh;
		r=rh;
		if(l==r)
		{
			mn=ps[l];
			mn.sc+=l+1;
			c=1;
		}
		else
		{
			int ii,md=(l+r)/2;
			
			for(ii=0;ii<2;ii++)
			{
				p[ii]=new segtree;
				p[ii]->bd(!ii?l:md+1,!ii?md:r);
			}
			mn=min(p[0]->mn,p[1]->mn);
			c=p[0]->c*(p[0]->mn==mn)+p[1]->c*(p[1]->mn==mn);
		}
	}
	inline void blc()
	{
		if(lz!=mp(0,0))
		{
			int ii;
			
			for(ii=0;ii<2;ii++)
			{
				p[ii]->mn.fr+=lz.fr;
				p[ii]->mn.sc+=lz.sc;
				p[ii]->lz.fr+=lz.fr;
				p[ii]->lz.sc+=lz.sc;
			}
			lz={0,0};
		}
	}
	void ud(int ky,int lh,int rh,int w)
	{
		if(l>rh||r<lh);
		else if(l>=lh&&r<=rh)
		{
			if(!ky)
			{
				mn.fr+=w;
				lz.fr+=w;
			}
			else
			{
				mn.sc+=w;
				lz.sc+=w;
			}
		}
		else
		{
			int ii;
			
			blc();
			for(ii=0;ii<2;ii++)
			{
				p[ii]->ud(ky,lh,rh,w);
			}
			mn=min(p[0]->mn,p[1]->mn);
			c=p[0]->c*(p[0]->mn==mn)+p[1]->c*(p[1]->mn==mn);
		}
	}
}
sg;

void acv(int y,int x,int u)
{
	int i,j,im,p=y*m+x,yy,xx,pp,mn[2]={inf,inf};
	
	for(im=0;im<4;im++)
	{
		yy=y+vy[im];
		xx=x+vx[im];
		if(yy>=0&&xx>=0&&yy<n&&xx<m)
		{
			pp=yy*m+xx;
			for(i=0;i<2;i++)
			{
				if(a[pp]<mn[i])
				{
					for(j=1;j>i;j--)
					{
						mn[j]=mn[j-1];
					}
					mn[i]=a[pp];
					break;
				}
			}
		}
	}
	if(alr)
	{
		sg.ud(0,mn[1],a[p]-1,u);
	}
	else if(mn[1]<=a[p])
	{
		ps[mn[1]].fr+=u;
		ps[a[p]].fr-=u;
	}
}

void give_initial_chart(int on,int om,vector<int> yaa,vector<int> xaa)
{
	int i,j,p;
	
	n=on;
	m=om;
	for(i=0;i<n*m;i++)
	{
		ya[i]=yaa[i];
		xa[i]=xaa[i];
		a[ya[i]*m+xa[i]]=i;
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			p=i*m+j;
			acv(i,j,1);
			if(i)
			{
				ps[max(a[p],a[p-m])].sc--;
			}
			if(j)
			{
				ps[max(a[p],a[p-1])].sc--;
			}
			if(i&&j)
			{
				ps[max(max(a[p],a[p-1]),max(a[p-m],a[p-m-1]))].sc++;
			}
		}
	}
	for(i=1;i<n*m;i++)
	{
		ps[i].fr+=ps[i-1].fr;
		ps[i].sc+=ps[i-1].sc;
	}
	sg.bd(0,n*m-1);
	alr=1;
}

int swap_seats(int w,int w2)
{
	int i,ii,iii,im,u,y,x,p,yy,xx,pp;
	
	for(ii=0;ii<2;ii++)
	{
		y=ya[w];
		x=xa[w];
		p=y*m+x;
		for(iii=0;iii<2;iii++)
		{
			u=iii*2-1;
			acv(y,x,u);
			for(im=0;im<4;im++)
			{
				yy=y+vy[im];
				xx=x+vx[im];
				if(yy>=0&&xx>=0&&yy<n&&xx<m)
				{
					pp=yy*m+xx;
					acv(yy,xx,u);
					sg.ud(1,max(a[p],a[pp]),n*m-1,-u);
				}
				yy=y+im/2;
				xx=x+im%2;
				if(yy>0&&xx>0&&yy<n&&xx<m)
				{
					pp=yy*m+xx;
					sg.ud(1,max(max(a[pp],a[pp-1]),max(a[pp-m],a[pp-m-1])),n*m-1,u);
				}
			}
			a[p]=w2;
		}
		swap(w,w2);
	}
	swap(ya[w],ya[w2]);
	swap(xa[w],xa[w2]);
	return sg.c;
}

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

seats.cpp: In function 'int swap_seats(int, int)':
seats.cpp:170:6: warning: unused variable 'i' [-Wunused-variable]
  170 |  int i,ii,iii,im,u,y,x,p,yy,xx,pp;
      |      ^
#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...