把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

题解 P7309 [COCI2018-2019#2] Kocka

传送门

题意

一个 $N\times N $ 的矩形,有从四周往内望去的第一个位置的距离,问是否存在一个矩形满足我们的观察。

分析

先说说我这个蒟蒻想出来的巨麻烦的方法。

首先先判断最简单的矛盾,就是左右穿插,上下穿插,这是第一步。

//-1 变成 n
for(int i=1; i<=n; ++i) if(L[i]+R[i]>=n) if(L[i]!=n||R[i]!=n) return puts("NE"),0;
for(int i=1; i<=n; ++i) if(U[i]+D[i]>=n) if(U[i]!=n||D[i]!=n) return puts("NE"),0;

第二步就是左右和上下之间的矛盾。
先从左边出发思考,我们在左边看到的这些黑格之前这一行一定不能出现节点,在黑格时,上下的两端应当将当前节点包裹,这就是第二步。


for(int i=1; i<=n; ++i) a[i]=<%L[i],i%>;
sort(a+1,a+n+1);
int now=1;
for(int i=1; i<=n; ++i) {
	int id=a[i].id;
	while(now<=L[id]) {
		if(U[now]!=INF) vis[U[now]+1]=vis[n-D[now]]=1;
		++now;
	}
	if(vis[id]) return puts("NE"),0;
	int x=L[id]+1;
	if((U[x]+1>id)||(id>n-D[x])) return puts("NE"),0;
}

然后就结束了,我的代码一共有 \(56\) 行,但是看了一眼这个大佬的题解,发现想麻烦了许多。

我们的黑点倘若出现了矛盾,那么必然会影响到其他的方向的值,那么直接将其他方向观察这个节点的影响求出,看是否矛盾即可。

代码就不贴了,看大佬博客即可。

posted @ 2024-01-30 15:57  djh0314  阅读(40)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end