1 条题解

  • 0
    @ 2025-8-24 22:15:44

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar wsyhb
    **

    搬运于2025-08-24 22:15:44,当前版本为作者最后更新于2022-02-09 12:15:28,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题解

    首先,如果你画几个多边形来手玩,你会发现如下结论:

    结论一:对于凸多边形中的任意一个三角形及它的任意一边,要让这个三角形的这条边成为操作后多边形的某边,必须删除这个三角形这一侧的其它所有三角形。


    文字可能不是那么容易理解,下面举例说明:

    如上图,这个 1212 边形包含 1010 个三角形,其中的红色数字表示它们的编号。

    TiT_i 表示第 ii 个三角形,那么要让 T4T_4m1m_1 这条边成为操作后多边形的某边,必须删除 T1,T2T_1,T_2T3T_3;要让 T4T_4f1f_1 这条边成为操作后多边形的某边,必须删除 T6,T7,T8,T9T_6,T_7,T_8,T_9T10T_{10};要让 T4T_4j1j_1 这条边成为操作后多边形的某边,必须删除 T5T_5


    是不是感觉这个结论很显然?不过还是要给出证明的:

    设多边形边数为 nn,容易验证 n=3,4,5n=3,4,5 时结论一成立。
    假设 n<k(k6)n<k(k \ge 6) 时结论一成立,下证 n=kn=k 时结论一仍然成立。

    对于有两边都是整个多边形的边的三角形,结论一显然成立。

    对于有至少两边都不是整个多边形的边的三角形 XX,设它的三边分别为 a,b,ca,b,c,且 a,ba,b 都不是整个多边形的边。
    (换句话说,a,ba,b 这两侧都有其它三角形)
    那么要使 aa 成为操作后多边形的某边,必须删除以 aa 为边的另一个三角形 YY

    考虑如何在删除三角形 YY 的同时不删除三角形 XX:这相当于不能完全删除 YYaa 边另一侧(即包含三角形 XX 的这一侧),于是包含三角形 XX 的这一侧的部分可以被等效替换为一个单独的三角形 ZZ,而 ZZ 不能被删除。

    等价替换后总的三角形个数变少了,于是多边形的边数也由 n=kn=k 降到了 n<kn<k
    根据归纳,要删除 YY(即让 YYaa 以外的两边成为多边形的边),必须删掉除 Y,ZY,Z 以外的所有三角形。
    即结论一对于 XX 的边 aa 成立。
    同理可证 XX 的边 b,cb,c 成立。

    根据归纳,结论一对任意多边形的任意三角形的任意边成立。


    回到原题,设黑色三角形每一侧的三角形个数分别为 x,y,zx,y,z,那么问题转化为

    • 给定三堆石子,数量依次为 x,y,zx,y,z
    • 两人轮流操作,每次选取一堆石子并从其中取走一颗。
    • 当三堆石子中有至少两堆石子为空时,游戏结束。
    • 进行最后一次操作的人失败。

    说明:当黑色三角形有至少两边为多边形的边时,当前玩家把黑色三角形删除即可取得游戏的胜利。故造成这种局面的玩家失败。


    我想到这儿的第一反应:直觉上,局面的胜负与 x,y,zx,y,z 的奇偶性有关。(因为每次只取一颗石子)

    但我并不是很确定具体结论,于是写了个程序打了下 x,y,z10x,y,z \le 10 的胜负状态:

    (其中 val=0\mathit{val}=0 表示该局面必败,val=1\mathit{val}=1 表示必胜;程序见剪贴板

    这规律简直不要太明显:当 x+y+zx+y+z 为偶数时必败,反之必胜。


    更严谨地,我们有如下结论:

    结论二

    1. x,y,zx,y,z 中有至少 2200 时,该局面必胜。
    2. 否则,该局面必胜当且仅当 x+y+zx+y+z 为奇数。

    证明

    1 显然,故接下来考虑 x,y,zx,y,z 中有至多 1100 的情况。
    由于必存在某一时刻某堆石子被取空(或一开始就没有),故可以考虑只剩两堆石子 y,z(y,z>0)y,z(y,z>0) 的情况。

    除非万不得已,玩家一定不会把这两堆石子中的某一堆取空。
    即:除非 y=z=1y=z=1,玩家一定不会把 y,zy,z 中的任意一个变为 00
    这意味着最终的局面一定是 (0,0,1)(0,0,1)(要操作该局面的玩家获得胜利)。
    即:最终,不为空的这堆石子个数为 11

    而每次操作都会改变 x+y+zx+y+z 的奇偶性,故 x+y+zx+y+z 为奇数的局面必胜。


    如何求 x,y,zx,y,z 呢?
    设黑色三角形三点编号为 a,b,c(a<b<c)a,b,c(a<b<c),则 xx 为三点编号均在 [a,b][a,b] 中的三角形个数,yy 为三点编号均在 [b,c][b,c] 中的三角形个数,剩余三角形的个数即为 zz
    x,y,zx,y,z 的顺序显然不影响答案)

    于是这道题就做完了。

    过程比较简单,但却写了一大堆,好累啊。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	int n,a,b,c;
    	scanf("%d%d%d%d",&n,&a,&b,&c);
    	if(a>b)
    		swap(a,b);
    	if(a>c)
    		swap(a,c);
    	if(b>c)
    		swap(b,c);
    	int x=0,y=0,z=0;
    	for(int i=1;i<=n-3;++i)
    	{
    		int p,q,r;
    		scanf("%d%d%d",&p,&q,&r);
    		if(p>=a&&p<=b&&q>=a&&q<=b&&r>=a&&r<=b)
    			++x;
    		else if(p>=b&&p<=c&&q>=b&&q<=c&&r>=b&&r<=c)
    			++y;
    		else
    			++z;
    	}
    	int cnt0=(x==0)+(y==0)+(z==0);
    	if(cnt0>=2)
    		puts("TAK");
    	else if((x+y+z)&1)
    		puts("TAK");
    	else
    		puts("NIE");
    	return 0;
    }
    
    • 1

    信息

    ID
    4950
    时间
    1000ms
    内存
    125MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者