제출 #294547

#제출 시각아이디문제언어결과실행 시간메모리
294547PyqeI want to be the very best too! (NOI17_pokemonmaster)C++14
27 / 100
5070 ms15872 KiB
#include <bits/stdc++.h>

using namespace std;

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

long long n,m,nn=0,wg[50069],aa[50069],dsu[50069],a[50069],pst[50069],sbt[50069],pr[50069][16],bl[50069],ls[50069],vy[4]={-1,0,1,0},vx[4]={0,1,0,-1};
pair<long long,long long> as[50069];
bitset<50069> vtd;
vector<long long> al[50069];

long long fd(long long x)
{
	if(dsu[x]!=x)
	{
		dsu[x]=fd(dsu[x]);
	}
	return dsu[x];
}

void dfs(long long x)
{
	long long i,j,sz=al[x].size(),l;
	
	nn++;
	a[nn]=aa[x];
	pst[x]=nn;
	sbt[x]=1;
	for(i=0;i<sz;i++)
	{
		l=al[x][i];
		pr[l][0]=x;
		for(j=1;j-1<bl[pr[l][j-1]];j++)
		{
			pr[l][j]=pr[pr[l][j-1]][j-1];
		}
		bl[l]=j;
		dfs(l);
		sbt[x]+=sbt[l];
	}
}

int main()
{
	long long t,rr,i,j,im,ky,p,y,x,w,yy,xx,pp,z;
	
	scanf("%lld%lld%lld",&n,&m,&t);
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			p=i*m+j;
			scanf("%lld",wg+p);
			as[p]={wg[p],p};
		}
	}
	sort(as,as+n*m);
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			p=i*m+j;
			scanf("%lld",aa+p);
		}
	}
	for(i=0;i<n*m;i++)
	{
		p=as[i].sc;
		y=p/m;
		x=p%m;
		vtd[p]=1;
		dsu[p]=p;
		for(im=0;im<4;im++)
		{
			yy=y+vy[im];
			xx=x+vx[im];
			pp=yy*m+xx;
			if(yy>=0&&xx>=0&&yy<n&&xx<m&&vtd[pp]&&fd(pp)!=p)
			{
				al[p].push_back(fd(pp));
				dsu[fd(pp)]=p;
			}
		}
	}
	dfs(p);
	for(rr=1;rr<=t;rr++)
	{
		scanf("%lld%lld%lld%lld",&ky,&x,&y,&w);
		y--;
		x--;
		p=y*m+x;
		if(ky==1)
		{
			a[pst[p]]=w;
		}
		else if(wg[p]>w)
		{
			printf("0\n");
		}
		else
		{
			for(i=15;i+1;i--)
			{
				if(i<bl[p]&&wg[pr[p][i]]<=w)
				{
					p=pr[p][i];
				}
			}
			z=0;
			for(i=pst[p];i<=pst[p]+sbt[p]-1;i++)
			{
				z+=ls[a[i]]<rr;
				ls[a[i]]=rr;
			}
			printf("%lld\n",z);
		}
	}
}

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

pokemonmaster.cpp: In function 'int main()':
pokemonmaster.cpp:49:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   49 |  scanf("%lld%lld%lld",&n,&m,&t);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
pokemonmaster.cpp:55:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   55 |    scanf("%lld",wg+p);
      |    ~~~~~^~~~~~~~~~~~~
pokemonmaster.cpp:65:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   65 |    scanf("%lld",aa+p);
      |    ~~~~~^~~~~~~~~~~~~
pokemonmaster.cpp:90:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   90 |   scanf("%lld%lld%lld%lld",&ky,&x,&y,&w);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pokemonmaster.cpp:87:5: warning: 'p' may be used uninitialized in this function [-Wmaybe-uninitialized]
   87 |  dfs(p);
      |  ~~~^~~
#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...