线段树维护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个标记维护区间内奶牛个数,左端最长连续空位,右端最长连续空位,区间内最长连续空位,然后就没了。

最新文章

  1. Javascript图表插件HighCharts用法案例
  2. KnockOut.js入门示例详解
  3. javascript --- 子对象访问父对象的方式
  4. linux eclipse cdt make error 127
  5. php获取某年某月的天数 【转】
  6. K2 Blackpearl开发技术要点(Part1)
  7. Java从设计模式[本场比赛状态转换武器]状态分析(State)模式
  8. lucene建立索引的过程
  9. winform 如何加载Url图像(图像)
  10. 了解django部署(Django + Uwsgi + Nginx)
  11. RSA算法原理——(1)目前常见加密算法简介
  12. 我认知的javascript之作用域和闭包
  13. vue-cli项目生成
  14. github文件上传与下载
  15. windows server 2012 R2 远程桌面授权模式尚未配置
  16. Android 内存溢出解决方案(OOM) 整理总结&lt;转&gt;
  17. SpringBoot cookie工具类
  18. java去除字符串的空格,换行符,水平制表符,回车
  19. 一种管理z-index属性的方案
  20. Entity Framework表拆分

热门文章

  1. JAVA中关于并发的一些理解
  2. POJ1094[有向环 拓扑排序]
  3. java之多线程之一/序列化和反序列化
  4. domReady方法(dom加载完成执行回调)
  5. BZOJ 2190: [SDOI2008]仪仗队
  6. IE11下不能引入外部css的解决方法
  7. AASM rule of scoring sleep stages using EEG signal
  8. 微软职位内部推荐-Software Development Engineer
  9. 实验三 敏捷开发与XP实践
  10. 利用PowerShell+Jenkins,实现项目的自动化部署