题解: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();
}