题解:CF1776L Controllers

CF1776L Controllers 题解

分析

先把题目形式化。设 \(n\) 次加减中有 \(x\) 个加,\(y\) 个减,其中 \(a\) 加了 \(u\) 次,减了 \(v\) 次,显然 \(b\) 加了 \(x-u\) 次,减了 \(y-v\) 次。题目则要求 \(u\cdot a-v\cdot a+(x-u)\cdot b-(y-v)\cdot b=0\),转换一下得 \((u-v)\cdot a=-(x-y)\cdot b+(u-v)\cdot b\),把右边的 \((u-v)\cdot b\) 拎到左边,得 \((u-v)\cdot (a-b)=-(x-y)\cdot b\)

接下来就是要解这个式子,分两种情况:

  • \(a-b\)\(0\) 时,\(x-y\) 必为 \(0\),否则无解。
  • \(a-b\) 不为 \(0\) 时,显然 \(u-v= \dfrac {-(x-y)\cdot b }{a-b}\)。很明显,\(0 \le u \le x\)\(0 \le v \le y\),通过这两个不等式解得 \(-y \le u-v \le x\)

代码内判断这两种情况即可。

示例代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
namespace Raiden
{
    int n;
    signed work()
    {
        cin >> n;
        int x = 0, y = 0;
        for (int i = 1; i <= n; i++)
        {
            char c;
            cin >> c;
            if (c == '+')
            {
                x++;
            }
            else
            {
                y++;
            }
        }
        int T;
        cin >> T;
        while (T--)
        {
            int a, b;
            cin >> a >> b;
            if (a == b)
            {
                if (x == y)
                {
                    cout << "YES" << endl;
                }
                else
                {
                    cout << "NO" << endl;
                }
                continue;
            }
            int m = x - y;
            if (b * m % (b - a))
            {
                cout << "NO" << endl;
                continue;
            }
            long long k = b * m / (b - a);
            if (-y <= k && k <= x)
            {
                cout << "YES" << endl;
            }
            else
            {
                cout << "NO" << endl;
            }
        }
        return 0;
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    return Raiden::work();
}
posted @ 2024-08-01 13:39  Ryan_Adam  阅读(5)  评论(0编辑  收藏  举报