洛谷 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考加法和乘法标记的下放顺序,这道题更丧心病狂[?] 很多人可能跟我一样,刚看到这道题秒出思路:打一个当前最大值一个历史最大值不就完事 ...
随机推荐
- vue package-lock.json
npm5之后安装文件之后会多出一个package-lock.json的文件,它的作用是: 1. 安装之后锁定包的版本,手动更改package.json文件安装将不会更新包,想要更新只能使用 npm i ...
- WebUploader 被 FormData 函数坑了,用了他的页面千万别定FormData变量
WebUploader 被 FormData 函数坑了,用了他的页面千万别定FormData变量 被这个坑了,页面中变量var FormData=null;后又为他赋了值,所有一直上传不了,也没有错 ...
- java的sha1加密,转化为python版本
java的加密方法如下: public class EncryptUtil { /** 16进制 : 16 */ private static final int HEX = 16; /** SHA: ...
- 【Activiti学习之七】BPMN子流程、顺序流、流程关口
环境 JDK 1.8 MySQL 5.6 Tomcat 7 Eclipse-Luna activiti 6.0 一.子流程 1.嵌入子流程2.调用子流程3.事件子流程4.事务子流程 二.顺序流1.条件 ...
- 用简单的JS代码制作计算器
代码+注释一共不到200行,是练习交流的必备良药 主界面如下: 操作示意图: 以下是代码部分 HTML: <div> <table class="window"& ...
- 《Linux就该这么学》培训笔记_ch03_管道符、重定向与环境变量
<Linux就该这么学>培训笔记_ch03_管道符.重定向与环境变量 文章最后会post上书本的笔记照片. 文章主要内容: 输入输出重定向 管道命令符 命令行的通配符 常用的转义字符 重要 ...
- Maven 教程(11)— Maven远程仓库的各种配置
原文地址:https://blog.csdn.net/liupeifeng3514/article/details/79545408 1.远程仓库的配置 在平时的开发中,我们往往不会使用默认的中央仓库 ...
- python 'utf-8' codec can't decode byte 0xb8 in position 0: invalid start byte
在导入csv文件中,出现如上所示的错误,经过查阅资料,解决方法如下: 方法一: pd.read_csv(file_path, encoding='unicode_escape') 方法二: pd.re ...
- mySql使用手册-官方文档
https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format oracle to_ ...
- vue-cli中跨域问题解决方法
webpack提供了配置代理的方法解决跨域 1 在vue-cli项目中打开webpack.dev.cof.js,如下 2 打开conifg目录下的index.js,在 proxyTable中进行配置 ...