제출 #986404

#제출 시각아이디문제언어결과실행 시간메모리
986404PyqeRectangles (IOI19_rect)C++17
100 / 100
3442 ms220216 KiB
#include "rect.h"
#include <bits/stdc++.h>

using namespace std;

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

int n,m,nm=0,nn[2],a[2501][2501],dsu[2][2501],ls[2501],vl[2501][2501],fq[2501];
pair<int,int> as[2501];
pair<pair<int,int>,int> ass[6250001],dp[2][2501];

inline int val(int xx,int y,int x)
{
	if(!xx)
	{
		swap(y,x);
	}
	return a[y][x];
}

int fd(int xx,int x)
{
	if(dsu[xx][x]!=x)
	{
		dsu[xx][x]=fd(xx,dsu[xx][x]);
	}
	return dsu[xx][x];
}

long long count_rectangles(vector<vector<int>> aa)
{
	int rr,i,j,r,r2,ii,u,k,l,w,cr,tg,pp,kk,p,tmp[2501],c,z=0;
	
	n=aa.size();
	m=aa[0].size();
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
			a[i][j]=aa[i-1][j-1];
		}
	}
	for(rr=0;rr<2;rr++)
	{
		swap(n,m);
		if(rr)
		{
			sort(ass+1,ass+nm+1);
			pp=1;
		}
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=m;j++)
			{
				as[j]={val(rr,i,j),j};
				for(ii=0;ii<2;ii++)
				{
					dsu[ii][j]=j;
				}
				ls[j]=0;
				if(rr)
				{
					fq[j]=0;
				}
			}
			sort(as+1,as+m+1);
			for(;pp<=nm&&ass[pp].fr.fr<=i;pp++)
			{
				k=ass[pp].sc;
				w=ass[pp].fr.sc;
				fq[k]++;
				vl[k][fq[k]]=w;
			}
			l=0;
			for(j=1;j<=m;j++)
			{
				k=as[j].sc;
				w=as[j].fr;
				for(u=-1;u<=1;u+=2)
				{
					if(k+u&&k+u<=m&&val(rr,i,k+u)<=val(rr,i,k))
					{
						if(rr)
						{
							cr=fd(0,k);
							tg=fd(0,k+u);
							c=0;
							for(r=1;r<=fq[cr];r++)
							{
								kk=vl[cr][r];
								p=lower_bound(vl[tg]+1,vl[tg]+fq[tg]+1,kk)-vl[tg];
								if(p<=fq[tg]&&vl[tg][p]==kk)
								{
									c++;
									tmp[c]=kk;
								}
							}
						}
						for(ii=0;ii<2;ii++)
						{
							dsu[ii][fd(ii,k-ii+(u+1)/2)]=fd(ii,k-1+ii+(u+1)/2);
						}
						if(rr)
						{
							cr=fd(0,k);
							fq[cr]=c;
							for(r=1;r<=c;r++)
							{
								vl[cr][r]=tmp[r];
							}
						}
					}
				}
				if(j==m||w!=as[j+1].fr)
				{
					for(r=l+1;r<=j;r++)
					{
						k=as[r].sc;
						cr=fd(0,k);
						tg=fd(1,k);
						if(ls[cr]<j)
						{
							ls[cr]=j;
							if(!rr)
							{
								nm++;
								ass[nm]={{tg,cr},i};
							}
							else
							{
								p=lower_bound(dp[0]+1,dp[0]+nn[0]+1,mp(mp(cr,tg),0))-dp[0];
								w=1;
								if(p<=nn[0]&&dp[0][p].fr.fr==cr&&dp[0][p].fr.sc==tg)
								{
									w+=dp[0][p].sc;
								}
								nn[1]++;
								dp[1][nn[1]]={{cr,tg},w};
								for(r2=1;r2<=fq[cr];r2++)
								{
									kk=vl[cr][r2];
									z+=i-kk+1<=w&&kk>1&&cr>1&&i<n&&tg<m;
								}
							}
						}
					}
					l=j;
				}
			}
			if(rr)
			{
				nn[0]=nn[1];
				for(j=1;j<=nn[0];j++)
				{
					dp[0][j]=dp[1][j];
				}
				sort(dp[0]+1,dp[0]+nn[0]+1);
				nn[1]=0;
			}
		}
	}
	return z;
}

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

rect.cpp: In function 'long long int count_rectangles(std::vector<std::vector<int> >)':
rect.cpp:111:18: warning: 'c' may be used uninitialized in this function [-Wmaybe-uninitialized]
  111 |         vl[cr][r]=tmp[r];
      |         ~~~~~~~~~^~~~~~~
rect.cpp:34:35: warning: 'pp' may be used uninitialized in this function [-Wmaybe-uninitialized]
   34 |  int rr,i,j,r,r2,ii,u,k,l,w,cr,tg,pp,kk,p,tmp[2501],c,z=0;
      |                                   ^~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...