341
A - Print 341
给定一个正整数 0
和 1
交替出现。
void solve() {
int n;cin >> n;
string a = "";
for (int i = 1;i <= n;i++) {
a += "10";
}
a += "1";
cout << a << '\n';
}
B - Foreign Exchange
有
高桥可以重复下面的操作任意多次,可能为零:
- 首先,在
和 之间选择一个整数 。 - 然后,如果高桥至少有
个单位的 国货币,他就执行一次以下操作: - 支付
个单位的 国货币,获得 个单位的 国货币。
- 支付
打印出高桥最终可能拥有的
由 获得 Ti 个单位的 (i+1) 国货币
容易知道,肯定是一级一级向下传递的,所以直接贪心即可。
#define int long long
void solve() {
int n;cin >> n;vector<int> a(n + 1);
for (int i = 1;i <= n;i++) {
cin >> a[i];
}
vector<pair<int, int>> s(n + 1);
for (int i = 1;i <= n - 1;i++) {
cin >> s[i].first >> s[i].second;
}
for (int i = 1;i <= n - 1;i++) {
int bei = a[i] / s[i].first;
a[i + 1] += bei * s[i].second;
}
cout << a[n] << '\n';
}
C - Takahashi Gets Lost
给定一个操作字符串和一个地图,若图上 .
按照操作字符串做完操作 位置全程在 .
上,则算是一个答案
char s[510][510];
int dx[] = {-1,1,0,0};
int dy[] = {0,0,-1,1};
void solve() {
int h, w, n;cin >> h >> w >> n;
string t;cin >> t;
for (int i = 1;i <= h;i++)
for (int j = 1;j <= w;j++)
cin >> s[i][j];
int ans = 0;
for (int i = 2;i <= h - 1;i++) {
for (int j = 2;j <= w - 1;j++) {
bool ok = true;
if (s[i][j] == '.') {
int x = i, y = j;
for (int k = 0;k < n;k++) {
int op = -1;
if (t[k] == 'U') {
op = 0;
} else if (t[k] == 'D') {
op = 1;
} else if (t[k] == 'L') {
op = 2;
} else if (t[k] == 'R') {
op = 3;
}
x += dx[op];
y += dy[op];
if (s[x][y] == '#') {
ok = false;break;
}
}
if (ok)ans++;
}
}
}
cout << ans << '\n';
}
D - Only one of two
给出
#define int long long
void solve() {
int N, M, K;
cin >> N >> M >> K;
int low = 1, high = 1e18, ans = -1;
while (low <= high) {
int mid = (high + low) / 2;
//lcm(a,b)=(a / __gcd(a, b)) * b
int count = mid / N + mid / M - 2 * (mid / ((N / __gcd(N, M)) * M));
if (count >= K) {
ans = mid;
high = mid - 1;
} else {
low = mid + 1;
}
}
cout << ans << '\n';
}
Solution
二分
能被
官方题解:
将
, 的最小公倍数记为 。
则在正整数以下中,能被 和 同时整除的数有 个。因此,在 到 之间,能被 和 中的一者整除的数有 个。 此外,由于这个数目是关于
单调递增的,因此“答案要求在 以下”和“在 到 之间,能被 和 中的一者整除的数至少有 个”即 是等价的。 因此,可以利用二分搜索来解决这个问题。在这个问题的限制下,答案一定不会超过
,因此可以将搜索范围设为 0 到 。 答案小于等于
的证明如下:不失一般性,设 。设 , 的最大公约数为 , , ( , , 是整数)。则有 当
时,在问题的限制下有 , ,因此有 因此,在问题的限制下,在
以下一定至少有 个符合条件的数,特别地也就至少有 个符合条件的数。实际上,对于当前限制,上限为 , , 时,答案为 。 具体来说,可以首先设定
,然后只要 ,就重复以下步骤:
- 设
。 - 判断
,如果成立,则设 ,否则设 。 最终得到的
就是答案。 在固定
时,判断 的复杂度为 ,而重复的次数最多也只有 次,因此非常高效。因此,这个问题可以用二分搜索很好地解决。
E - Alternating String
A string consisting of 0 and 1 is called a good string if two consecutive characters in the string are always different.
给你一个长度为 0
和 1
组成。将给出
查询有两种类型:
1 L R
:s[l-r] ^= 1
2 L R
:print(isGood(s[l-r]))
Solution
线段树
(待更