[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 ...
随机推荐
- JMeter中的正则表达式的匹配
==
- selenium.common.exceptions.WebDriverException: Message: unknown Error: cannot find Chrome binary
使用Chrome浏览器时,经常会遇到以下报错:浏览器没有调用起来 selenium.common.exceptions.WebDriverException: Message: unknown Err ...
- Spring框架第二天
## Spring框架第二天 ## ---------- **课程回顾:Spring框架第一天** 1. 概述 * IOC和AOP 2. 框架的IOC的入门 * 创建applicationContex ...
- #WEB安全基础 : HTTP协议 | 0x1 TCP/IP通信
TCP/IP是如何通信的呢? 请看图 用TCP/IP协议族通信时,会通过分层顺序与对方进行通信.发送端从应用层往下走,接受层从链路层往上走. 客户端为了浏览界面在应用层发送请求,为了方便传输在传输层的 ...
- 第五章 JS典型特效
注意: 1.JS在HTML中从上到下依次执行,所以获取元素的结果与JS的位置有关 <!DOCTYPE html> <html> <head> <title&g ...
- mysql数据据备份与还原
http://www.cnblogs.com/kissdodog/p/4174421.html备份:mysqldump -u username -p dbname > BackupName.sq ...
- linux下git服务器安装
git服务器配置http://www.cnblogs.com/dee0912/p/5815267.html git教程https://www.liaoxuefeng.com/wiki/00137395 ...
- TCP/IP协议详解内容总结(怒喷一口老血)
TCP/IP协议(本文源自外部链接) TCP/IP不是一个协议,而是一个协议族的统称.里面包括IP协议.IMCP协议.TCP协议. 这里有几个需要注意的知识点: 互联网地址:也就是IP地址,一般为网络 ...
- 常用分布随机数生成及JS类函数开发和运用
(2017-02-15 银河统计) 随机数生成是运用蒙特卡洛或统计随机模拟仿真方法的前提.本文在银河统计Web Service接口基础上,编制JS类函数生成常用分布随机数,为在网页中实现模拟仿真项目提 ...
- 一文理解 Java NIO 核心组件
同步.异步.阻塞.非阻塞 首先,这几个概念非常容易搞混淆,但NIO中又有涉及,所以总结一下[1]. 同步:API调用返回时调用者就知道操作的结果如何了(实际读取/写入了多少字节). 异步:相对于同步, ...