洛谷 P3071 [USACO13JAN]座位Seating(线段树)
P3071 [USACO13JAN]座位Seating
思路:
一开始把题给读错了浪费了好多时间呜呜呜。
因为第二个撤离操作是区间修改,所以我们可以想到用线段树来做。对于第一个操作,我们只需要维护suml,sumr,sum分别表示当前结点左端连续有多少个空位、右端连续有多少个空位、以及最长连续空位为多少就行了。因为每次安排作为可能会跨过mid,所以我们还需要数组来维护一下信息。
注意一下代码的细节吧:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e5 + 5;
int n, m;
int c[N];
char s[2] ;
int sum[N << 2], lazy[N << 2], suml[N << 2], sumr[N << 2];
void build(int o, int l, int r) {
    sum[o] = suml[o] = sumr[o] = r - l + 1;
    if(l == r) return ;
    int mid = (r + l) >> 1;
    build(o << 1, l, mid);
    build(o << 1|1, mid + 1, r) ;
}
void pushdown(int o, int l, int r) {
    if(lazy[o] != 0) {
        int mid = (l + r) >> 1 ;
        suml[o << 1] = sumr[o << 1] = sum[o << 1] = (lazy[o] > 0) * (mid - l + 1);
        suml[o << 1|1] = sumr[o << 1|1] = sum[o << 1|1] = (lazy[o] > 0) * (r - mid);
        lazy[o << 1|1] = lazy[o << 1] = lazy[o] ;
        lazy[o] = 0;
    }
}
void push_up(int o, int l, int r) {
    int mid = (r + l) >> 1;
    sum[o] = max(max(sum[o << 1], sum[o << 1|1]), sumr[o << 1] + suml[o << 1|1]) ;
    suml[o] = suml[o << 1] + (suml[o << 1] == (mid - l + 1) ? suml[o << 1|1] : 0) ;
    sumr[o] = sumr[o << 1|1] + (sumr[o << 1|1] == (r - mid) ? sumr[o << 1] : 0) ;
}
void update(int o, int l, int r, int L, int R, int sign) {
    if(L <= l && r <= R) {
        lazy[o] = sign ;
        suml[o] = sumr[o] = sum[o] = (sign > 0) * (r - l + 1) ;
        return ;
    }
    pushdown(o, l, r) ;
    int mid = (l + r) >> 1;
    if(L <= mid) update(o << 1, l, mid, L, R, sign) ;
    if(R > mid) update(o << 1|1, mid + 1, r, L, R, sign) ;
    push_up(o, l, r) ;
}
int ask(int o, int l, int r, int x) {
    int mid = (l + r) >> 1;
    pushdown(o, l, r) ;
    if(sum[o << 1] >= x) return ask(o << 1, l, mid, x) ;
    else if(sumr[o << 1] + suml[o << 1|1] >= x) return mid - sumr[o << 1] + 1;
    else return ask(o << 1|1, mid + 1,r ,x);
}
int main() {
    cin >> n >> m;
    int ans = 0;
    build(1, 1, n) ;
    for(int i = 1, a, b; i <= m; i++) {
        scanf("%s", s);
        if(s[0] == 'A') {
            scanf("%d", &a);
            if(sum[1] < a) ans++;
            else {
                int pos = ask(1, 1, n, a) ;
                update(1, 1, n, pos, pos + a -1, -1) ;
            }
        } else {
            scanf("%d%d", &a, &b);
            update(1, 1, n, a, b, 1) ;
        }
    }
    cout << ans;
    return 0;
}
洛谷 P3071 [USACO13JAN]座位Seating(线段树)的更多相关文章
- 洛谷 P3071 [USACO13JAN]座位Seating-线段树区间合并(判断找,只需要最大前缀和最大后缀)+分治+贪心
		P3071 [USACO13JAN]座位Seating 题目描述 To earn some extra money, the cows have opened a restaurant in thei ... 
- 洛谷 P3373 【模板】线段树 2
		洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ... 
- 洛谷P3372 【模板】线段树 1
		P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交 讨论 题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷 ... 
- 洛谷P4891 序列(势能线段树)
		洛谷题目传送门 闲话 考场上一眼看出这是个毒瘤线段树准备杠题,发现实在太难调了,被各路神犇虐哭qwq 考后看到各种优雅的暴力AC......宝宝心里苦qwq 思路分析 题面里面是一堆乱七八糟的限制和性 ... 
- 洛谷 P2574 XOR的艺术(线段树 区间异或 区间求和)
		To 洛谷.2574 XOR的艺术 题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的 ... 
- 洛谷P4344 脑洞治疗仪 [SHOI2015] 线段树+二分答案/分块
		!!!一道巨恶心的数据结构题,做完当场爆炸:) 首先,如果你用位运算的时候不小心<<打成>>了,你就可以像我一样陷入疯狂的死循环改半个小时 然后,如果你改出来之后忘记把陷入死循 ... 
- Bzoj5294/洛谷P4428 [Bjoi2018]二进制(线段树)
		题面 Bzoj 洛谷 题解 考虑一个什么样的区间满足重组之后可以变成\(3\)的倍数.不妨设\(tot\)为一个区间内\(1\)的个数.如果\(tot\)是个偶数,则这个区间一定是\(3\)的倍数,接 ... 
- 【题解】洛谷P1198 [JSOI2008] 最大数(线段树)
		洛谷P1198:https://www.luogu.org/problemnew/show/P1198 思路 一道水水的线段树 20分钟A掉 这道题只涉及到单点修改和区间查询 所以这道题甚至不用Laz ... 
- bzoj3064/洛谷P4314 CPU监控【线段树】
		好,长草博客被催更了[?] 我感觉这题完全可以当作线段树3 线段树2考加法和乘法标记的下放顺序,这道题更丧心病狂[?] 很多人可能跟我一样,刚看到这道题秒出思路:打一个当前最大值一个历史最大值不就完事 ... 
随机推荐
- dockerfile 的问题 FROM alpine:3.8 temporary error (try again later)
			FROM alpine:3.8 apk add xxx安装软件 fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX ... 
- JS面向对象的类 实例化与继承
			JS中 类的声明有两种形式: // 类的声明 function Animal() { this.name = 'name' } // ES6中的class声明 class Animal2 { cons ... 
- secondNameNode作用
			在Hadoop中,有一些命名不好的模块,Secondary NameNode是其中之一.从它的名字上看,它给人的感觉就像是NameNode的备份.但它实际上却不是.很多Hadoop的初学者都很疑惑,S ... 
- Sitecore客户体验成熟度模型之旅
			“成熟”这个词带来了很多想法:你在青年时不愿意找到工作?你四岁的孩子偶尔发脾气?可能还有你的公司能否在数字化时代提供个性化的客户体验? 你如何定义CX成熟度?如果您的CX战略仍处于开发阶段,您需要达到 ... 
- SAP: Smartform中存在渐变色图片的上传失真问题的解决
			下载GIMP编辑软件,导入图像选择Image->Mode->Indexed 设置Color dithering然后通过File->Export as导出bmp文件.如果上传后不好用请 ... 
- Java学习:面向对象的三大特征:封装性、继承性、多态性之继承性
			面向对象的三大特征:封装性.继承性.多态性. 继承 继承是多态的前提 ,如果没有继承,就没有多态. 继承主要解决的问题就是:共性抽取. 继承关系当中的特点: 子类可以拥有父类的“内容” 子类还可以拥有 ... 
- SqlServer 2012 清理日志 截断日志的方法
			ALTER DATABASE test SET RECOVERY SIMPLE WITH NO_WAITALTER DATABASE test SET RECOVERY SIMPLE --简单模式DB ... 
- 【leetcode-49】字母异位词分组
			给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", "tan&quo ... 
- 彻底搞懂Javascript的this
			在Javascript中,最玄妙的特性之一,就是this的指向玄幻莫测,一会儿指向这一会儿指向那,让初学者十分伤脑筋. 本文总结一下,方便初学者掌握奥妙之处,同时方便老鸟温故而知新. 首先,看一段代码 ... 
- Echarts 学习系列(2)-常见的静态ECharts图
			目录 写在前面 折线(面积)图 1.折线图 2.堆叠折线图 3.堆积面积图 柱状(条形)图 1.柱状图 2.条形图 3.堆积条形图 饼(圆环)图 1.饼图 2.环形图 3.南丁格尔图 写在前面 上一小 ... 
