题目描述
Farmer John has devised a brilliant method to paint the long fence next to his barn (think of the fence as a one-dimensional number line). He simply attaches a paint brush to his favorite cow Bessie, and then retires to drink a cold glass of water as Bessie walks back and forth across the fence, applying paint to any segment of the fence that she walks past.
Bessie starts at position 0 on the fence and follows a sequence of N moves (1 <= N <= 100,000). Example moves might be “10 L”, meaning Bessie moves 10 units to the left, or “15 R”, meaning Bessie moves 15 units to the right. Given a list of all of Bessie’s moves, FJ would like to know what area of the fence gets painted with at least K coats of paint. Bessie will move at most 1,000,000,000 units away from the origin during her walk.
Farmer John 想出了一个给牛棚旁的长围墙涂色的好方法。(为了简单起见,我们把围墙看做一维的数轴,每一个单位长度代表一块栅栏)他只是简单的把刷子蘸满颜料,系在他最喜欢的奶牛Bessie上,然后让Bessie来回地经过围墙,自己则在一旁喝一杯冰镇的凉水。(……-_-|||) Bessie 经过的所有围墙都会被涂上一层颜料。Bessie从围墙上的位置0出发,并将会进行N次移动(1 <= N <= 100,000)。比如说,“10 L”的意思就是Bessie向左移动了10个单位。再比如说“15 R”的意思就是Bessie向右移动了15个单位。给出一系列Bessie移动的清单。FJ 想知道有多少块栅栏涂上了至少K层涂料。注意:Bessie最多会移动到离原点1,000,000,000单位远的地方。
输入格式:
- 第1行: 两个整数: N K
- 第2…N+1 行: 每一行都描述了Bessie的一次移动。 (比如说 “15 L”)
输出格式:
- 一个整数:被至少涂上K层涂料的栅栏数
(注意:输出的最后一定要输出换行符!否则会WA)
输入样例#1:
6 2 2 R 6 L 1 R 8 L 1 R 2 R
输出样例#1:
6
说明
PS1:来源:usaco jan silver P01 想看原题的请戳http://www.usaco.org/index.php?page=viewproblem2&cpid=226)
PS2:测试数据也可以在在http://www.usaco.org/index.php?page=jan13problems上下载,还可以看到题解(不过是英文的:-D)
PS3:如果有翻译的问题或题目的不理解,可以在问答后面留言的说。
题解:
类似离散化的处理,然后求一遍前缀和,大于等于k的就说明可以为答案做出贡献。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int len[300050];
map <int, int> qer;
int main()
{
int n, k, st = 0, ans = 0, tot = 1;
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
char a;
int sss;
scanf("%d", &sss);
a = getchar();
while (a != 'L' && a != 'R')
a = getchar();
if (a == 'L')
{
len[tot] = st - sss;
qer[len[tot++]]++;
len[tot] = st;
qer[len[tot++]]--;
st -= sss;
}
else
{
len[tot] = st;
qer[len[tot++]]++;
len[tot] = st + sss;
qer[len[tot++]]--;
st += sss;
}
}
sort(len + 1, len + tot + 1);
st = qer[len[1]];
for (int i = 2; i <= tot; i++)
{
if (len[i] != len[i-1])
{
if (st >= k)
ans += len[i] - len[i-1];
st += qer[len[i]];
}
}
cout << ans;
return 0;
}