【BZOJ 3050】【USACO2013 Jan】Seating 线段树
线段树维护4个标记,
昨天互测时题意理解错了,今天上午才发现。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 500003
using namespace std;
int sum[N*3], n, m, ans = 0, lazy[N*3],left[N*3],right[N*3],whole[N*3];
inline void buildtree(int l, int r, int rt) {
sum[rt] = 0;
lazy[rt] = 0;
left[rt] = r - l + 1;
right[rt] = r - l + 1;
whole[rt] = r - l + 1;
if (l == r)
return;
int mid = (l + r) >> 1;
buildtree(l, mid, rt << 1);
buildtree(mid + 1, r, rt << 1 | 1);
}
inline void pushdown(int l, int r, int rt) {
if (lazy[rt] != 0) {
if (lazy[rt] == 1) {
lazy[rt] = 0;
lazy[rt << 1] = 1;
lazy[rt << 1 | 1] = 1;
int mid = (l + r) >> 1;
sum[rt << 1] = mid - l + 1;
left[rt << 1] = 0;
right[rt << 1] = 0;
whole[rt << 1] = 0;
sum[rt << 1 | 1] = r - mid;
left[rt << 1 | 1] = 0;
right[rt << 1 | 1] = 0;
whole[rt << 1 | 1] = 0;
} else {
lazy[rt] = 0;
lazy[rt << 1] = -1;
lazy[rt << 1 | 1] = -1;
int mid = (l + r) >> 1;
sum[rt << 1] = 0;
left[rt << 1] = mid - l + 1;
right[rt << 1] = mid - l + 1;
whole[rt << 1] = mid - l + 1;
sum[rt << 1 | 1] = 0;
left[rt << 1 | 1] = r - mid;
right[rt << 1 | 1] = r - mid;
whole[rt << 1 | 1] = r - mid;
}
}
}
inline void pushup(int rt){
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
left[rt] = sum[rt << 1] == 0 ? whole[rt << 1] + left[rt << 1 | 1] : left[rt << 1];
right[rt] = sum[rt << 1 | 1] == 0 ? whole[rt << 1 | 1] + right[rt << 1] : right[rt << 1 | 1];
whole[rt] = max(whole[rt << 1], whole[rt << 1 | 1]);
whole[rt] = max(whole[rt], right[rt << 1] + left[rt << 1 | 1]);
}
inline void clr(int L, int R, int l, int r, int rt) {
if (L <= l && r <= R) {
sum[rt] = 0;
left[rt] = r - l + 1;
right[rt] = r - l + 1;
whole[rt] = r - l + 1;
lazy[rt] = -1;
return;
}
pushdown(l, r, rt);
int mid = (l + r) >> 1;
if (L <= mid)
clr(L, R, l, mid, rt << 1);
if (R > mid)
clr(L, R, mid + 1, r, rt << 1 | 1);
pushup(rt);
}
inline void put(int L, int R, int l, int r, int rt) {
if (L <=l && r <= R) {
sum[rt] = r - l + 1;
left[rt] = 0;
right[rt] = 0;
whole[rt] = 0;
lazy[rt] = 1;
return;
}
pushdown(l, r, rt);
int mid = (l + r) >> 1;
if (L <= mid)
put(L, R, l, mid, rt << 1);
if (R > mid)
put(L, R, mid + 1, r, rt << 1 | 1);
pushup(rt);
}
inline void add(int num, int l, int r, int rt) {
if (l == r) {
put(l, r, 1, n, 1);
return;
}
int mid = (l + r) >> 1;
if (whole[rt << 1] >= num)
add(num, l, mid, rt << 1);
else
if (right[rt << 1] + left[rt << 1 | 1] >= num)
put(mid + 1 - right[rt << 1], mid - right[rt << 1] + num, 1, n, 1);
else
add(num, mid + 1, r, rt << 1 | 1);
}
int main() {
scanf("%d%d\n", &n, &m);
buildtree(1, n, 1);
char c;
int a, b;
while (m--) {
for(c = getchar(); c != 'A' && c != 'L'; c = getchar());
if (c == 'A') {
scanf("%d\n", &a);
if (whole[1] < a)
++ans;
else
add(a, 1, n, 1);
} else {
scanf("%d%d\n", &a, &b);
clr(a, b, 1, n, 1);
}
}
printf("%d\n",ans);
return 0;
}
4个标记维护区间内奶牛个数,左端最长连续空位,右端最长连续空位,区间内最长连续空位,然后就没了。
【BZOJ 3050】【USACO2013 Jan】Seating 线段树的更多相关文章
- [bzoj 3048] [Usaco2013 Jan]Cow Lineup
[bzoj 3048] [Usaco2013 Jan]Cow Lineup Description 给你一个长度为n(1<=n<=100,000)的自然数数列,其中每一个数都小于等于10亿 ...
- [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并)
[BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并) 题面 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1 ...
- [BZOJ 2653] middle(可持久化线段树+二分答案)
[BZOJ 2653] middle(可持久化线段树+二分答案) 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序 ...
- bzoj 1537: [POI2005]Aut- The Bus 线段树
bzoj 1537: [POI2005]Aut- The Bus 先把坐标离散化 设f[i][j]表示从(1,1)走到(i,j)的最优解 这样直接dp::: f[i][j] = max{f[i-1][ ...
- [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】
题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...
- BZOJ.5286.[AHOI/HNOI2018]转盘(线段树)
BZOJ LOJ 洛谷 如果从\(1\)开始,把每个时间\(t_i\)减去\(i\),答案取决于\(\max\{t_i-i\}\).记取得最大值的位置是\(p\),答案是\(t_p+1+n-1-p=\ ...
- BZOJ.4399.魔法少女LJJ(线段树合并)
BZOJ 注意\(c\leq7\)→_→ 然后就是裸的权值线段树+线段树合并了. 对于取\(\max/\min\)操作可以直接区间修改清空超出范围的值,然后更新到对应位置上就行了(比如对\(v\)取\ ...
- BZOJ.5461.[PKUWC2018]Minimax(DP 线段树合并)
BZOJ LOJ 令\(f[i][j]\)表示以\(i\)为根的子树,权值\(j\)作为根节点的概率. 设\(i\)的两棵子树分别为\(x,y\),记\(p_a\)表示\(f[x][a]\),\(p_ ...
- BZOJ 1835 [ZJOI2010]基站选址 (线段树优化DP)
题目大意:略 洛谷题面传送门 BZOJ题面传送门 注意题目的描述,是村庄在一个范围内去覆盖基站,而不是基站覆盖村庄,别理解错了 定义$f[i][k]$表示只考虑前i个村庄,一共建了$k$个基站,最后一 ...
随机推荐
- 怎样用ZBrush中的shadowbox创建物体
ZBrush一直以方便著称业内各领域,模型师不需要在多个软件中编辑塑造模型,而在ZBrush用shadowbox创建物体的流程,在Tool面板上的Geometry子面板中,4.0版本引入了shadow ...
- Ajax与jQuery、json
一.Ajax简介 Ajax(Asynchronous JavaScript and Xml)--异步刷新技术 Ajax的关键元素包括以下内容: ① JavaScript语言:Ajax技术的主要开发语言 ...
- [No000028]Python的使用之禅及程序员应该明白的一些道理
最近疯狂的学习ruby和python着两门语言,看到书本上一些比较赞同的段子,摘抄并翻译如下: Python的使用之禅 Beautiful is better than ugly. 美丽好过丑陋Exp ...
- java 24 - 4 GUI之创建数据转移窗口
需求: 把文本框中的数据,通过点击按钮,转移到文本域中. 同时清空文本框中的数据 代码:(步骤都注释了) public class FrameDemo4 { public static void m ...
- 收集入侵Windows系统的证据
随着网络的不断扩大,网络安全更加会成为人们的一个焦点,同时也成为是否能进一步投入到更深更广领域的一个基石.当然网络的安全也是一个动态的概念,世界上没有绝对安全的网络,只有相对安全的网络.相对安全环境的 ...
- 字典转换成NSString(NSJson)
//字典转换成字符串 NSDictionary *dict = [NSMutableDictionary dictionary]; NSData *data = [NSJSONSerializatio ...
- 005商城项目:ssm框架的整合成功之后的问题:使用maven的tomcat插件时的debug
在执行maven的clean时经常碰到一个问题: 解决: 然后: 还有一个问题是:用maven 使用Debug调试时,不能看到源代码. 解决办法: 下面选择Debug Configurations 这 ...
- C#.NET 大型通用信息化系统集成快速开发平台 4.0 版本 - 导入导出Microsoft Excel 2010的例子
1:能支持多种Excel版本,早期的.现在的版本都支持.2:能导入.3:能导出.4:有简单的例子可以参考.
- Kafka是分布式发布-订阅消息系统
Kafka是分布式发布-订阅消息系统 https://www.biaodianfu.com/kafka.html Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apa ...
- ssh生成key不交互
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P "" 首次执行不交互 第二次再次执行会让输入y