[luogu P2205] [USACO13JAN]画栅栏Painting the Fence
[luogu P2205] [USACO13JAN]画栅栏Painting the Fence
题目描述
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)
输入输出样例
说明
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:如果有翻译的问题或题目的不理解,可以在问答后面留言的说。
这道题很早就写过,当时用离散+差分就水过去了。
今天心血来潮写了一颗链表指针版的线段树。。
这真是个好东西。。
还有usaco竟然可以载数据,很妙啊。。
哦还有就是,今天终于会用unique,lower_bound和upper_bound了。
code:
%:pragma GCC optimize()
#include<bits/stdc++.h>
using namespace std;
;
int n,k,las,cnt,ans,b[N]; char ch;
struct line {int x,y;}a[N];
class node {
private:
int v,t; node *l,*r;
public:
#define m ((l)+(r)>>1)
node() {l=r=,v=t=;}
inline void pushup(node* cu) {
cu->v=;
) cu->v+=cu->l->v;
) cu->v+=cu->r->v;
}
inline void pushdown(node *cu) {
) cu->l->t+=cu->t,cu->l->v+=cu->t;
) cu->r->t+=cu->t,cu->r->v+=cu->t;
cu->t=;
}
inline void setup(node* &cu,int l,int r) {
cu=new node;
==r) {cu->v=cu->t=; return;}
setup(cu->l,l,m),setup(cu->r,m,r);
pushup(cu);
}
inline void update(node* &cu,int l,int r,int aiml,int aimr) {
if (l>=aiml&&r<=aimr) {cu->v++,cu->t++; return;}
pushdown(cu);
if (aimr<=m) update(cu->l,l,m,aiml,aimr); else
if (aiml>=m) update(cu->r,m,r,aiml,aimr);
else update(cu->l,l,m,aiml,aimr),update(cu->r,m,r,aiml,aimr);
pushup(cu);
}
inline int answer(node* &cu,int l,int r,int x) {
==r) return cu->v;
pushdown(cu);
return x<m?answer(cu->l,l,m,x):answer(cu->r,m,r,x);
}
}t,*root;
inline int read() {
,f=; ch=getchar();
:,ch=getchar();
+ch-',ch=getchar();
return x*f;
}
int main() {
n=read(),k=read(),ans=las=,b[]=;
,x; i<=n; i++) {
x=read();
while (ch!='L'&&ch!='R') ch=getchar();
if (ch=='L') a[i].x=las-x,a[i].y=las,b[i]=las-x,las=a[i].x;
else a[i].x=las,a[i].y=las+x,b[i]=las+x,las=a[i].y;
}
sort(b,b++n);
cnt=unique(b,b++n)-b;
root=,t.setup(root,,cnt);
,l,r; i<=n; i++) {
l=a[i].x,r=a[i].y;
l=lower_bound(b,b+cnt,l)-b,l++;
r=lower_bound(b,b+cnt,r)-b,r++;
t.update(root,,cnt,l,r);
}
,s; i<cnt; i++)
s=t.answer(root,,cnt,i),ans+=(b[i]-b[i-])*(s>=k);
cout<<ans<<endl;
;
}
[luogu P2205] [USACO13JAN]画栅栏Painting the Fence的更多相关文章
- 洛谷——P2205 [USACO13JAN]画栅栏Painting the Fence
题目描述 Farmer John has devised a brilliant method to paint the long fence next to his barn (think of t ...
- 洛谷 P2205 [USACO13JAN]画栅栏Painting the Fence
传送门 题目大意: 开始站在原点,给出一系列操作 x L/R,表示向左或向右走几步. 最多会移动到离原点1,000,000,000单位远的地方. n次操作,n<=100000 问走过k次的地方有 ...
- 洛谷 画栅栏Painting the Fence 解题报告
P2205 画栅栏Painting the Fence 题目描述 \(Farmer\) \(John\) 想出了一个给牛棚旁的长围墙涂色的好方法.(为了简单起见,我们把围墙看做一维的数轴,每一个单位长 ...
- 洛谷 P2205 [USACO13JAN]画栅栏
这题其实没什么,但用到的算法都十分有用.做一个不恰当的比喻,这是一只必须用牛刀杀的鸡,但因为我这个蒟蒻杀不死牛,所以只能找只鸡来练练手. 题目描述 Farmer John 想出了一个给牛棚旁的长围墙涂 ...
- 洛谷 P3079 [USACO13MAR]农场的画Farm Painting
P3079 [USACO13MAR]农场的画Farm Painting 题目描述 After several harsh winters, Farmer John has decided it is ...
- Painting The Fence(贪心+优先队列)
Painting The Fence(贪心+优先队列) 题目大意:给 m 种数字,一共 n 个,从前往后填,相同的数字最多 k 个在一起,输出构造方案,没有则输出"-1". 解题思 ...
- [Swift]LeetCode587. 安装栅栏 | Erect the Fence
There are some trees, where each tree is represented by (x,y) coordinate in a two-dimensional garden ...
- 【luogu P2731 骑马修栅栏】 题解
题目链接:https://www.luogu.org/problemnew/show/P2731 这个题是欧拉回路的模板题,那么在这里给出一个hierholzer的做法. 对于求欧拉回路的问题,有Fl ...
- USACO 2013 January Silver Painting the Fence /// oj23695
题目大意: 输入n,k :n次操作 找到覆盖次数在k及以上的段的总长 一开始位置在0 左右活动范围为1-1000000000 接下来n行描述每次操作的步数和方向 Sample Input 6 22 R ...
随机推荐
- java之jedis使用
下载 依赖jar包下载 使用 # Redis settings redis.host=192.168.208.153 redis.port=6379 redis.pass=1234 redis.tim ...
- sap 软件架构
1:
- MATLAB变量
序言 在Matlab中,变量名由A~Z.a~z.数字和下划线组成,且变量的第一个字符必须是字母. 尽管变量名可以是任意长度, 但是Matlab只识别名称的前N=namelengthmax个字符, 这里 ...
- cocos2d JS-(JavaScript) 冒泡排序
思想: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复以上的步骤,除了最 ...
- Centos7 Firewall 防火墙配置应用实例参考(转)
时间:2016-06-02 02:40来源:linux.it.net.cn 作者:IT 简单的配置,参考学习:--permanent 当设定永久状态时 在命令开头或者结尾处加入此参数,否则重载或 ...
- android layout文件优化
性能优化1--UI优化 1.使用系统为我们提供了几个抽象的标签①include:重用include中layout属性指定一个外部布局文件,通过该方式则不需要把这个布局文件在该代码中重复的写一遍了. 若 ...
- 【Spark-core学习之九】 Spark案例
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...
- 【Spark-core学习之五】 RDD宽窄依赖 & Stage
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...
- Java并发——Fork/Join框架与ForkJoinPool
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/4631466. ...
- Ajax跨域请求COOKIE无法带上的解决办法
原生ajax请求方式: var xhr = new XMLHttpRequest(); xhr.open("POST", "http://xxxx.com/demo/b/ ...