【CF】Day39——Neowise Labs Contest 1 (Codeforces Round 1018, Div. 1 + Div. 2) D

成青之战,没想到写了两题还加分了,C题之后再补吧,dp太难

D. Wonderful Lightbulbs

题目:

【CF】Day39——Neowise Labs Contest 1 (Codeforces Round 1018, Div. 1 + Div. 2) D_第1张图片【CF】Day39——Neowise Labs Contest 1 (Codeforces Round 1018, Div. 1 + Div. 2) D_第2张图片

思路:

思维题?顶针题!

 我们观察一下题目,我们发现这个变化的形状很神秘,既不是四周变换,也不是方形变化,而是一个俄罗斯方块的形状,说明肯定有猫腻

我们先假定最开始的点为 (s,t),那么就来观察看看吧

我们发现每次操作对于每列都会变化偶数次,也就是说每次操作都不会改变每列的奇偶性,那么也就是说 x = s 这一列一定是奇数个灯泡,这样我们就能找到 s 了

接下来我们寻找 t ,我们发现这个形状很神秘,其实这是设计好的,我们发现这其实就是对于两条对角线进行操作,那么和 x 同理,每次操作都不会改变每条对角线的奇偶性,这样的话 s + t 这条对角线一定是奇数个灯泡,那么找到这条对角线 c,t 的值就是 c - s 了

这样我们就找到了最开始的 x 和 y 了

代码:

#include 
#include 
#include
#include
#include
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define int long long
#define yes cout << "YES\n"
#define no cout << "NO\n"

void solve()
{
    int n;
    cin >> n;
    map X, XY;
    for (int i = 0; i < n; i++)
    {
        int x, y;
        cin >> x >> y;
        X[x]++;
        XY[x + y]++;
    }
    int x = 0, y = 0;
    for (auto g : X)
    {
        if (g.second & 1)
        {
            x = g.first;
            break;
        }
    }
    for (auto g : XY)
    {
        if (g.second & 1)
        {
            y = g.first - x;
            break;
        }
    }
    cout << x << " " << y << endl;
}

signed main()
{
    cin.tie(0)->sync_with_stdio(false);
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

你可能感兴趣的:(c++,算法,动态规划)