1 条题解

  • 0
    @ 2026-2-22 17:20:05

    如果执着于回文那肯定不好做,于是就注意到特殊性质1

    换句话说,顺序不重要


    考虑特殊性质1

    n=1n=1 时,如果两个数一样那就小Y赢,否则小Y输。

    n=2n=2

    • 如果四个数都一样,小Y输;
    • 三个数一样一个数不一样,无论小Y删那个数,只要小H删掉不一样的数,小Y输
    • 两个数两个数一样,小H可以跟着小H删数,小Y输
    • 两个数一样两个数不一样,小Y把一样的两个数删掉一个,小Y赢 -四个数都不一样,小Y赢

    代码很简单,此处略去。


    考虑特殊性质2

    假设 n3n \geq 3 那么

    序列中最多只有两种不同的数,那么如果两种数出现次数都是偶数,那么小Y删什么数小H就删什么数,最后剩下来两个数一定一样

    序列中最多只有两种不同的数,那么如果两种数出现次数都是奇数,那么小Y删一个数那个数出现次数就变成奇数,小H删另外一个数,就变成了前面的情况

    综上所述,当 n2n \leq 2 情况同特殊性质1;否则小Y一定输。


    考虑全部测试数据

    由前面的两个特殊性质,不难发现:只要最后两个数字不一样,就小Y赢;否则小Y输。

    那小Y直接把重复的数字删掉,也就是“去重”,不久行了?

    小H最后既然要保证最后两个数字一样,就不会对小Y的“去重”产生贡献。

    小Y一共可以做 n1n-1 次操作。

    于是就可以统计去重后序列中数的个数 ss,如果 s<ns<n 则小Y赢;否则(sns \geq n)则小Y输,用 set 做比较方便。

    最后注意多测要清空。


    AC代码

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+5;
    int n,x;
    set<int>s;
    void solve()
    {
    	s.clear();cin>>n;
    	for(int i=1;i<=2*n;++i)cin>>x,s.insert(x);
    	puts(s.size()<=n?"Lose":"Win");
    	return;
    }
    signed main()
    {
    	int _;cin>>_;
    	while(_--)solve();
    	return 0;
    }
    
    
    • 1

    信息

    ID
    953
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    9
    已通过
    5
    上传者