线段树维护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. 扩展欧几里德算法 cogs.tk 2057. [ZLXOI2015]殉国

    2057. [ZLXOI2015]殉国 ★☆   输入文件:BlackHawk.in   输出文件:BlackHawk.out   评测插件时间限制:0.05 s   内存限制:256 MB [题目描 ...

  2. 123——Appium Girls活动

    有感于Ruby Girls和Python Girls,在15年就想组织一次移动测试的妹子活动,框架选择Appium, 从15年夏天开始准备,申请Google的会议室,招募教练,开放报名,审核报名,到正 ...

  3. SilverFoxServer出炉!!

    SilverFoxServer是啥?各位看官搜一下SmartFoxServer便知 是一套服务端+客户端通迅框架,快速搭建起回合制,棋牌类的联机 网页游戏 SilverFoxServer的特点包括 用 ...

  4. jmeter的压力测试

    Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试. 以下为压力测试的简单介绍 1.在测试计划下增加一个线程组 2.线程组的内容需要进行编辑,根据压力测 ...

  5. 怎样关闭WIN7系统的自动更新

    百度经验 > 游戏/数码 > 电脑 > 电脑软件 怎样关闭WIN7系统的自动更新 听语音 | 浏览:108460 | 更新:2012-07-24 18:03 | 标签:win7 1 ...

  6. 嵌入式Linux驱动学习之路(二)u-boot体验

    u-boot工程简介 现在的u-boot支持PowerPC.ARM.X86.MIPS体系结构的上百种开发板,已经称为功能最多.灵活性最强,并且开发最积极的开源Bootloader.目前由DENX的Wo ...

  7. [No00005D]如何高效利用GitHub

    原文地址:http://www.yangzhiping.com/tech/github.html 正是Github,让社会化编程成为现实.本文尝试谈谈GitHub的文化.技巧与影响. Q1:GitHu ...

  8. jQuery学习之jQuery Ajax用法详解

    jQuery Ajax在web应用开发中很常用,它主要包括有ajax,get,post,load,getscript等等这几种常用无刷新操作方法,下面我来给各位同学介绍介绍. 我们先从最简单的方法看起 ...

  9. C# 文件下载四方法

    using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...

  10. addClass, removeClass, toggleClass(从jquery中抠出来)

    <div id="d3" class="cur"></div> var mylibs = (function(){ var rtrim ...