AtCoder Beginner Contest 379 A~F
A - Cyclic
洛谷链接
AtCoder链接
题目
给你一个三位整数
设
代码
#include <bits/stdc++.h>
using namespace std;
string s;
int main()
{
cin >> s;
cout << s[1] << s[2] << s[0] << ' ' << s[2] << s[0] << s[1] << '\n';
return 0;
}
B - Strawberries
洛谷链接
AtCoder链接
题目
高桥有
如果 O,表示左边第 X,则表示第
当他有
求他最多可以吃多少颗草莓。
思路
统计连续 O 出现了多少次,就是答案。
代码
#include <bits/stdc++.h>
using namespace std;
int n, k, cnt, ans;
char c;
int main()
{
scanf("%d %d", &n, &k);
for (int i = 0; i < n; i ++ )
{
cin >> c;
if (c == 'O')
cnt ++;
else
cnt = 0;
if (cnt == k)
{
ans ++;
cnt = 0;
}
}
cout << ans << '\n';
return 0;
}
C - Sowing Stones
洛谷链接
AtCoder链接
题目
在一行中有
您可以执行以下任意次数(可能为零)的操作:
- 如果单元格
i(1 \le i \le N-1) 包含一个棋子,则将一个棋子从i 格移动到i+1 格。
求达到每个
思路
由于只能往后放,显而易见,如果可以达到要求,那么一定只有一种方式。所以重心就在判断是否可行上了。
首先,如果总数量不等于
其次,如果第一堆不在
最后,如果到了某个点的时候石头总和不够
那么在统计答案的时候,我们要把从这一个“石头根据地”到下一个“石头根据地”中间的都用当前这个上的石头填满,剩下的移动到下一个“石头根据地”上,因为是正好的,所以如果用不完肯定是后面缺,留以后用,再者如果不移动到后面放着也没用。
小
一定要排序。
代码
#include <bits/stdc++.h>
using namespace std;
long long n, m, qzh, ans, gs;
struct nd
{
long long x, a;
} y[200010];
bool cmp(nd l, nd r)
{
return l.x < r.x;
}
int main()
{
scanf("%lld %lld", &n, &m);
for (long long i = 1; i <= m; i ++ )
scanf("%lld", &y[i].x);
for (long long i = 1; i <= m; ++ i)
{
scanf("%lld", &y[i].a);
qzh = qzh + y[i].a;
}
sort(y + 1, y + 1 + m, cmp);
y[m + 1].x = n + 1;
if (qzh != n || y[1].x != 1)
goto it;
for (long long i = 1; i <= m; i ++ )
{
gs = y[i + 1].x - 1 - y[i].x;
ans += (1 + gs) * gs / 2;
gs = y[i].a - gs - 1;
if (gs < 0)
goto it;
ans += gs * (y[i + 1].x - y[i].x);
y[i + 1].a += gs;
}
cout << ans << '\n';
return 0;
it:
puts("-1");
return 0;
}
D - Home Garden
洛谷链接
AtCoder链接
题目
高桥有
有
查询有以下三种类型。
1:准备一个空花盆,并在其中放入一株植物。这里,植物的高度是0 。2 T:等待T 天。在此期间,现有植物的高度会增加T 。3 H:收获所有高度至少达到H 的植株,并输出收获植株的数量。收获的植物会从花盆中移出。
假设执行第一类和第三类查询所需的时间为零。
思路
其实
对于每一个花瓶,我们记录是在哪一个时刻种上的并用小根堆维护种上的时刻并记录当前时间即可做这三种操作。
第一种操作:新增一个时刻。
第二种操作:时间戳增加。
第三种操作:因为是小根堆,所以可以取出时间最小的(但由于一定是按时间顺序加入的,所以其实数组也行),判断一下时间最小的是否够了高度,即和当前时间的差是否大于要求高度,如果符合,收获这个,弹出,再找最小的。
代码
#include <bits/stdc++.h>
using namespace std;
long long q, t, op, x, g, ans, w;
priority_queue<long long, vector<long long>, greater<long long> > h;
int main()
{
scanf("%lld", &q);
while (q -- )
{
scanf("%lld", &op);
if (op == 1)
h.push(t);
else if (op == 2)
{
scanf("%lld", &x);
t += x;
}
else if (op == 3)
{
scanf("%lld", &x);
g = t - x;
ans = 0;
while (!h.empty())
{
w = h.top();
if (w <= g)
{
h.pop();
ans ++;
}
else
break;
}
cout << ans << '\n';
}
}
return 0;
}
E - Sum of All Substrings
洛谷链接
AtCoder链接
题目
给你一个长度为 1 到 9 的数字组成。
对于每一对整数
思路
首先自己列一个样例看一下。
25374
2
25
253
2537
25374
5
53
537
5374
3
37
374
7
74
4
自己手动对齐一下
那我们发现:
规律就显而易见了,但不是很好描述,所以就不描述了。
那么结果就是
如果我们把每一项的系数(那个不是
看似不是很有用的样子,但是,这道题要用高精度,那么这个东西就很有用了,我们拿一个数组存一下“每一位”,在进位即可,存每一位的时候可以从高到低,这样每次加一个
代码
#include <bits/stdc++.h>
using namespace std;
int n;
char s[200010];
long long q, x[3000010], cn;
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i ++ )
cin >> s[i];
for (int i = 1; i <= n; i ++ )
q += (s[i] - '0') * i;
for (int i = n; i >= 1; i -- )
{
x[++ cn] = q;
x[cn] += x[cn - 1] / 10;
x[cn - 1] %= 10;
q -= (s[i] - '0') * i;
}
while (x[cn] >= 10)
{
cn ++;
x[cn] += x[cn - 1] / 10;
x[cn - 1] %= 10;
}
for (int i = cn; i >= 1; i -- )
cout << x[i];
return 0;
}
F - Buildings 2
洛谷链接
AtCoder链接
题目
有
对于一对整数
- 在建筑物
i 和j 之间,没有比建筑物j 更高的建筑物。换句话说,不存在整数k\ (i < k < j) ,即H_k>H_j 。
给你提供了
思路
首先我们观察一下,如果一个在
先不看后一个条件怎么做?离线,把每一个
首先明确一个事,在栈里的一定是单调的,因为从后往前有顺序的加(栈里存的是下标)。
再考虑第二个条件,我们说了,栈是单调的,所以我们可以二分一下下标大于
在每一个
代码
#include <bits/stdc++.h>
using namespace std;
int n, q, l, r, h[200010], st[200010], tp, ans[200010];
vector<pair<int, int> > ques[200010];
int ef(int x)
{
int l = 0, r = tp;
while (l < r)
{
int mid = (l + r + 1) / 2;
if (st[mid] > x)
l = mid;
else
r = mid - 1;
}
return l;
}
int main()
{
scanf("%d %d", &n, &q);
for (int i = 1; i <= n; i ++ )
scanf("%d", &h[i]);
for (int i = 1; i <= q; i ++ )
{
scanf("%d %d", &l, &r);
ques[l].push_back({r, i});
}
for (int i = n; i >= 1; i -- )
{
if (ques[i].size())
{
for(int j = 0; j < ques[i].size(); ++ j)
ans[ques[i][j].second] = ef(ques[i][j].first);
}
while (tp && h[st[tp]] <= h[i])
tp --;
st[++ tp] = i;
}
for (int i = 1; i <= q; i ++ )
cout << ans[i] << '\n';
return 0;
}