线段树维护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 线段树的更多相关文章

  1. [bzoj 3048] [Usaco2013 Jan]Cow Lineup

    [bzoj 3048] [Usaco2013 Jan]Cow Lineup Description 给你一个长度为n(1<=n<=100,000)的自然数数列,其中每一个数都小于等于10亿 ...

  2. [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并)

    [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并) 题面 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1 ...

  3. [BZOJ 2653] middle(可持久化线段树+二分答案)

    [BZOJ 2653] middle(可持久化线段树+二分答案) 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序 ...

  4. 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][ ...

  5. [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】

    题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...

  6. BZOJ.5286.[AHOI/HNOI2018]转盘(线段树)

    BZOJ LOJ 洛谷 如果从\(1\)开始,把每个时间\(t_i\)减去\(i\),答案取决于\(\max\{t_i-i\}\).记取得最大值的位置是\(p\),答案是\(t_p+1+n-1-p=\ ...

  7. BZOJ.4399.魔法少女LJJ(线段树合并)

    BZOJ 注意\(c\leq7\)→_→ 然后就是裸的权值线段树+线段树合并了. 对于取\(\max/\min\)操作可以直接区间修改清空超出范围的值,然后更新到对应位置上就行了(比如对\(v\)取\ ...

  8. BZOJ.5461.[PKUWC2018]Minimax(DP 线段树合并)

    BZOJ LOJ 令\(f[i][j]\)表示以\(i\)为根的子树,权值\(j\)作为根节点的概率. 设\(i\)的两棵子树分别为\(x,y\),记\(p_a\)表示\(f[x][a]\),\(p_ ...

  9. BZOJ 1835 [ZJOI2010]基站选址 (线段树优化DP)

    题目大意:略 洛谷题面传送门 BZOJ题面传送门 注意题目的描述,是村庄在一个范围内去覆盖基站,而不是基站覆盖村庄,别理解错了 定义$f[i][k]$表示只考虑前i个村庄,一共建了$k$个基站,最后一 ...

随机推荐

  1. BZOJ2118墨墨的等式[数论 最短路建模]

    2118: 墨墨的等式 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1317  Solved: 504[Submit][Status][Discus ...

  2. 代码覆盖率工具 EMMA

    使用 EMMA 获得功能测试覆盖率 测试覆盖率是评价测试完整性的重要的度量标准之一. EMMA 是一个面向 Java 代码的测试覆盖率收集工具.在测试过程中,使用 EMMA 能使收集和报告测试覆盖率的 ...

  3. NODE.JS开发指南学习笔记

    1.Node.js是什么 Node.js是一个让JS运行在服务器端的开发平台,它可以作为服务器向用户提供服务.Node.js中的javascript只是Core javascript,或者说是ECMA ...

  4. javascript按回车键触发事件

    <form id="search-form" > <input type="text" onkeypress="getKey();r ...

  5. Objective-C 命名规范

    http://www.tuicool.com/articles/ERvUbmR 1. 如果方法的返回值是新创建的,那么方法名的首个词应是返回值类型,除非前面还有修饰语如 localizedString ...

  6. 在表单中元素的onchange事件的兼容性问题

    onchange:在值发生改变的时候触发 text:当光标离开的时候如果内容有变化就触发 radio/check:标准浏览器下点击的时候只要值变了就触发 非标准浏览器下焦点离开的时候如果值变了就触发

  7. BZOJ 1208: [HNOI2004]宠物收养所

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7514  Solved: 2982[Submit][Sta ...

  8. 在 C# App 中嵌入 Chrome 浏览器使用 CefSharp

    介绍 以前曾试过在app中整合一个可靠又快速的web浏览器吗? 在本文中,你会学到如何轻松地将奇妙的CefSharp网页浏览器组件(基于Chromium)集成到你的C# app中. 然后,你可以使用此 ...

  9. noi题库(noi.openjudge.cn) 1.8编程基础之多维数组T21——T25

    T21 二维数组右上左下遍历 描述 给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺序遍历整个数组. 输入 输入的第一行上有两个整数,依次为 ...

  10. struts2和spring3.2的整合 详细演示

    1.首先我们新建一个Web工程,如下: 2.导入Spring和Struts2的jar包. 其中,struts2-spring-plugin-2.1.8.jar是struts2.spring整合的关键. ...